From b0f6cc9c43e8b19478bfca02a7abf222b4f12b55 Mon Sep 17 00:00:00 2001 From: zhuam Date: Fri, 25 Dec 2015 17:52:15 +0800 Subject: [PATCH 1/3] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=20SQL=20=E6=9D=A1?= =?UTF-8?q?=E4=BB=B6=E7=9A=84=E5=88=86=E6=9E=90=EF=BC=8C=E7=94=A8=E4=BA=8E?= =?UTF-8?q?=20=E5=88=97=E5=80=BC/=E8=AE=BF=E9=97=AE=E6=AC=A1=E6=95=B0=20?= =?UTF-8?q?=20=E7=9A=84=E5=AE=9E=E6=97=B6=E7=BB=9F=E8=AE=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 支持设置规则 reload @@query_cf=表名&字段 支持清除规则 reload @@query_cf=NULL 支持 show @@sql.condition --- .../org/opencloudb/handler/ReloadHandler.java | 146 +- .../org/opencloudb/handler/ShowHandler.java | 436 +-- .../opencloudb/parser/ManagerParseReload.java | 392 +-- .../opencloudb/parser/ManagerParseShow.java | 2818 +++++++++-------- .../opencloudb/response/ReloadQueryCf.java | 32 + .../opencloudb/response/ShowSQLCondition.java | 115 + .../org/opencloudb/stat/HostStatAnalyzer.java | 16 + .../stat/QueryConditionAnalyzer.java | 214 ++ .../stat/QueryResultDispatcher.java | 127 +- 9 files changed, 2370 insertions(+), 1926 deletions(-) create mode 100644 src/main/java/org/opencloudb/response/ReloadQueryCf.java create mode 100644 src/main/java/org/opencloudb/response/ShowSQLCondition.java create mode 100644 src/main/java/org/opencloudb/stat/HostStatAnalyzer.java create mode 100644 src/main/java/org/opencloudb/stat/QueryConditionAnalyzer.java diff --git a/src/main/java/org/opencloudb/handler/ReloadHandler.java b/src/main/java/org/opencloudb/handler/ReloadHandler.java index 7981686e8..e90c6d3e6 100644 --- a/src/main/java/org/opencloudb/handler/ReloadHandler.java +++ b/src/main/java/org/opencloudb/handler/ReloadHandler.java @@ -1,70 +1,78 @@ -/* - * Copyright (c) 2013, OpenCloudDB/MyCAT and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software;Designed and Developed mainly by many Chinese - * opensource volunteers. you can redistribute it and/or modify it under the - * terms of the GNU General Public License version 2 only, as published by the - * Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Any questions about this component can be directed to it's project Web address - * https://code.google.com/p/opencloudb/. - * - */ -package org.opencloudb.handler; - -import org.opencloudb.config.ErrorCode; -import org.opencloudb.manager.ManagerConnection; -import org.opencloudb.parser.ManagerParseReload; -import org.opencloudb.parser.util.ParseUtil; -import org.opencloudb.response.ReloadConfig; -import org.opencloudb.response.ReloadSqlSlowTime; -import org.opencloudb.response.ReloadUser; -import org.opencloudb.response.ReloadUserStat; - -/** - * @author mycat - */ -public final class ReloadHandler -{ - - public static void handle(String stmt, ManagerConnection c, int offset) - { - int rs = ManagerParseReload.parse(stmt, offset); - switch (rs) - { - case ManagerParseReload.CONFIG: - ReloadConfig.execute(c,false); - break; - case ManagerParseReload.CONFIG_ALL: - ReloadConfig.execute(c,true); - break; - case ManagerParseReload.ROUTE: - c.writeErrMessage(ErrorCode.ER_YES, "Unsupported statement"); - break; - case ManagerParseReload.USER: - ReloadUser.execute(c); - break; - case ManagerParseReload.USER_STAT: - ReloadUserStat.execute(c); - break; - case ManagerParseReload.SQL_SLOW: - ReloadSqlSlowTime.execute(c,ParseUtil.getSQLId(stmt)); - break; - - default: - c.writeErrMessage(ErrorCode.ER_YES, "Unsupported statement"); - } - } - +/* + * Copyright (c) 2013, OpenCloudDB/MyCAT and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software;Designed and Developed mainly by many Chinese + * opensource volunteers. you can redistribute it and/or modify it under the + * terms of the GNU General Public License version 2 only, as published by the + * Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Any questions about this component can be directed to it's project Web address + * https://code.google.com/p/opencloudb/. + * + */ +package org.opencloudb.handler; + +import org.opencloudb.config.ErrorCode; +import org.opencloudb.manager.ManagerConnection; +import org.opencloudb.parser.ManagerParseReload; +import org.opencloudb.parser.util.ParseUtil; +import org.opencloudb.response.ReloadConfig; +import org.opencloudb.response.ReloadQueryCf; +import org.opencloudb.response.ReloadSqlSlowTime; +import org.opencloudb.response.ReloadUser; +import org.opencloudb.response.ReloadUserStat; + +/** + * @author mycat + */ +public final class ReloadHandler +{ + + public static void handle(String stmt, ManagerConnection c, int offset) + { + int rs = ManagerParseReload.parse(stmt, offset); + switch (rs) + { + case ManagerParseReload.CONFIG: + ReloadConfig.execute(c,false); + break; + case ManagerParseReload.CONFIG_ALL: + ReloadConfig.execute(c,true); + break; + case ManagerParseReload.ROUTE: + c.writeErrMessage(ErrorCode.ER_YES, "Unsupported statement"); + break; + case ManagerParseReload.USER: + ReloadUser.execute(c); + break; + case ManagerParseReload.USER_STAT: + ReloadUserStat.execute(c); + break; + case ManagerParseReload.SQL_SLOW: + ReloadSqlSlowTime.execute(c,ParseUtil.getSQLId(stmt)); + break; + case ManagerParseReload.QUERY_CF: + String dhAfter = "NULL"; + int dhOffset = stmt.indexOf('='); + if (dhOffset != -1 && stmt.length() > ++dhOffset) { + dhAfter = stmt.substring(dhOffset).trim(); + } + ReloadQueryCf.execute(c, dhAfter); + break; + default: + c.writeErrMessage(ErrorCode.ER_YES, "Unsupported statement"); + } + } + } \ No newline at end of file diff --git a/src/main/java/org/opencloudb/handler/ShowHandler.java b/src/main/java/org/opencloudb/handler/ShowHandler.java index 3d47f56de..562483202 100644 --- a/src/main/java/org/opencloudb/handler/ShowHandler.java +++ b/src/main/java/org/opencloudb/handler/ShowHandler.java @@ -1,217 +1,221 @@ -/* - * Copyright (c) 2013, OpenCloudDB/MyCAT and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software;Designed and Developed mainly by many Chinese - * opensource volunteers. you can redistribute it and/or modify it under the - * terms of the GNU General Public License version 2 only, as published by the - * Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Any questions about this component can be directed to it's project Web address - * https://code.google.com/p/opencloudb/. - * - */ -package org.opencloudb.handler; - -import org.opencloudb.config.ErrorCode; -import org.opencloudb.manager.ManagerConnection; -import org.opencloudb.parser.ManagerParseShow; -import org.opencloudb.parser.util.ParseUtil; -import org.opencloudb.response.ShowBackend; -import org.opencloudb.response.ShowCollation; -import org.opencloudb.response.ShowCommand; -import org.opencloudb.response.ShowConnection; -import org.opencloudb.response.ShowConnectionSQL; -import org.opencloudb.response.ShowDataNode; -import org.opencloudb.response.ShowDataSource; -import org.opencloudb.response.ShowDatabase; -import org.opencloudb.response.ShowDatasourceCluster; -import org.opencloudb.response.ShowDatasourceSyn; -import org.opencloudb.response.ShowDatasourceSynDetail; -import org.opencloudb.response.ShowHeartbeat; -import org.opencloudb.response.ShowHeartbeatDetail; -import org.opencloudb.response.ShowHelp; -import org.opencloudb.response.ShowParser; -import org.opencloudb.response.ShowProcessor; -import org.opencloudb.response.ShowRouter; -import org.opencloudb.response.ShowSQL; -import org.opencloudb.response.ShowSQLDetail; -import org.opencloudb.response.ShowSQLExecute; -import org.opencloudb.response.ShowSQLHigh; -import org.opencloudb.response.ShowSQLSlow; -import org.opencloudb.response.ShowSQLSumTable; -import org.opencloudb.response.ShowSQLSumUser; -import org.opencloudb.response.ShowServer; -import org.opencloudb.response.ShowSession; -import org.opencloudb.response.ShowSysLog; -import org.opencloudb.response.ShowSysParam; -import org.opencloudb.response.ShowThreadPool; -import org.opencloudb.response.ShowTime; -import org.opencloudb.response.ShowVariables; -import org.opencloudb.response.ShowVersion; -import org.opencloudb.util.StringUtil; - -/** - * @author mycat - */ -public final class ShowHandler { - - public static void handle(String stmt, ManagerConnection c, int offset) { - int rs = ManagerParseShow.parse(stmt, offset); - switch (rs & 0xff) { - case ManagerParseShow.SYSPARAM://add rainbow - ShowSysParam.execute(c); - break; - case ManagerParseShow.SYSLOG: //add by zhuam - String lines = stmt.substring(rs >>> 8).trim(); - ShowSysLog.execute(c, Integer.parseInt( lines ) ); - break; - case ManagerParseShow.COMMAND: - ShowCommand.execute(c); - break; - case ManagerParseShow.COLLATION: - ShowCollation.execute(c); - break; - case ManagerParseShow.CONNECTION: - ShowConnection.execute(c); - break; - case ManagerParseShow.BACKEND: - ShowBackend.execute(c); - break; - case ManagerParseShow.CONNECTION_SQL: - ShowConnectionSQL.execute(c); - break; - case ManagerParseShow.DATABASE: - ShowDatabase.execute(c); - break; - case ManagerParseShow.DATANODE: - ShowDataNode.execute(c, null); - break; - case ManagerParseShow.DATANODE_WHERE: { - String name = stmt.substring(rs >>> 8).trim(); - if (StringUtil.isEmpty(name)) { - c.writeErrMessage(ErrorCode.ER_YES, "Unsupported statement"); - } else { - ShowDataNode.execute(c, name); - } - break; - } - case ManagerParseShow.DATASOURCE: - ShowDataSource.execute(c, null); - break; - case ManagerParseShow.DATASOURCE_WHERE: { - String name = stmt.substring(rs >>> 8).trim(); - if (StringUtil.isEmpty(name)) { - c.writeErrMessage(ErrorCode.ER_YES, "Unsupported statement"); - } else { - ShowDataSource.execute(c, name); - } - break; - } - case ManagerParseShow.HELP: - ShowHelp.execute(c); - break; - case ManagerParseShow.HEARTBEAT: - ShowHeartbeat.response(c); - break; - case ManagerParseShow.PARSER: - ShowParser.execute(c); - break; - case ManagerParseShow.PROCESSOR: - ShowProcessor.execute(c); - break; - case ManagerParseShow.ROUTER: - ShowRouter.execute(c); - break; - case ManagerParseShow.SERVER: - ShowServer.execute(c); - break; - case ManagerParseShow.SQL: - ShowSQL.execute(c, ParseUtil.getSQLId(stmt)); - break; - case ManagerParseShow.SQL_DETAIL: - ShowSQLDetail.execute(c, ParseUtil.getSQLId(stmt)); - break; - case ManagerParseShow.SQL_EXECUTE: - ShowSQLExecute.execute(c); - break; - case ManagerParseShow.SQL_SLOW: - ShowSQLSlow.execute(c); - break; - case ManagerParseShow.SQL_HIGH: - ShowSQLHigh.execute(c); - break; - case ManagerParseShow.SQL_SUM_USER: - ShowSQLSumUser.execute(c); - break; - case ManagerParseShow.SQL_SUM_TABLE: - ShowSQLSumTable.execute(c); - break; - case ManagerParseShow.SLOW_DATANODE: { - String name = stmt.substring(rs >>> 8).trim(); - if (StringUtil.isEmpty(name)) { - c.writeErrMessage(ErrorCode.ER_YES, "Unsupported statement"); - } else { - // ShowSlow.dataNode(c, name); - c.writeErrMessage(ErrorCode.ER_YES, "Unsupported statement"); - } - break; - } - case ManagerParseShow.SLOW_SCHEMA: { - String name = stmt.substring(rs >>> 8).trim(); - if (StringUtil.isEmpty(name)) { - c.writeErrMessage(ErrorCode.ER_YES, "Unsupported statement"); - } else { - c.writeErrMessage(ErrorCode.ER_YES, "Unsupported statement"); - // ShowSlow.schema(c, name); - } - break; - } - case ManagerParseShow.THREADPOOL: - ShowThreadPool.execute(c); - break; - case ManagerParseShow.CACHE: - ShowCache.execute(c); - break; - case ManagerParseShow.SESSION: - ShowSession.execute(c); - break; - case ManagerParseShow.TIME_CURRENT: - ShowTime.execute(c, ManagerParseShow.TIME_CURRENT); - break; - case ManagerParseShow.TIME_STARTUP: - ShowTime.execute(c, ManagerParseShow.TIME_STARTUP); - break; - case ManagerParseShow.VARIABLES: - ShowVariables.execute(c); - break; - case ManagerParseShow.VERSION: - ShowVersion.execute(c); - break; - case ManagerParseShow.HEARTBEAT_DETAIL://by songwie - ShowHeartbeatDetail.response(c,stmt); - break; - case ManagerParseShow.DATASOURCE_SYNC://by songwie - ShowDatasourceSyn.response(c,stmt); - break; - case ManagerParseShow.DATASOURCE_SYNC_DETAIL://by songwie - ShowDatasourceSynDetail.response(c,stmt); - break; - case ManagerParseShow.DATASOURCE_CLUSTER://by songwie - ShowDatasourceCluster.response(c,stmt); - break; - default: - c.writeErrMessage(ErrorCode.ER_YES, "Unsupported statement"); - } - } +/* + * Copyright (c) 2013, OpenCloudDB/MyCAT and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software;Designed and Developed mainly by many Chinese + * opensource volunteers. you can redistribute it and/or modify it under the + * terms of the GNU General Public License version 2 only, as published by the + * Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Any questions about this component can be directed to it's project Web address + * https://code.google.com/p/opencloudb/. + * + */ +package org.opencloudb.handler; + +import org.opencloudb.config.ErrorCode; +import org.opencloudb.manager.ManagerConnection; +import org.opencloudb.parser.ManagerParseShow; +import org.opencloudb.parser.util.ParseUtil; +import org.opencloudb.response.ShowBackend; +import org.opencloudb.response.ShowCollation; +import org.opencloudb.response.ShowCommand; +import org.opencloudb.response.ShowConnection; +import org.opencloudb.response.ShowConnectionSQL; +import org.opencloudb.response.ShowDataNode; +import org.opencloudb.response.ShowDataSource; +import org.opencloudb.response.ShowDatabase; +import org.opencloudb.response.ShowDatasourceCluster; +import org.opencloudb.response.ShowDatasourceSyn; +import org.opencloudb.response.ShowDatasourceSynDetail; +import org.opencloudb.response.ShowHeartbeat; +import org.opencloudb.response.ShowHeartbeatDetail; +import org.opencloudb.response.ShowHelp; +import org.opencloudb.response.ShowParser; +import org.opencloudb.response.ShowProcessor; +import org.opencloudb.response.ShowRouter; +import org.opencloudb.response.ShowSQL; +import org.opencloudb.response.ShowSQLCondition; +import org.opencloudb.response.ShowSQLDetail; +import org.opencloudb.response.ShowSQLExecute; +import org.opencloudb.response.ShowSQLHigh; +import org.opencloudb.response.ShowSQLSlow; +import org.opencloudb.response.ShowSQLSumTable; +import org.opencloudb.response.ShowSQLSumUser; +import org.opencloudb.response.ShowServer; +import org.opencloudb.response.ShowSession; +import org.opencloudb.response.ShowSysLog; +import org.opencloudb.response.ShowSysParam; +import org.opencloudb.response.ShowThreadPool; +import org.opencloudb.response.ShowTime; +import org.opencloudb.response.ShowVariables; +import org.opencloudb.response.ShowVersion; +import org.opencloudb.util.StringUtil; + +/** + * @author mycat + */ +public final class ShowHandler { + + public static void handle(String stmt, ManagerConnection c, int offset) { + int rs = ManagerParseShow.parse(stmt, offset); + switch (rs & 0xff) { + case ManagerParseShow.SYSPARAM://add rainbow + ShowSysParam.execute(c); + break; + case ManagerParseShow.SYSLOG: //add by zhuam + String lines = stmt.substring(rs >>> 8).trim(); + ShowSysLog.execute(c, Integer.parseInt( lines ) ); + break; + case ManagerParseShow.COMMAND: + ShowCommand.execute(c); + break; + case ManagerParseShow.COLLATION: + ShowCollation.execute(c); + break; + case ManagerParseShow.CONNECTION: + ShowConnection.execute(c); + break; + case ManagerParseShow.BACKEND: + ShowBackend.execute(c); + break; + case ManagerParseShow.CONNECTION_SQL: + ShowConnectionSQL.execute(c); + break; + case ManagerParseShow.DATABASE: + ShowDatabase.execute(c); + break; + case ManagerParseShow.DATANODE: + ShowDataNode.execute(c, null); + break; + case ManagerParseShow.DATANODE_WHERE: { + String name = stmt.substring(rs >>> 8).trim(); + if (StringUtil.isEmpty(name)) { + c.writeErrMessage(ErrorCode.ER_YES, "Unsupported statement"); + } else { + ShowDataNode.execute(c, name); + } + break; + } + case ManagerParseShow.DATASOURCE: + ShowDataSource.execute(c, null); + break; + case ManagerParseShow.DATASOURCE_WHERE: { + String name = stmt.substring(rs >>> 8).trim(); + if (StringUtil.isEmpty(name)) { + c.writeErrMessage(ErrorCode.ER_YES, "Unsupported statement"); + } else { + ShowDataSource.execute(c, name); + } + break; + } + case ManagerParseShow.HELP: + ShowHelp.execute(c); + break; + case ManagerParseShow.HEARTBEAT: + ShowHeartbeat.response(c); + break; + case ManagerParseShow.PARSER: + ShowParser.execute(c); + break; + case ManagerParseShow.PROCESSOR: + ShowProcessor.execute(c); + break; + case ManagerParseShow.ROUTER: + ShowRouter.execute(c); + break; + case ManagerParseShow.SERVER: + ShowServer.execute(c); + break; + case ManagerParseShow.SQL: + ShowSQL.execute(c, ParseUtil.getSQLId(stmt)); + break; + case ManagerParseShow.SQL_DETAIL: + ShowSQLDetail.execute(c, ParseUtil.getSQLId(stmt)); + break; + case ManagerParseShow.SQL_EXECUTE: + ShowSQLExecute.execute(c); + break; + case ManagerParseShow.SQL_SLOW: + ShowSQLSlow.execute(c); + break; + case ManagerParseShow.SQL_HIGH: + ShowSQLHigh.execute(c); + break; + case ManagerParseShow.SQL_CONDITION: + ShowSQLCondition.execute(c); + break; + case ManagerParseShow.SQL_SUM_USER: + ShowSQLSumUser.execute(c); + break; + case ManagerParseShow.SQL_SUM_TABLE: + ShowSQLSumTable.execute(c); + break; + case ManagerParseShow.SLOW_DATANODE: { + String name = stmt.substring(rs >>> 8).trim(); + if (StringUtil.isEmpty(name)) { + c.writeErrMessage(ErrorCode.ER_YES, "Unsupported statement"); + } else { + // ShowSlow.dataNode(c, name); + c.writeErrMessage(ErrorCode.ER_YES, "Unsupported statement"); + } + break; + } + case ManagerParseShow.SLOW_SCHEMA: { + String name = stmt.substring(rs >>> 8).trim(); + if (StringUtil.isEmpty(name)) { + c.writeErrMessage(ErrorCode.ER_YES, "Unsupported statement"); + } else { + c.writeErrMessage(ErrorCode.ER_YES, "Unsupported statement"); + // ShowSlow.schema(c, name); + } + break; + } + case ManagerParseShow.THREADPOOL: + ShowThreadPool.execute(c); + break; + case ManagerParseShow.CACHE: + ShowCache.execute(c); + break; + case ManagerParseShow.SESSION: + ShowSession.execute(c); + break; + case ManagerParseShow.TIME_CURRENT: + ShowTime.execute(c, ManagerParseShow.TIME_CURRENT); + break; + case ManagerParseShow.TIME_STARTUP: + ShowTime.execute(c, ManagerParseShow.TIME_STARTUP); + break; + case ManagerParseShow.VARIABLES: + ShowVariables.execute(c); + break; + case ManagerParseShow.VERSION: + ShowVersion.execute(c); + break; + case ManagerParseShow.HEARTBEAT_DETAIL://by songwie + ShowHeartbeatDetail.response(c,stmt); + break; + case ManagerParseShow.DATASOURCE_SYNC://by songwie + ShowDatasourceSyn.response(c,stmt); + break; + case ManagerParseShow.DATASOURCE_SYNC_DETAIL://by songwie + ShowDatasourceSynDetail.response(c,stmt); + break; + case ManagerParseShow.DATASOURCE_CLUSTER://by songwie + ShowDatasourceCluster.response(c,stmt); + break; + default: + c.writeErrMessage(ErrorCode.ER_YES, "Unsupported statement"); + } + } } \ No newline at end of file diff --git a/src/main/java/org/opencloudb/parser/ManagerParseReload.java b/src/main/java/org/opencloudb/parser/ManagerParseReload.java index d57a8f73f..067edc7e9 100644 --- a/src/main/java/org/opencloudb/parser/ManagerParseReload.java +++ b/src/main/java/org/opencloudb/parser/ManagerParseReload.java @@ -1,184 +1,210 @@ -/* - * Copyright (c) 2013, OpenCloudDB/MyCAT and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software;Designed and Developed mainly by many Chinese - * opensource volunteers. you can redistribute it and/or modify it under the - * terms of the GNU General Public License version 2 only, as published by the - * Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Any questions about this component can be directed to it's project Web address - * https://code.google.com/p/opencloudb/. - * - */ -package org.opencloudb.parser; - -import org.opencloudb.parser.util.ParseUtil; - -/** - * @author mycat - */ -public final class ManagerParseReload { - - public static final int OTHER = -1; - public static final int CONFIG = 1; - public static final int ROUTE = 2; - public static final int USER = 3; - public static final int USER_STAT = 4; - public static final int CONFIG_ALL = 5; - public static final int SQL_SLOW = 6; - public static int parse(String stmt, int offset) { - int i = offset; - for (; i < stmt.length(); i++) { - switch (stmt.charAt(i)) { - case ' ': - continue; - case '/': - case '#': - i = ParseUtil.comment(stmt, i); - continue; - case '@': - return reload2Check(stmt, i); - default: - return OTHER; - } - } - return OTHER; - } - - static int reload2Check(String stmt, int offset) { - if (stmt.length() > ++offset && stmt.charAt(offset) == '@') { - if (stmt.length() > ++offset) { - switch (stmt.charAt(offset)) { - case 'C': - case 'c': - return reload2CCheck(stmt, offset); - case 'R': - case 'r': - return reload2RCheck(stmt, offset); - case 'U': - case 'u': - return reload2UCheck(stmt, offset); - case 'S': - case 's': - return reload2SCheck(stmt, offset); - default: - return OTHER; - } - } - } - return OTHER; - } - - // RELOAD @@CONFIG - static int reload2CCheck(String stmt, int offset) { - if (stmt.length() > offset + 5) { - char c1 = stmt.charAt(++offset); - char c2 = stmt.charAt(++offset); - char c3 = stmt.charAt(++offset); - char c4 = stmt.charAt(++offset); - char c5 = stmt.charAt(++offset); - if ((c1 == 'O' || c1 == 'o') && (c2 == 'N' || c2 == 'n') && (c3 == 'F' || c3 == 'f') - && (c4 == 'I' || c4 == 'i') && (c5 == 'G' || c5 == 'g')) { - if (stmt.length() > offset + 4) - { - char c6 = stmt.charAt(++offset); - char c7 = stmt.charAt(++offset); - char c8 = stmt.charAt(++offset); - char c9 = stmt.charAt(++offset); - if ((c6 == '_' || c6 == '-') && (c7 == 'A' || c7 == 'a') && (c8 == 'L' || c8 == 'l') - && (c9 == 'L' || c9 == 'l') ) { - return CONFIG_ALL; - } - } - if (stmt.length() > ++offset && stmt.charAt(offset) != ' ') { - return OTHER; - } - - return CONFIG; - } - } - return OTHER; - } - - // RELOAD @@ROUTE - static int reload2RCheck(String stmt, int offset) { - if (stmt.length() > offset + 4) { - char c1 = stmt.charAt(++offset); - char c2 = stmt.charAt(++offset); - char c3 = stmt.charAt(++offset); - char c4 = stmt.charAt(++offset); - if ((c1 == 'O' || c1 == 'o') && (c2 == 'U' || c2 == 'u') && (c3 == 'T' || c3 == 't') - && (c4 == 'E' || c4 == 'e')) { - if (stmt.length() > ++offset && stmt.charAt(offset) != ' ') { - return OTHER; - } - return ROUTE; - } - } - return OTHER; - } - - // RELOAD @@USER - static int reload2UCheck(String stmt, int offset) { - if (stmt.length() > offset + 3) { - char c1 = stmt.charAt(++offset); - char c2 = stmt.charAt(++offset); - char c3 = stmt.charAt(++offset); - if ((c1 == 'S' || c1 == 's') && (c2 == 'E' || c2 == 'e') && (c3 == 'R' || c3 == 'r')) { - - - if (stmt.length() > offset + 5) - { - char c6 = stmt.charAt(++offset); - char c7 = stmt.charAt(++offset); - char c8 = stmt.charAt(++offset); - char c9 = stmt.charAt(++offset); - char c10 = stmt.charAt(++offset); - - if ((c6 == '_' || c6 == '-') && (c7 == 'S' || c7 == 's') && (c8 == 'T' || c8 == 't') - && (c9 == 'A' || c9 == 'a') && (c10 == 'T' || c10 == 't') ) { - return USER_STAT; - } - } - - if (stmt.length() > ++offset && stmt.charAt(offset) != ' ') { - return OTHER; - } - return USER; - } - } - return OTHER; - } - - // RELOAD @@SQL - static int reload2SCheck(String stmt, int offset) { - if (stmt.length() > offset + 4) { - char c1 = stmt.charAt(++offset); - char c2 = stmt.charAt(++offset); - char c3 = stmt.charAt(++offset); - char c4 = stmt.charAt(++offset); - char c5 = stmt.charAt(++offset); - char c6 = stmt.charAt(++offset); - if ((c1 == 'Q' || c1 == 'q') && (c2 == 'L' || c2 == 'l') && (c3 == 's' || c3 == 'S') - && (c4 == 'L' || c4 == 'l') && (c5 == 'O' || c5 == 'o') && (c6 == 'W' || c6 == 'w') ) { - if (stmt.length() > ++offset && stmt.charAt(offset) != ' ') { - return SQL_SLOW ; - } - return OTHER; - } - } - return OTHER; - } - +/* + * Copyright (c) 2013, OpenCloudDB/MyCAT and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software;Designed and Developed mainly by many Chinese + * opensource volunteers. you can redistribute it and/or modify it under the + * terms of the GNU General Public License version 2 only, as published by the + * Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Any questions about this component can be directed to it's project Web address + * https://code.google.com/p/opencloudb/. + * + */ +package org.opencloudb.parser; + +import org.opencloudb.parser.util.ParseUtil; + +/** + * @author mycat + */ +public final class ManagerParseReload { + + public static final int OTHER = -1; + public static final int CONFIG = 1; + public static final int ROUTE = 2; + public static final int USER = 3; + public static final int USER_STAT = 4; + public static final int CONFIG_ALL = 5; + public static final int SQL_SLOW = 6; + public static final int QUERY_CF = 7; + + public static int parse(String stmt, int offset) { + int i = offset; + for (; i < stmt.length(); i++) { + switch (stmt.charAt(i)) { + case ' ': + continue; + case '/': + case '#': + i = ParseUtil.comment(stmt, i); + continue; + case '@': + return reload2Check(stmt, i); + default: + return OTHER; + } + } + return OTHER; + } + + static int reload2Check(String stmt, int offset) { + if (stmt.length() > ++offset && stmt.charAt(offset) == '@') { + if (stmt.length() > ++offset) { + switch (stmt.charAt(offset)) { + case 'C': + case 'c': + return reload2CCheck(stmt, offset); + case 'R': + case 'r': + return reload2RCheck(stmt, offset); + case 'U': + case 'u': + return reload2UCheck(stmt, offset); + case 'S': + case 's': + return reload2SCheck(stmt, offset); + case 'Q': + case 'q': + return reload2QCheck(stmt, offset); + default: + return OTHER; + } + } + } + return OTHER; + } + + // RELOAD @@CONFIG + static int reload2CCheck(String stmt, int offset) { + if (stmt.length() > offset + 5) { + char c1 = stmt.charAt(++offset); + char c2 = stmt.charAt(++offset); + char c3 = stmt.charAt(++offset); + char c4 = stmt.charAt(++offset); + char c5 = stmt.charAt(++offset); + if ((c1 == 'O' || c1 == 'o') && (c2 == 'N' || c2 == 'n') && (c3 == 'F' || c3 == 'f') + && (c4 == 'I' || c4 == 'i') && (c5 == 'G' || c5 == 'g')) { + if (stmt.length() > offset + 4) + { + char c6 = stmt.charAt(++offset); + char c7 = stmt.charAt(++offset); + char c8 = stmt.charAt(++offset); + char c9 = stmt.charAt(++offset); + if ((c6 == '_' || c6 == '-') && (c7 == 'A' || c7 == 'a') && (c8 == 'L' || c8 == 'l') + && (c9 == 'L' || c9 == 'l') ) { + return CONFIG_ALL; + } + } + if (stmt.length() > ++offset && stmt.charAt(offset) != ' ') { + return OTHER; + } + + return CONFIG; + } + } + return OTHER; + } + + // RELOAD @@ROUTE + static int reload2RCheck(String stmt, int offset) { + if (stmt.length() > offset + 4) { + char c1 = stmt.charAt(++offset); + char c2 = stmt.charAt(++offset); + char c3 = stmt.charAt(++offset); + char c4 = stmt.charAt(++offset); + if ((c1 == 'O' || c1 == 'o') && (c2 == 'U' || c2 == 'u') && (c3 == 'T' || c3 == 't') + && (c4 == 'E' || c4 == 'e')) { + if (stmt.length() > ++offset && stmt.charAt(offset) != ' ') { + return OTHER; + } + return ROUTE; + } + } + return OTHER; + } + + // RELOAD @@USER + static int reload2UCheck(String stmt, int offset) { + if (stmt.length() > offset + 3) { + char c1 = stmt.charAt(++offset); + char c2 = stmt.charAt(++offset); + char c3 = stmt.charAt(++offset); + if ((c1 == 'S' || c1 == 's') && (c2 == 'E' || c2 == 'e') && (c3 == 'R' || c3 == 'r')) { + + + if (stmt.length() > offset + 5) + { + char c6 = stmt.charAt(++offset); + char c7 = stmt.charAt(++offset); + char c8 = stmt.charAt(++offset); + char c9 = stmt.charAt(++offset); + char c10 = stmt.charAt(++offset); + + if ((c6 == '_' || c6 == '-') && (c7 == 'S' || c7 == 's') && (c8 == 'T' || c8 == 't') + && (c9 == 'A' || c9 == 'a') && (c10 == 'T' || c10 == 't') ) { + return USER_STAT; + } + } + + if (stmt.length() > ++offset && stmt.charAt(offset) != ' ') { + return OTHER; + } + return USER; + } + } + return OTHER; + } + + // RELOAD @@SQL + static int reload2SCheck(String stmt, int offset) { + if (stmt.length() > offset + 4) { + char c1 = stmt.charAt(++offset); + char c2 = stmt.charAt(++offset); + char c3 = stmt.charAt(++offset); + char c4 = stmt.charAt(++offset); + char c5 = stmt.charAt(++offset); + char c6 = stmt.charAt(++offset); + if ((c1 == 'Q' || c1 == 'q') && (c2 == 'L' || c2 == 'l') && (c3 == 's' || c3 == 'S') + && (c4 == 'L' || c4 == 'l') && (c5 == 'O' || c5 == 'o') && (c6 == 'W' || c6 == 'w') ) { + if (stmt.length() > ++offset && stmt.charAt(offset) != ' ') { + return SQL_SLOW ; + } + return OTHER; + } + } + return OTHER; + } + + // RELOAD @@QUERY + static int reload2QCheck(String stmt, int offset) { + if (stmt.length() > offset + 4) { + char c1 = stmt.charAt(++offset); + char c2 = stmt.charAt(++offset); + char c3 = stmt.charAt(++offset); + char c4 = stmt.charAt(++offset); + char c5 = stmt.charAt(++offset); + char c6 = stmt.charAt(++offset); + char c7 = stmt.charAt(++offset); + + if ((c1 == 'U' || c1 == 'u') && (c2 == 'E' || c2 == 'e') && (c3 == 'R' || c3 == 'r') + && (c4 == 'Y' || c4 == 'y') && (c5 == '_' ) && (c6 == 'C' || c6 == 'c') && (c7 == 'F' || c7 == 'f') ) { + if (stmt.length() > ++offset && stmt.charAt(offset) != ' ') { + return QUERY_CF ; + } + return OTHER; + } + } + return OTHER; + } } \ No newline at end of file diff --git a/src/main/java/org/opencloudb/parser/ManagerParseShow.java b/src/main/java/org/opencloudb/parser/ManagerParseShow.java index c25ac9bd9..4a7d8de14 100644 --- a/src/main/java/org/opencloudb/parser/ManagerParseShow.java +++ b/src/main/java/org/opencloudb/parser/ManagerParseShow.java @@ -1,1396 +1,1424 @@ -/* - * Copyright (c) 2013, OpenCloudDB/MyCAT and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software;Designed and Developed mainly by many Chinese - * opensource volunteers. you can redistribute it and/or modify it under the - * terms of the GNU General Public License version 2 only, as published by the - * Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Any questions about this component can be directed to it's project Web address - * https://code.google.com/p/opencloudb/. - * - */ -package org.opencloudb.parser; - -import org.opencloudb.parser.util.ParseUtil; - -/** - * @author mycat - */ -public final class ManagerParseShow { - - public static final int OTHER = -1; - public static final int COMMAND = 1; - public static final int CONNECTION = 2; - public static final int DATABASE = 3; - public static final int DATANODE = 4; - public static final int DATASOURCE = 5; - public static final int HELP = 6; - public static final int PARSER = 7; - public static final int PROCESSOR = 8; - public static final int ROUTER = 9; - public static final int SERVER = 10; - public static final int SQL = 11; - public static final int SQL_DETAIL = 12; - public static final int SQL_EXECUTE = 13; - public static final int SQL_SLOW = 14; - public static final int SQL_SUM_USER = 15; - public static final int SQL_SUM_TABLE = 16; - public static final int SQL_HIGH = 17; - - public static final int THREADPOOL = 18; - public static final int TIME_CURRENT = 19; - public static final int TIME_STARTUP = 20; - public static final int VERSION = 21; - public static final int VARIABLES = 22; - public static final int COLLATION = 23; - public static final int CONNECTION_SQL = 24; - public static final int DATANODE_WHERE = 25; - public static final int DATASOURCE_WHERE = 26; - public static final int HEARTBEAT = 27; - public static final int SLOW_DATANODE = 28; - public static final int SLOW_SCHEMA = 29; - public static final int BACKEND = 30; - public static final int CACHE = 31; - public static final int SESSION = 32; - public static final int SYSPARAM = 33; - public static final int SYSLOG = 34; - public static final int HEARTBEAT_DETAIL = 35; - public static final int DATASOURCE_SYNC = 36; - public static final int DATASOURCE_SYNC_DETAIL = 37; - public static final int DATASOURCE_CLUSTER = 38; - - - public static int parse(String stmt, int offset) { - int i = offset; - for (; i < stmt.length(); i++) { - switch (stmt.charAt(i)) { - case ' ': - continue; - case '/': - case '#': - i = ParseUtil.comment(stmt, i); - continue; - case '@': - return show2Check(stmt, i); - case 'C': - case 'c': - return showCCheck(stmt, i); - case 'd': - case 'D': - return show2DCheck(stmt, i); - case 'V': - case 'v': - return showVCheck(stmt, i); - default: - return OTHER; - } - } - return OTHER; - } - - // SHOW @ - static int show2Check(String stmt, int offset) { - if (stmt.length() > ++offset && stmt.charAt(offset) == '@') { - if (stmt.length() > ++offset) { - switch (stmt.charAt(offset)) { - case 'B': - case 'b': - return show2BCheck(stmt, offset); - case 'C': - case 'c': - return show2CCheck(stmt, offset); - case 'D': - case 'd': - return show2DCheck(stmt, offset); - case 'H': - case 'h': - return show2HCheck(stmt, offset); - case 'P': - case 'p': - return show2PCheck(stmt, offset); - case 'R': - case 'r': - return show2RCheck(stmt, offset); - case 'S': - case 's': - return show2SCheck(stmt, offset); - case 'T': - case 't': - return show2TCheck(stmt, offset); - case 'V': - case 'v': - return show2VCheck(stmt, offset); - default: - return OTHER; - } - } - } - return OTHER; - } - - // SHOW COLLATION - static int showCCheck(String stmt, int offset) { - if (stmt.length() > offset + "OLLATION".length()) { - char c1 = stmt.charAt(++offset); - char c2 = stmt.charAt(++offset); - char c3 = stmt.charAt(++offset); - char c4 = stmt.charAt(++offset); - char c5 = stmt.charAt(++offset); - char c6 = stmt.charAt(++offset); - char c7 = stmt.charAt(++offset); - char c8 = stmt.charAt(++offset); - if ((c1 == 'O' || c1 == 'o') && (c2 == 'L' || c2 == 'l') && (c3 == 'L' || c3 == 'l') - && (c4 == 'A' || c4 == 'a') && (c5 == 'T' || c5 == 't') && (c6 == 'I' || c6 == 'i') - && (c7 == 'O' || c7 == 'o') && (c8 == 'N' || c8 == 'n')) { - if (stmt.length() > ++offset && stmt.charAt(offset) != ' ') { - return OTHER; - } - return COLLATION; - } - } - return OTHER; - } - - // SHOW VARIABLES - static int showVCheck(String stmt, int offset) { - if (stmt.length() > offset + "ARIABLES".length()) { - char c1 = stmt.charAt(++offset); - char c2 = stmt.charAt(++offset); - char c3 = stmt.charAt(++offset); - char c4 = stmt.charAt(++offset); - char c5 = stmt.charAt(++offset); - char c6 = stmt.charAt(++offset); - char c7 = stmt.charAt(++offset); - char c8 = stmt.charAt(++offset); - if ((c1 == 'A' || c1 == 'a') && (c2 == 'R' || c2 == 'r') && (c3 == 'I' || c3 == 'i') - && (c4 == 'A' || c4 == 'a') && (c5 == 'B' || c5 == 'b') && (c6 == 'L' || c6 == 'l') - && (c7 == 'E' || c7 == 'e') && (c8 == 'S' || c8 == 's')) { - if (stmt.length() > ++offset && stmt.charAt(offset) != ' ') { - return OTHER; - } - return VARIABLES; - } - } - return OTHER; - } - - // SHOW @@BACKEND - static int show2BCheck(String stmt, int offset) { - if (stmt.length() > offset + "ACKEND".length()) { - char c1 = stmt.charAt(++offset); - char c2 = stmt.charAt(++offset); - char c3 = stmt.charAt(++offset); - char c4 = stmt.charAt(++offset); - char c5 = stmt.charAt(++offset); - char c6 = stmt.charAt(++offset); - if ((c1 == 'A' || c1 == 'a') && (c2 == 'C' || c2 == 'c') && (c3 == 'K' || c3 == 'k') - && (c4 == 'E' || c4 == 'e') && (c5 == 'N' || c5 == 'n') && (c6 == 'D' || c6 == 'd') - && (stmt.length() == ++offset || ParseUtil.isEOF(stmt.charAt(offset)))) { - return BACKEND; - } - } - return OTHER; - } - - // SHOW @@C - static int show2CCheck(String stmt, int offset) { - if (stmt.length() > ++offset) { - switch (stmt.charAt(offset)) { - case 'O': - case 'o': - return show2CoCheck(stmt, offset); - case 'A': - case 'a': - return show2CACheck(stmt, offset); - default: - return OTHER; - } - } - return OTHER; - } - // SHOW @@CACHE - private static int show2CACheck(String stmt, int offset) { - String remain=stmt.substring(offset); - if(remain.equalsIgnoreCase("ACHE")) - { - return CACHE; - } - return OTHER; - } - - // SHOW @@DATA - static int show2DCheck(String stmt, int offset) { - if (stmt.length() > offset + "ATA".length()) { - char c1 = stmt.charAt(++offset); - char c2 = stmt.charAt(++offset); - char c3 = stmt.charAt(++offset); - if ((c1 == 'A' || c1 == 'a') && (c2 == 'T' || c2 == 't') && (c3 == 'A' || c3 == 'a')) { - if (stmt.length() > ++offset) { - switch (stmt.charAt(offset)) { - case 'B': - case 'b': - return show2DataBCheck(stmt, offset); - case 'N': - case 'n': - return show2DataNCheck(stmt, offset); - case 'S': - case 's': - return show2DataSCheck(stmt, offset); - default: - return OTHER; - } - } - } - } - return OTHER; - } - // SHOW @@DataSyn - static int show2DataSynCheck(String stmt, int offset) { - if (stmt.length() > ++offset) { - switch (stmt.charAt(offset)) { - case 'S': - case 's': - if (stmt.length() > offset + "yn".length()) { - char c1 = stmt.charAt(++offset); - char c2 = stmt.charAt(++offset); - if ((c1 == 'Y' || c1 == 'y') && (c2 == 'N' || c2 == 'n')){ - switch (stmt.charAt(++offset)) { - case 'S': - case 's': - return show2SynStatuslCheck(stmt,offset); - case 'D': - case 'd': - return show2SynDetailCheck(stmt,offset); - default: - return OTHER; - } - - }else{ - return OTHER; - } - } - case 'C': - case 'c': - if (stmt.length() > offset + "luster".length()) { - char c1 = stmt.charAt(++offset); - char c2 = stmt.charAt(++offset); - char c3 = stmt.charAt(++offset); - char c4 = stmt.charAt(++offset); - char c5 = stmt.charAt(++offset); - char c6 = stmt.charAt(++offset); - if ((c1 == 'L' || c1 == 'l') && (c2 == 'U' || c2 == 'u') - && (c3 == 'S' || c3 == 's') && (c4 == 'T' || c4 == 't') - && (c5 == 'E' || c5 == 'e')&& (c6 == 'R' || c6 == 'r') ){ - return DATASOURCE_CLUSTER; - }else{ - return OTHER; - } - } - default: - return OTHER; - } - } - return OTHER; - } - //show @@datasource.syndetail - static int show2SynDetailCheck(String stmt, int offset) { - if (stmt.length() > offset + "etail".length()) { - char c1 = stmt.charAt(++offset); - char c2 = stmt.charAt(++offset); - char c3 = stmt.charAt(++offset); - char c4 = stmt.charAt(++offset); - char c5 = stmt.charAt(++offset); - - if ((c1 == 'E' || c1 == 'e') && (c2 == 'T' || c2 == 't') && (c3 == 'A' || c3 == 'a') - && (c4 == 'I' || c4 == 'i') && (c5 == 'L' || c5 == 'l')) { - if (stmt.length() > ++offset && stmt.charAt(offset) != ' ') { - return OTHER; - } - return DATASOURCE_SYNC_DETAIL; - } - } - return OTHER; - } - //show @@datasource.synstatus - static int show2SynStatuslCheck(String stmt, int offset) { - if (stmt.length() > offset + "tatus".length()) { - char c1 = stmt.charAt(++offset); - char c2 = stmt.charAt(++offset); - char c3 = stmt.charAt(++offset); - char c4 = stmt.charAt(++offset); - char c5 = stmt.charAt(++offset); - - if ((c1 == 'T' || c1 == 't') && (c2 == 'A' || c2 == 'a') && (c3 == 'T' || c3 == 't') - && (c4 == 'U' || c4 == 'u') && (c5 == 'S' || c5 == 's')) { - if (stmt.length() > ++offset && stmt.charAt(offset) != ' ') { - return OTHER; - } - return DATASOURCE_SYNC; - } - } - return OTHER; - } - - // SHOW @@HELP - static int show2HCheck(String stmt, int offset) { - if (stmt.length() > ++offset) { - switch (stmt.charAt(offset)) { - case 'E': - case 'e': - return show2HeCheck(stmt, offset); - default: - return OTHER; - } - } - return OTHER; - } - - // SHOW @@HE - static int show2HeCheck(String stmt, int offset) { - if (stmt.length() > ++offset) { - switch (stmt.charAt(offset)) { - case 'L': - case 'l': - return show2HelCheck(stmt, offset); - case 'A': - case 'a': - return ManagerParseHeartbeat.show2HeaCheck(stmt, offset); - default: - return OTHER; - } - } - return OTHER; - } - - // SHOW @@HELP - static int show2HelCheck(String stmt, int offset) { - if (stmt.length() > offset + "P".length()) { - char c1 = stmt.charAt(++offset); - if ((c1 == 'P' || c1 == 'p')) { - if (stmt.length() > ++offset && stmt.charAt(offset) != ' ') { - return OTHER; - } - return HELP; - } - } - return OTHER; - } - - - - // SHOW @@P - static int show2PCheck(String stmt, int offset) { - if (stmt.length() > ++offset) { - switch (stmt.charAt(offset)) { - case 'A': - case 'a': - return show2PaCheck(stmt, offset); - case 'R': - case 'r': - return show2PrCheck(stmt, offset); - default: - return OTHER; - } - } - return OTHER; - } - - // SHOW @@ROUTER - static int show2RCheck(String stmt, int offset) { - if (stmt.length() > offset + "OUTER".length()) { - char c1 = stmt.charAt(++offset); - char c2 = stmt.charAt(++offset); - char c3 = stmt.charAt(++offset); - char c4 = stmt.charAt(++offset); - char c5 = stmt.charAt(++offset); - if ((c1 == 'O' || c1 == 'o') && (c2 == 'U' || c2 == 'u') && (c3 == 'T' || c3 == 't') - && (c4 == 'E' || c4 == 'e') && (c5 == 'R' || c5 == 'r')) { - if (stmt.length() > ++offset && stmt.charAt(offset) != ' ') { - return OTHER; - } - return ROUTER; - } - } - return OTHER; - } - - // SHOW @@S - static int show2SCheck(String stmt, int offset) { - if (stmt.length() > ++offset) { - switch (stmt.charAt(offset)) { - case 'E': - case 'e': - return show2SeCheck(stmt, offset); - case 'Q': - case 'q': - return show2SqCheck(stmt, offset); - case 'L': - case 'l': - return show2SlCheck(stmt, offset); - case 'Y': - case 'y': - return show2SyCheck(stmt, offset); - default: - return OTHER; - } - } - return OTHER; - } - - // SHOW @@SLOW - static int show2SlCheck(String stmt, int offset) { - if (stmt.length() > offset + "OW ".length()) { - char c1 = stmt.charAt(++offset); - char c2 = stmt.charAt(++offset); - char c3 = stmt.charAt(++offset); - if ((c1 == 'O' || c1 == 'o') && (c2 == 'W' || c2 == 'w') && c3 == ' ') { - while (stmt.length() > ++offset) { - switch (stmt.charAt(offset)) { - case ' ': - continue; - case 'W': - case 'w': - return show2SlowWhereCheck(stmt, offset); - default: - return OTHER; - } - } - } - } - return OTHER; - } - - // SHOW @@SYSPARAM - static int show2sysparam(String stmt, int offset) { - if (stmt.length() > offset + "ARAM".length()) { - char c1 = stmt.charAt(++offset); - char c2 = stmt.charAt(++offset); - char c3 = stmt.charAt(++offset); - char c4 = stmt.charAt(++offset); - - if ((c1 == 'A' || c1 == 'a') && (c2 == 'R' || c2 == 'r') - && (c3 == 'A' || c3 == 'a') && (c4 == 'M' || c4 == 'm')) { - if (stmt.length() > ++offset && stmt.charAt(offset) != ' ') { - return OTHER; - } - return SYSPARAM; - } - } - return OTHER; - } - - static int show2syslog(String stmt, int offset) { - - if (stmt.length() > offset + "SLOG".length()) { - - char c1 = stmt.charAt(++offset); - char c2 = stmt.charAt(++offset); - char c3 = stmt.charAt(++offset); - - if ( (c1 == 'O' || c1 == 'o') && (c2 == 'G' || c2 == 'g') && c3 == ' ' ) { - - char c4 = stmt.charAt(++offset); - char c5 = stmt.charAt(++offset); - char c6 = stmt.charAt(++offset); - char c7 = stmt.charAt(++offset); - char c8 = stmt.charAt(++offset); - - if ((c4 == 'L' || c4 == 'l') && (c5 == 'I' || c5 == 'i') && (c6 == 'M' || c6 == 'm') - && (c7 == 'I' || c7 == 'i') && (c8 == 'T' || c8 == 't') ) { - - while (stmt.length() > ++offset) { - switch (stmt.charAt(offset)) { - case ' ': - continue; - case '=': - while (stmt.length() > ++offset) { - switch (stmt.charAt(offset)) { - case ' ': - continue; - default: - return (offset << 8) | SYSLOG; - } - } - return OTHER; - default: - return OTHER; - } - } - } - - return SYSLOG; - } - } - - return OTHER; - } - - // SHOW @@SYSPARAM - // SHOW @@SYSLOG LIMIT=1000 - static int show2SyCheck(String stmt, int offset) { - - if (stmt.length() > offset + "YS".length()) { - char c1 = stmt.charAt(++offset); - char c2 = stmt.charAt(++offset); - if ( c1 == 'S' || c1 == 's' ) { - switch (c2) { - case 'L': - case 'l': - return show2syslog(stmt, offset); - case 'P': - case 'p': - return show2sysparam(stmt, offset); - default: - return OTHER; - } - } - } - return OTHER; - } - - - - // SHOW @@SLOW WHERE - static int show2SlowWhereCheck(String stmt, int offset) { - if (stmt.length() > offset + "HERE".length()) { - char c1 = stmt.charAt(++offset); - char c2 = stmt.charAt(++offset); - char c3 = stmt.charAt(++offset); - char c4 = stmt.charAt(++offset); - if ((c1 == 'H' || c1 == 'h') && (c2 == 'E' || c2 == 'e') && (c3 == 'R' || c3 == 'r') - && (c4 == 'E' || c4 == 'e')) { - while (stmt.length() > ++offset) { - switch (stmt.charAt(offset)) { - case ' ': - continue; - case 'D': - case 'd': - return show2SlowWhereDCheck(stmt, offset); - case 'S': - case 's': - return show2SlowWhereSCheck(stmt, offset); - default: - return OTHER; - } - } - } - } - return OTHER; - } - - // SHOW @@SLOW WHERE DATANODE= XXXXXX - static int show2SlowWhereDCheck(String stmt, int offset) { - if (stmt.length() > offset + "ATANODE".length()) { - char c1 = stmt.charAt(++offset); - char c2 = stmt.charAt(++offset); - char c3 = stmt.charAt(++offset); - char c4 = stmt.charAt(++offset); - char c5 = stmt.charAt(++offset); - char c6 = stmt.charAt(++offset); - char c7 = stmt.charAt(++offset); - if ((c1 == 'A' || c1 == 'a') && (c2 == 'T' || c2 == 't') && (c3 == 'A' || c3 == 'a') - && (c4 == 'N' || c4 == 'n') && (c5 == 'O' || c5 == 'o') && (c6 == 'D' || c6 == 'd') - && (c7 == 'E' || c7 == 'e')) { - while (stmt.length() > ++offset) { - switch (stmt.charAt(offset)) { - case ' ': - continue; - case '=': - while (stmt.length() > ++offset) { - switch (stmt.charAt(offset)) { - case ' ': - continue; - default: - return (offset << 8) | SLOW_DATANODE; - } - } - return OTHER; - default: - return OTHER; - } - } - } - } - return OTHER; - } - - // SHOW @@SLOW WHERE SCHEMA= XXXXXX - static int show2SlowWhereSCheck(String stmt, int offset) { - if (stmt.length() > offset + "CHEMA".length()) { - char c1 = stmt.charAt(++offset); - char c2 = stmt.charAt(++offset); - char c3 = stmt.charAt(++offset); - char c4 = stmt.charAt(++offset); - char c5 = stmt.charAt(++offset); - if ((c1 == 'C' || c1 == 'c') && (c2 == 'H' || c2 == 'h') && (c3 == 'E' || c3 == 'e') - && (c4 == 'M' || c4 == 'm') && (c5 == 'A' || c5 == 'a')) { - while (stmt.length() > ++offset) { - switch (stmt.charAt(offset)) { - case ' ': - continue; - case '=': - while (stmt.length() > ++offset) { - switch (stmt.charAt(offset)) { - case ' ': - continue; - default: - return (offset << 8) | SLOW_SCHEMA; - } - } - return OTHER; - default: - return OTHER; - } - } - } - } - return OTHER; - } - - // SHOW @@T - static int show2TCheck(String stmt, int offset) { - if (stmt.length() > ++offset) { - switch (stmt.charAt(offset)) { - case 'H': - case 'h': - return show2ThCheck(stmt, offset); - case 'I': - case 'i': - return show2TiCheck(stmt, offset); - default: - return OTHER; - } - } - return OTHER; - } - - // SHOW @@VERSION - static int show2VCheck(String stmt, int offset) { - if (stmt.length() > offset + "ERSION".length()) { - char c1 = stmt.charAt(++offset); - char c2 = stmt.charAt(++offset); - char c3 = stmt.charAt(++offset); - char c4 = stmt.charAt(++offset); - char c5 = stmt.charAt(++offset); - char c6 = stmt.charAt(++offset); - if ((c1 == 'E' || c1 == 'e') && (c2 == 'R' || c2 == 'r') && (c3 == 'S' || c3 == 's') - && (c4 == 'I' || c4 == 'i') && (c5 == 'O' || c5 == 'o') && (c6 == 'N' || c6 == 'n')) { - if (stmt.length() > ++offset && stmt.charAt(offset) != ' ') { - return OTHER; - } - return VERSION; - } - } - return OTHER; - } - - // SHOW @@CO - static int show2CoCheck(String stmt, int offset) { - if (stmt.length() > ++offset) { - switch (stmt.charAt(offset)) { - case 'M': - case 'm': - return show2ComCheck(stmt, offset); - case 'N': - case 'n': - return show2ConCheck(stmt, offset); - default: - return OTHER; - } - } - return OTHER; - } - - // SHOW @@DATABASE - static int show2DataBCheck(String stmt, int offset) { - if (stmt.length() > offset + "ASE".length()) { - char c1 = stmt.charAt(++offset); - char c2 = stmt.charAt(++offset); - char c3 = stmt.charAt(++offset); - if ((c1 == 'A' || c1 == 'a') && (c2 == 'S' || c2 == 's') && (c3 == 'E' || c3 == 'e')) { -// if (stmt.length() > ++offset && stmt.charAt(offset) != ' ') { -// return OTHER; -// } - return DATABASE; - } - } - return OTHER; - } - - // SHOW @@DATANODE - static int show2DataNCheck(String stmt, int offset) { - if (stmt.length() > offset + "ODE".length()) { - char c1 = stmt.charAt(++offset); - char c2 = stmt.charAt(++offset); - char c3 = stmt.charAt(++offset); - if ((c1 == 'O' || c1 == 'o') && (c2 == 'D' || c2 == 'd') && (c3 == 'E' || c3 == 'e')) { - while (stmt.length() > ++offset) { - switch (stmt.charAt(offset)) { - case ' ': - continue; - case 'W': - case 'w': - return show2DataNWhereCheck(stmt, offset); - default: - return OTHER; - } - } - return DATANODE; - } - } - return OTHER; - } - - // SHOW @@DATANODE WHERE - static int show2DataNWhereCheck(String stmt, int offset) { - if (stmt.length() > offset + "HERE".length()) { - char c1 = stmt.charAt(++offset); - char c2 = stmt.charAt(++offset); - char c3 = stmt.charAt(++offset); - char c4 = stmt.charAt(++offset); - if ((c1 == 'H' || c1 == 'h') && (c2 == 'E' || c2 == 'e') && (c3 == 'R' || c3 == 'r') - && (c4 == 'E' || c4 == 'e')) { - while (stmt.length() > ++offset) { - switch (stmt.charAt(offset)) { - case ' ': - continue; - case 'S': - case 's': - return show2DataNWhereSchemaCheck(stmt, offset); - default: - return OTHER; - } - } - } - } - return OTHER; - } - - // SHOW @@DATANODE WHERE SCHEMA = XXXXXX - static int show2DataNWhereSchemaCheck(String stmt, int offset) { - if (stmt.length() > offset + "CHEMA".length()) { - char c1 = stmt.charAt(++offset); - char c2 = stmt.charAt(++offset); - char c3 = stmt.charAt(++offset); - char c4 = stmt.charAt(++offset); - char c5 = stmt.charAt(++offset); - if ((c1 == 'C' || c1 == 'c') && (c2 == 'H' || c2 == 'h') && (c3 == 'E' || c3 == 'e') - && (c4 == 'M' || c4 == 'm') && (c5 == 'A' || c5 == 'a')) { - while (stmt.length() > ++offset) { - switch (stmt.charAt(offset)) { - case ' ': - continue; - case '=': - while (stmt.length() > ++offset) { - switch (stmt.charAt(offset)) { - case ' ': - continue; - default: - return (offset << 8) | DATANODE_WHERE; - } - } - return OTHER; - default: - return OTHER; - } - } - } - } - return OTHER; - } - - // SHOW @@DATASOURCE - static int show2DataSCheck(String stmt, int offset) { - if (stmt.length() > offset + "OURCE".length()) { - char c1 = stmt.charAt(++offset); - char c2 = stmt.charAt(++offset); - char c3 = stmt.charAt(++offset); - char c4 = stmt.charAt(++offset); - char c5 = stmt.charAt(++offset); - if ((c1 == 'O' || c1 == 'o') && (c2 == 'U' || c2 == 'u') && (c3 == 'R' || c3 == 'r') - && (c4 == 'C' || c4 == 'c') && (c5 == 'E' || c5 == 'e')) { - while (stmt.length() > ++offset) { - switch (stmt.charAt(offset)) { - case ' ': - continue; - case 'W': - case 'w': - return show2DataSWhereCheck(stmt, offset); - case '.': - return show2DataSynCheck(stmt, offset); - default: - return OTHER; - } - } - - return DATASOURCE; - } - } - return OTHER; - } - - // SHOW @@DATASOURCE WHERE - static int show2DataSWhereCheck(String stmt, int offset) { - if (stmt.length() > offset + "HERE".length()) { - char c1 = stmt.charAt(++offset); - char c2 = stmt.charAt(++offset); - char c3 = stmt.charAt(++offset); - char c4 = stmt.charAt(++offset); - if ((c1 == 'H' || c1 == 'h') && (c2 == 'E' || c2 == 'e') && (c3 == 'R' || c3 == 'r') - && (c4 == 'E' || c4 == 'e')) { - while (stmt.length() > ++offset) { - switch (stmt.charAt(offset)) { - case ' ': - continue; - case 'd': - case 'D': - return show2DataSWhereDatanodeCheck(stmt, offset); - default: - return OTHER; - } - } - } - } - return OTHER; - } - - // SHOW @@DATASOURCE WHERE DATANODE = XXXXXX - static int show2DataSWhereDatanodeCheck(String stmt, int offset) { - if (stmt.length() > offset + "ATANODE".length()) { - char c1 = stmt.charAt(++offset); - char c2 = stmt.charAt(++offset); - char c3 = stmt.charAt(++offset); - char c4 = stmt.charAt(++offset); - char c5 = stmt.charAt(++offset); - char c6 = stmt.charAt(++offset); - char c7 = stmt.charAt(++offset); - if ((c1 == 'A' || c1 == 'a') && (c2 == 'T' || c2 == 't') && (c3 == 'A' || c3 == 'a') - && (c4 == 'N' || c4 == 'n') && (c5 == 'O' || c5 == 'o') && (c6 == 'D' || c6 == 'd') - && (c7 == 'E' || c7 == 'e')) { - while (stmt.length() > ++offset) { - switch (stmt.charAt(offset)) { - case ' ': - continue; - case '=': - while (stmt.length() > ++offset) { - switch (stmt.charAt(offset)) { - case ' ': - continue; - default: - return (offset << 8) | DATASOURCE_WHERE; - } - } - return OTHER; - default: - return OTHER; - } - } - } - } - return OTHER; - } - - // SHOW @@PARSER - static int show2PaCheck(String stmt, int offset) { - if (stmt.length() > offset + "RSER".length()) { - char c1 = stmt.charAt(++offset); - char c2 = stmt.charAt(++offset); - char c3 = stmt.charAt(++offset); - char c4 = stmt.charAt(++offset); - if ((c1 == 'R' || c1 == 'r') && (c2 == 'S' || c2 == 's') && (c3 == 'E' || c3 == 'e') - && (c4 == 'R' || c4 == 'r')) { - if (stmt.length() > ++offset && stmt.charAt(offset) != ' ') { - return OTHER; - } - return PARSER; - } - } - return OTHER; - } - - // SHOW @@PROCESSOR - static int show2PrCheck(String stmt, int offset) { - if (stmt.length() > offset + "OCESSOR".length()) { - char c1 = stmt.charAt(++offset); - char c2 = stmt.charAt(++offset); - char c3 = stmt.charAt(++offset); - char c4 = stmt.charAt(++offset); - char c5 = stmt.charAt(++offset); - char c6 = stmt.charAt(++offset); - char c7 = stmt.charAt(++offset); - if ((c1 == 'O' || c1 == 'o') && (c2 == 'C' || c2 == 'c') && (c3 == 'E' || c3 == 'e') - && (c4 == 'S' || c4 == 's') && (c5 == 'S' || c5 == 's') && (c6 == 'O' || c6 == 'o') - && (c7 == 'R' || c7 == 'r')) { - if (stmt.length() > ++offset && stmt.charAt(offset) != ' ') { - return OTHER; - } - return PROCESSOR; - } - } - return OTHER; - } - - // SHOW @@SERVER - // SHOW @@SESSION - static int show2SeCheck(String stmt, int offset) { - if (stmt.length() > offset + "SSION".length()) { - char c1 = stmt.charAt(++offset); - char c2 = stmt.charAt(++offset); - char c3 = stmt.charAt(++offset); - char c4 = stmt.charAt(++offset); - char c5 = stmt.charAt(++offset); - if ((c1 == 'S' || c1 == 's') && (c2 == 'S' || c2 == 's') && (c3 == 'I' || c3 == 'i') - && (c4 == 'O' || c4 == 'o') && (c5 == 'N' || c5 == 'n')) { - if (stmt.length() > ++offset && stmt.charAt(offset) != ' ') { - return OTHER; - } - return SESSION; - } - } - else if (stmt.length() > offset + "RVER".length()) { - char c1 = stmt.charAt(++offset); - char c2 = stmt.charAt(++offset); - char c3 = stmt.charAt(++offset); - char c4 = stmt.charAt(++offset); - if ((c1 == 'R' || c1 == 'r') && (c2 == 'V' || c2 == 'v') && (c3 == 'E' || c3 == 'e') - && (c4 == 'R' || c4 == 'r')) { - if (stmt.length() > ++offset && stmt.charAt(offset) != ' ') { - return OTHER; - } - return SERVER; - } - } - return OTHER; - } - - // SHOW @@THREADPOOL - static int show2ThCheck(String stmt, int offset) { - if (stmt.length() > offset + "READPOOL".length()) { - char c1 = stmt.charAt(++offset); - char c2 = stmt.charAt(++offset); - char c3 = stmt.charAt(++offset); - char c4 = stmt.charAt(++offset); - char c5 = stmt.charAt(++offset); - char c6 = stmt.charAt(++offset); - char c7 = stmt.charAt(++offset); - char c8 = stmt.charAt(++offset); - if ((c1 == 'R' || c1 == 'r') && (c2 == 'E' || c2 == 'e') && (c3 == 'A' || c3 == 'a') - && (c4 == 'D' || c4 == 'd') && (c5 == 'P' || c5 == 'p') && (c6 == 'O' || c6 == 'o') - && (c7 == 'O' || c7 == 'o') && (c8 == 'L' || c8 == 'l')) { - if (stmt.length() > ++offset && stmt.charAt(offset) != ' ') { - return OTHER; - } - return THREADPOOL; - } - } - return OTHER; - } - - // SHOW @@TIME. - static int show2TiCheck(String stmt, int offset) { - if (stmt.length() > offset + "ME.".length()) { - char c1 = stmt.charAt(++offset); - char c2 = stmt.charAt(++offset); - char c3 = stmt.charAt(++offset); - if ((c1 == 'M' || c1 == 'm') && (c2 == 'E' || c2 == 'e') && (c3 == '.')) { - if (stmt.length() > ++offset) { - switch (stmt.charAt(offset)) { - case 'C': - case 'c': - return show2TimeCCheck(stmt, offset); - case 'S': - case 's': - return show2TimeSCheck(stmt, offset); - default: - return OTHER; - } - } - } - } - return OTHER; - } - - // SHOW @@COMMAND - static int show2ComCheck(String stmt, int offset) { - if (stmt.length() > offset + "MAND".length()) { - char c1 = stmt.charAt(++offset); - char c2 = stmt.charAt(++offset); - char c3 = stmt.charAt(++offset); - char c4 = stmt.charAt(++offset); - if ((c1 == 'M' || c1 == 'm') && (c2 == 'A' || c2 == 'a') && (c3 == 'N' || c3 == 'n') - && (c4 == 'D' || c4 == 'd')) { - if (stmt.length() > ++offset && stmt.charAt(offset) != ' ') { - return OTHER; - } - return COMMAND; - } - } - return OTHER; - } - - // SHOW @@CONNECTION - static int show2ConCheck(String stmt, int offset) { - if (stmt.length() > offset + "NECTION".length()) { - char c1 = stmt.charAt(++offset); - char c2 = stmt.charAt(++offset); - char c3 = stmt.charAt(++offset); - char c4 = stmt.charAt(++offset); - char c5 = stmt.charAt(++offset); - char c6 = stmt.charAt(++offset); - char c7 = stmt.charAt(++offset); - if ((c1 == 'N' || c1 == 'n') && (c2 == 'E' || c2 == 'e') && (c3 == 'C' || c3 == 'c') - && (c4 == 'T' || c4 == 't') && (c5 == 'I' || c5 == 'i') && (c6 == 'O' || c6 == 'o') - && (c7 == 'N' || c7 == 'n')) { - if (stmt.length() > ++offset) { - switch (stmt.charAt(offset)) { - case ' ': - return CONNECTION; - case '.': - return show2ConnectonSQL(stmt, offset); - default: - return OTHER; - } - } - return CONNECTION; - } - } - return OTHER; - } - - // SHOW @@CONNECTION.SQL - static int show2ConnectonSQL(String stmt, int offset) { - if (stmt.length() > offset + "SQL".length()) { - char c1 = stmt.charAt(++offset); - char c2 = stmt.charAt(++offset); - char c3 = stmt.charAt(++offset); - if ((c1 == 'S' || c1 == 's') && (c2 == 'Q' || c2 == 'q') && (c3 == 'L' || c3 == 'l')) { - if (stmt.length() > ++offset && stmt.charAt(offset) != ' ') { - return OTHER; - } - return CONNECTION_SQL; - } - } - return OTHER; - } - - // SHOW @@TIME.CURRENT - static int show2TimeCCheck(String stmt, int offset) { - if (stmt.length() > offset + "URRENT".length()) { - char c1 = stmt.charAt(++offset); - char c2 = stmt.charAt(++offset); - char c3 = stmt.charAt(++offset); - char c4 = stmt.charAt(++offset); - char c5 = stmt.charAt(++offset); - char c6 = stmt.charAt(++offset); - if ((c1 == 'U' || c1 == 'u') && (c2 == 'R' || c2 == 'r') && (c3 == 'R' || c3 == 'r') - && (c4 == 'E' || c4 == 'e') && (c5 == 'N' || c5 == 'n') && (c6 == 'T' || c6 == 't')) { - if (stmt.length() > ++offset && stmt.charAt(offset) != ' ') { - return OTHER; - } - return TIME_CURRENT; - } - } - return OTHER; - } - - // SHOW @@TIME.STARTUP - static int show2TimeSCheck(String stmt, int offset) { - if (stmt.length() > offset + "TARTUP".length()) { - char c1 = stmt.charAt(++offset); - char c2 = stmt.charAt(++offset); - char c3 = stmt.charAt(++offset); - char c4 = stmt.charAt(++offset); - char c5 = stmt.charAt(++offset); - char c6 = stmt.charAt(++offset); - if ((c1 == 'T' || c1 == 't') && (c2 == 'A' || c2 == 'a') && (c3 == 'R' || c3 == 'r') - && (c4 == 'T' || c4 == 't') && (c5 == 'U' || c5 == 'u') && (c6 == 'P' || c6 == 'p')) { - if (stmt.length() > ++offset && stmt.charAt(offset) != ' ') { - return OTHER; - } - return TIME_STARTUP; - } - } - return OTHER; - } - - // SHOW @@SQ - static int show2SqCheck(String stmt, int offset) { - if (stmt.length() > ++offset) { - switch (stmt.charAt(offset)) { - case 'L': - case 'l': - return show2SqlCheck(stmt, offset); - default: - return OTHER; - } - } - return OTHER; - } - - // SHOW @@SQL - static int show2SqlCheck(String stmt, int offset) { - if (stmt.length() > ++offset) { - switch (stmt.charAt(offset)) { - case '.': - return show2SqlDotCheck(stmt, offset); - case ' ': - return show2SqlBlankCheck(stmt, offset); - default: - return OTHER; - } - } - else - return SQL; - - } - - // SHOW @@SQL. - static int show2SqlDotCheck(String stmt, int offset) { - if (stmt.length() > ++offset) { - switch (stmt.charAt(offset)) { - case 'D': - case 'd': - return show2SqlDCheck(stmt, offset); - case 'E': - case 'e': - return show2SqlECheck(stmt, offset); - case 'S': - case 's': - char c1 = stmt.charAt(++offset); - switch (c1) { - case 'L': - case 'l': - return show2SqlSLCheck(stmt, offset); - case 'U': - case 'u': - return show2SqlSUCheck(stmt, offset); - } - case 'H': - case 'h': - return show2SqlHCheck(stmt, offset); - default: - return OTHER; - } - } - return OTHER; - } - - // SHOW @@SQL WHERE ID = XXXXXX - static int show2SqlBlankCheck(String stmt, int offset) { - for (++offset; stmt.length() > offset;) { - switch (stmt.charAt(offset)) { - case ' ': - return SQL; - case 'W': - case 'w': - if (isWhere(stmt, offset)) { - return SQL; - } else { - return OTHER; - } - default: - return OTHER; - } - } - - return OTHER; - } - - // SHOW @@SQL.DETAIL WHERE ID = XXXXXX - static int show2SqlDCheck(String stmt, int offset) { - if (stmt.length() > offset + "ETAIL".length()) { - char c1 = stmt.charAt(++offset); - char c2 = stmt.charAt(++offset); - char c3 = stmt.charAt(++offset); - char c4 = stmt.charAt(++offset); - char c5 = stmt.charAt(++offset); - if ((c1 == 'E' || c1 == 'e') && (c2 == 'T' || c2 == 't') && (c3 == 'A' || c3 == 'a') - && (c4 == 'I' || c4 == 'i') && (c5 == 'L' || c5 == 'l')) { - for (++offset; stmt.length() > offset; ++offset) { - switch (stmt.charAt(offset)) { - case ' ': - continue; - case 'W': - case 'w': - if (isWhere(stmt, offset)) { - return SQL_DETAIL; - } else { - return OTHER; - } - default: - return OTHER; - } - } - } - } - return OTHER; - } - - // SHOW @@SQL.EXECUTE - static int show2SqlECheck(String stmt, int offset) { - if (stmt.length() > offset + "XECUTE".length()) { - char c1 = stmt.charAt(++offset); - char c2 = stmt.charAt(++offset); - char c3 = stmt.charAt(++offset); - char c4 = stmt.charAt(++offset); - char c5 = stmt.charAt(++offset); - char c6 = stmt.charAt(++offset); - if ((c1 == 'X' || c1 == 'x') && (c2 == 'E' || c2 == 'e') && (c3 == 'C' || c3 == 'c') - && (c4 == 'U' || c4 == 'u') && (c5 == 'T' || c5 == 't') && (c6 == 'E' || c6 == 'e')) { - if (stmt.length() > ++offset && stmt.charAt(offset) != ' ') { - return OTHER; - } - return SQL_EXECUTE; - } - } - return OTHER; - } - - // SHOW @@SQL.SLOW - static int show2SqlSLCheck(String stmt, int offset) { - if (stmt.length() > offset + "OW".length()) { - char c1 = stmt.charAt(++offset); - char c2 = stmt.charAt(++offset); - if ((c1 == 'O' || c1 == 'o') && (c2 == 'W' || c2 == 'w')) { - if (stmt.length() > ++offset && stmt.charAt(offset) != ' ') { - return OTHER; - } - return SQL_SLOW; - } - } - return OTHER; - } - - // SHOW @@SQL.HIGH - static int show2SqlHCheck(String stmt, int offset) { - - if (stmt.length() > offset + "IGH".length()) { - char c1 = stmt.charAt(++offset); - char c2 = stmt.charAt(++offset); - char c3 = stmt.charAt(++offset); - if ((c1 == 'I' || c1 == 'i') && (c2 == 'G' || c2 == 'g') && (c3 == 'H' || c3 == 'h') ) { - if (stmt.length() > ++offset && stmt.charAt(offset) != ' ') { - return OTHER; - } - return SQL_HIGH; - } - } - return OTHER; - } - - // SHOW @@SQL.SUM - static int show2SqlSUCheck(String stmt, int offset) { - if (stmt.length() > offset + "M".length()) { - char c1 = stmt.charAt(++offset); - if ( c1 == 'M' || c1 == 'm') { - if (stmt.length() > ++offset && stmt.charAt(offset) == '.') { - - /** - * TODO: modify by zhuam - * - * 兼容之前指令 - * 在保留 SHOW @@SQL.SUM 指令的同时, 扩展支持 SHOW @@SQL.SUM.TABLE 、 SHOW @@SQL.SUM.USER - */ - if ( stmt.length() > (offset+4) ) { - char c2 = stmt.charAt(++offset); - char c3 = stmt.charAt(++offset); - char c4 = stmt.charAt(++offset); - char c5 = stmt.charAt(++offset); - - if ( (c2 == 'U' || c2 == 'u') && (c3 == 'S' || c3 == 's') - && (c4 == 'E' || c4 == 'e') && (c5 == 'R' || c5 == 'r') ) { - return SQL_SUM_USER; - - } else if ( (c2 == 'T' || c2 == 't') && (c3 == 'A' || c3 == 'a') - && (c4 == 'B' || c4 == 'b') && (c5 == 'L' || c5 == 'l') ) { - - if ( stmt.length() > (offset+1) ) { - char c6 = stmt.charAt(++offset); - if ( c6 == 'E' || c6 == 'e') { - return SQL_SUM_TABLE; - } - } - } - - } - - return OTHER; - } - return SQL_SUM_USER; - } - } - return OTHER; - } - - - static boolean isWhere(String stmt, int offset) { - if (stmt.length() > offset + 5) { - char c1 = stmt.charAt(++offset); - char c2 = stmt.charAt(++offset); - char c3 = stmt.charAt(++offset); - char c4 = stmt.charAt(++offset); - char c5 = stmt.charAt(++offset); - if ((c1 == 'H' || c1 == 'h') && (c2 == 'E' || c2 == 'e') && (c3 == 'R' || c3 == 'r') - && (c4 == 'E' || c4 == 'e') && (c5 == ' ')) { - boolean jump1 = false; - for (++offset; stmt.length() > offset && !jump1; ++offset) { - switch (stmt.charAt(offset)) { - case ' ': - continue; - case 'I': - case 'i': - jump1 = true; - break; - default: - return false; - } - } - if ((stmt.length() > offset) && (stmt.charAt(offset) == 'D' || stmt.charAt(offset) == 'd')) { - boolean jump2 = false; - for (++offset; stmt.length() > offset && !jump2; ++offset) { - switch (stmt.charAt(offset)) { - case ' ': - continue; - case '=': - jump2 = true; - break; - default: - return false; - } - } - return isSqlId(stmt, offset); - } - } - } - return false; - } - - static boolean isSqlId(String stmt, int offset) { - String id = stmt.substring(offset).trim(); - try { - Long.parseLong(id); - } catch (Exception e) { - return false; - } - return true; - } - - public static String getWhereParameter(String stmt) { - int offset = stmt.indexOf('='); - ++offset; - return stmt.substring(offset).trim(); - } - +/* + * Copyright (c) 2013, OpenCloudDB/MyCAT and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software;Designed and Developed mainly by many Chinese + * opensource volunteers. you can redistribute it and/or modify it under the + * terms of the GNU General Public License version 2 only, as published by the + * Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Any questions about this component can be directed to it's project Web address + * https://code.google.com/p/opencloudb/. + * + */ +package org.opencloudb.parser; + +import org.opencloudb.parser.util.ParseUtil; + +/** + * @author mycat + */ +public final class ManagerParseShow { + + public static final int OTHER = -1; + public static final int COMMAND = 1; + public static final int CONNECTION = 2; + public static final int DATABASE = 3; + public static final int DATANODE = 4; + public static final int DATASOURCE = 5; + public static final int HELP = 6; + public static final int PARSER = 7; + public static final int PROCESSOR = 8; + public static final int ROUTER = 9; + public static final int SERVER = 10; + public static final int SQL = 11; + public static final int SQL_DETAIL = 12; + public static final int SQL_EXECUTE = 13; + public static final int SQL_SLOW = 14; + public static final int SQL_SUM_USER = 15; + public static final int SQL_SUM_TABLE = 16; + public static final int SQL_HIGH = 17; + public static final int SQL_CONDITION = 18; + + public static final int THREADPOOL = 21; + public static final int TIME_CURRENT = 22; + public static final int TIME_STARTUP = 23; + public static final int VERSION = 24; + public static final int VARIABLES = 25; + public static final int COLLATION = 26; + public static final int CONNECTION_SQL = 27; + public static final int DATANODE_WHERE = 28; + public static final int DATASOURCE_WHERE = 29; + public static final int HEARTBEAT = 30; + public static final int SLOW_DATANODE = 31; + public static final int SLOW_SCHEMA = 32; + public static final int BACKEND = 33; + public static final int CACHE = 34; + public static final int SESSION = 35; + public static final int SYSPARAM = 36; + public static final int SYSLOG = 37; + public static final int HEARTBEAT_DETAIL = 38; + public static final int DATASOURCE_SYNC = 39; + public static final int DATASOURCE_SYNC_DETAIL = 40; + public static final int DATASOURCE_CLUSTER = 41; + + + public static int parse(String stmt, int offset) { + int i = offset; + for (; i < stmt.length(); i++) { + switch (stmt.charAt(i)) { + case ' ': + continue; + case '/': + case '#': + i = ParseUtil.comment(stmt, i); + continue; + case '@': + return show2Check(stmt, i); + case 'C': + case 'c': + return showCCheck(stmt, i); + case 'd': + case 'D': + return show2DCheck(stmt, i); + case 'V': + case 'v': + return showVCheck(stmt, i); + default: + return OTHER; + } + } + return OTHER; + } + + // SHOW @ + static int show2Check(String stmt, int offset) { + if (stmt.length() > ++offset && stmt.charAt(offset) == '@') { + if (stmt.length() > ++offset) { + switch (stmt.charAt(offset)) { + case 'B': + case 'b': + return show2BCheck(stmt, offset); + case 'C': + case 'c': + return show2CCheck(stmt, offset); + case 'D': + case 'd': + return show2DCheck(stmt, offset); + case 'H': + case 'h': + return show2HCheck(stmt, offset); + case 'P': + case 'p': + return show2PCheck(stmt, offset); + case 'R': + case 'r': + return show2RCheck(stmt, offset); + case 'S': + case 's': + return show2SCheck(stmt, offset); + case 'T': + case 't': + return show2TCheck(stmt, offset); + case 'V': + case 'v': + return show2VCheck(stmt, offset); + default: + return OTHER; + } + } + } + return OTHER; + } + + // SHOW COLLATION + static int showCCheck(String stmt, int offset) { + if (stmt.length() > offset + "OLLATION".length()) { + char c1 = stmt.charAt(++offset); + char c2 = stmt.charAt(++offset); + char c3 = stmt.charAt(++offset); + char c4 = stmt.charAt(++offset); + char c5 = stmt.charAt(++offset); + char c6 = stmt.charAt(++offset); + char c7 = stmt.charAt(++offset); + char c8 = stmt.charAt(++offset); + if ((c1 == 'O' || c1 == 'o') && (c2 == 'L' || c2 == 'l') && (c3 == 'L' || c3 == 'l') + && (c4 == 'A' || c4 == 'a') && (c5 == 'T' || c5 == 't') && (c6 == 'I' || c6 == 'i') + && (c7 == 'O' || c7 == 'o') && (c8 == 'N' || c8 == 'n')) { + if (stmt.length() > ++offset && stmt.charAt(offset) != ' ') { + return OTHER; + } + return COLLATION; + } + } + return OTHER; + } + + // SHOW VARIABLES + static int showVCheck(String stmt, int offset) { + if (stmt.length() > offset + "ARIABLES".length()) { + char c1 = stmt.charAt(++offset); + char c2 = stmt.charAt(++offset); + char c3 = stmt.charAt(++offset); + char c4 = stmt.charAt(++offset); + char c5 = stmt.charAt(++offset); + char c6 = stmt.charAt(++offset); + char c7 = stmt.charAt(++offset); + char c8 = stmt.charAt(++offset); + if ((c1 == 'A' || c1 == 'a') && (c2 == 'R' || c2 == 'r') && (c3 == 'I' || c3 == 'i') + && (c4 == 'A' || c4 == 'a') && (c5 == 'B' || c5 == 'b') && (c6 == 'L' || c6 == 'l') + && (c7 == 'E' || c7 == 'e') && (c8 == 'S' || c8 == 's')) { + if (stmt.length() > ++offset && stmt.charAt(offset) != ' ') { + return OTHER; + } + return VARIABLES; + } + } + return OTHER; + } + + // SHOW @@BACKEND + static int show2BCheck(String stmt, int offset) { + if (stmt.length() > offset + "ACKEND".length()) { + char c1 = stmt.charAt(++offset); + char c2 = stmt.charAt(++offset); + char c3 = stmt.charAt(++offset); + char c4 = stmt.charAt(++offset); + char c5 = stmt.charAt(++offset); + char c6 = stmt.charAt(++offset); + if ((c1 == 'A' || c1 == 'a') && (c2 == 'C' || c2 == 'c') && (c3 == 'K' || c3 == 'k') + && (c4 == 'E' || c4 == 'e') && (c5 == 'N' || c5 == 'n') && (c6 == 'D' || c6 == 'd') + && (stmt.length() == ++offset || ParseUtil.isEOF(stmt.charAt(offset)))) { + return BACKEND; + } + } + return OTHER; + } + + // SHOW @@C + static int show2CCheck(String stmt, int offset) { + if (stmt.length() > ++offset) { + switch (stmt.charAt(offset)) { + case 'O': + case 'o': + return show2CoCheck(stmt, offset); + case 'A': + case 'a': + return show2CACheck(stmt, offset); + default: + return OTHER; + } + } + return OTHER; + } + // SHOW @@CACHE + private static int show2CACheck(String stmt, int offset) { + String remain=stmt.substring(offset); + if(remain.equalsIgnoreCase("ACHE")) + { + return CACHE; + } + return OTHER; + } + + // SHOW @@DATA + static int show2DCheck(String stmt, int offset) { + if (stmt.length() > offset + "ATA".length()) { + char c1 = stmt.charAt(++offset); + char c2 = stmt.charAt(++offset); + char c3 = stmt.charAt(++offset); + if ((c1 == 'A' || c1 == 'a') && (c2 == 'T' || c2 == 't') && (c3 == 'A' || c3 == 'a')) { + if (stmt.length() > ++offset) { + switch (stmt.charAt(offset)) { + case 'B': + case 'b': + return show2DataBCheck(stmt, offset); + case 'N': + case 'n': + return show2DataNCheck(stmt, offset); + case 'S': + case 's': + return show2DataSCheck(stmt, offset); + default: + return OTHER; + } + } + } + } + return OTHER; + } + // SHOW @@DataSyn + static int show2DataSynCheck(String stmt, int offset) { + if (stmt.length() > ++offset) { + switch (stmt.charAt(offset)) { + case 'S': + case 's': + if (stmt.length() > offset + "yn".length()) { + char c1 = stmt.charAt(++offset); + char c2 = stmt.charAt(++offset); + if ((c1 == 'Y' || c1 == 'y') && (c2 == 'N' || c2 == 'n')){ + switch (stmt.charAt(++offset)) { + case 'S': + case 's': + return show2SynStatuslCheck(stmt,offset); + case 'D': + case 'd': + return show2SynDetailCheck(stmt,offset); + default: + return OTHER; + } + + }else{ + return OTHER; + } + } + case 'C': + case 'c': + if (stmt.length() > offset + "luster".length()) { + char c1 = stmt.charAt(++offset); + char c2 = stmt.charAt(++offset); + char c3 = stmt.charAt(++offset); + char c4 = stmt.charAt(++offset); + char c5 = stmt.charAt(++offset); + char c6 = stmt.charAt(++offset); + if ((c1 == 'L' || c1 == 'l') && (c2 == 'U' || c2 == 'u') + && (c3 == 'S' || c3 == 's') && (c4 == 'T' || c4 == 't') + && (c5 == 'E' || c5 == 'e')&& (c6 == 'R' || c6 == 'r') ){ + return DATASOURCE_CLUSTER; + }else{ + return OTHER; + } + } + default: + return OTHER; + } + } + return OTHER; + } + //show @@datasource.syndetail + static int show2SynDetailCheck(String stmt, int offset) { + if (stmt.length() > offset + "etail".length()) { + char c1 = stmt.charAt(++offset); + char c2 = stmt.charAt(++offset); + char c3 = stmt.charAt(++offset); + char c4 = stmt.charAt(++offset); + char c5 = stmt.charAt(++offset); + + if ((c1 == 'E' || c1 == 'e') && (c2 == 'T' || c2 == 't') && (c3 == 'A' || c3 == 'a') + && (c4 == 'I' || c4 == 'i') && (c5 == 'L' || c5 == 'l')) { + if (stmt.length() > ++offset && stmt.charAt(offset) != ' ') { + return OTHER; + } + return DATASOURCE_SYNC_DETAIL; + } + } + return OTHER; + } + //show @@datasource.synstatus + static int show2SynStatuslCheck(String stmt, int offset) { + if (stmt.length() > offset + "tatus".length()) { + char c1 = stmt.charAt(++offset); + char c2 = stmt.charAt(++offset); + char c3 = stmt.charAt(++offset); + char c4 = stmt.charAt(++offset); + char c5 = stmt.charAt(++offset); + + if ((c1 == 'T' || c1 == 't') && (c2 == 'A' || c2 == 'a') && (c3 == 'T' || c3 == 't') + && (c4 == 'U' || c4 == 'u') && (c5 == 'S' || c5 == 's')) { + if (stmt.length() > ++offset && stmt.charAt(offset) != ' ') { + return OTHER; + } + return DATASOURCE_SYNC; + } + } + return OTHER; + } + + // SHOW @@HELP + static int show2HCheck(String stmt, int offset) { + if (stmt.length() > ++offset) { + switch (stmt.charAt(offset)) { + case 'E': + case 'e': + return show2HeCheck(stmt, offset); + default: + return OTHER; + } + } + return OTHER; + } + + // SHOW @@HE + static int show2HeCheck(String stmt, int offset) { + if (stmt.length() > ++offset) { + switch (stmt.charAt(offset)) { + case 'L': + case 'l': + return show2HelCheck(stmt, offset); + case 'A': + case 'a': + return ManagerParseHeartbeat.show2HeaCheck(stmt, offset); + default: + return OTHER; + } + } + return OTHER; + } + + // SHOW @@HELP + static int show2HelCheck(String stmt, int offset) { + if (stmt.length() > offset + "P".length()) { + char c1 = stmt.charAt(++offset); + if ((c1 == 'P' || c1 == 'p')) { + if (stmt.length() > ++offset && stmt.charAt(offset) != ' ') { + return OTHER; + } + return HELP; + } + } + return OTHER; + } + + + + // SHOW @@P + static int show2PCheck(String stmt, int offset) { + if (stmt.length() > ++offset) { + switch (stmt.charAt(offset)) { + case 'A': + case 'a': + return show2PaCheck(stmt, offset); + case 'R': + case 'r': + return show2PrCheck(stmt, offset); + default: + return OTHER; + } + } + return OTHER; + } + + // SHOW @@ROUTER + static int show2RCheck(String stmt, int offset) { + if (stmt.length() > offset + "OUTER".length()) { + char c1 = stmt.charAt(++offset); + char c2 = stmt.charAt(++offset); + char c3 = stmt.charAt(++offset); + char c4 = stmt.charAt(++offset); + char c5 = stmt.charAt(++offset); + if ((c1 == 'O' || c1 == 'o') && (c2 == 'U' || c2 == 'u') && (c3 == 'T' || c3 == 't') + && (c4 == 'E' || c4 == 'e') && (c5 == 'R' || c5 == 'r')) { + if (stmt.length() > ++offset && stmt.charAt(offset) != ' ') { + return OTHER; + } + return ROUTER; + } + } + return OTHER; + } + + // SHOW @@S + static int show2SCheck(String stmt, int offset) { + if (stmt.length() > ++offset) { + switch (stmt.charAt(offset)) { + case 'E': + case 'e': + return show2SeCheck(stmt, offset); + case 'Q': + case 'q': + return show2SqCheck(stmt, offset); + case 'L': + case 'l': + return show2SlCheck(stmt, offset); + case 'Y': + case 'y': + return show2SyCheck(stmt, offset); + default: + return OTHER; + } + } + return OTHER; + } + + // SHOW @@SLOW + static int show2SlCheck(String stmt, int offset) { + if (stmt.length() > offset + "OW ".length()) { + char c1 = stmt.charAt(++offset); + char c2 = stmt.charAt(++offset); + char c3 = stmt.charAt(++offset); + if ((c1 == 'O' || c1 == 'o') && (c2 == 'W' || c2 == 'w') && c3 == ' ') { + while (stmt.length() > ++offset) { + switch (stmt.charAt(offset)) { + case ' ': + continue; + case 'W': + case 'w': + return show2SlowWhereCheck(stmt, offset); + default: + return OTHER; + } + } + } + } + return OTHER; + } + + // SHOW @@SYSPARAM + static int show2sysparam(String stmt, int offset) { + if (stmt.length() > offset + "ARAM".length()) { + char c1 = stmt.charAt(++offset); + char c2 = stmt.charAt(++offset); + char c3 = stmt.charAt(++offset); + char c4 = stmt.charAt(++offset); + + if ((c1 == 'A' || c1 == 'a') && (c2 == 'R' || c2 == 'r') + && (c3 == 'A' || c3 == 'a') && (c4 == 'M' || c4 == 'm')) { + if (stmt.length() > ++offset && stmt.charAt(offset) != ' ') { + return OTHER; + } + return SYSPARAM; + } + } + return OTHER; + } + + static int show2syslog(String stmt, int offset) { + + if (stmt.length() > offset + "SLOG".length()) { + + char c1 = stmt.charAt(++offset); + char c2 = stmt.charAt(++offset); + char c3 = stmt.charAt(++offset); + + if ( (c1 == 'O' || c1 == 'o') && (c2 == 'G' || c2 == 'g') && c3 == ' ' ) { + + char c4 = stmt.charAt(++offset); + char c5 = stmt.charAt(++offset); + char c6 = stmt.charAt(++offset); + char c7 = stmt.charAt(++offset); + char c8 = stmt.charAt(++offset); + + if ((c4 == 'L' || c4 == 'l') && (c5 == 'I' || c5 == 'i') && (c6 == 'M' || c6 == 'm') + && (c7 == 'I' || c7 == 'i') && (c8 == 'T' || c8 == 't') ) { + + while (stmt.length() > ++offset) { + switch (stmt.charAt(offset)) { + case ' ': + continue; + case '=': + while (stmt.length() > ++offset) { + switch (stmt.charAt(offset)) { + case ' ': + continue; + default: + return (offset << 8) | SYSLOG; + } + } + return OTHER; + default: + return OTHER; + } + } + } + + return SYSLOG; + } + } + + return OTHER; + } + + // SHOW @@SYSPARAM + // SHOW @@SYSLOG LIMIT=1000 + static int show2SyCheck(String stmt, int offset) { + + if (stmt.length() > offset + "YS".length()) { + char c1 = stmt.charAt(++offset); + char c2 = stmt.charAt(++offset); + if ( c1 == 'S' || c1 == 's' ) { + switch (c2) { + case 'L': + case 'l': + return show2syslog(stmt, offset); + case 'P': + case 'p': + return show2sysparam(stmt, offset); + default: + return OTHER; + } + } + } + return OTHER; + } + + + + // SHOW @@SLOW WHERE + static int show2SlowWhereCheck(String stmt, int offset) { + if (stmt.length() > offset + "HERE".length()) { + char c1 = stmt.charAt(++offset); + char c2 = stmt.charAt(++offset); + char c3 = stmt.charAt(++offset); + char c4 = stmt.charAt(++offset); + if ((c1 == 'H' || c1 == 'h') && (c2 == 'E' || c2 == 'e') && (c3 == 'R' || c3 == 'r') + && (c4 == 'E' || c4 == 'e')) { + while (stmt.length() > ++offset) { + switch (stmt.charAt(offset)) { + case ' ': + continue; + case 'D': + case 'd': + return show2SlowWhereDCheck(stmt, offset); + case 'S': + case 's': + return show2SlowWhereSCheck(stmt, offset); + default: + return OTHER; + } + } + } + } + return OTHER; + } + + // SHOW @@SLOW WHERE DATANODE= XXXXXX + static int show2SlowWhereDCheck(String stmt, int offset) { + if (stmt.length() > offset + "ATANODE".length()) { + char c1 = stmt.charAt(++offset); + char c2 = stmt.charAt(++offset); + char c3 = stmt.charAt(++offset); + char c4 = stmt.charAt(++offset); + char c5 = stmt.charAt(++offset); + char c6 = stmt.charAt(++offset); + char c7 = stmt.charAt(++offset); + if ((c1 == 'A' || c1 == 'a') && (c2 == 'T' || c2 == 't') && (c3 == 'A' || c3 == 'a') + && (c4 == 'N' || c4 == 'n') && (c5 == 'O' || c5 == 'o') && (c6 == 'D' || c6 == 'd') + && (c7 == 'E' || c7 == 'e')) { + while (stmt.length() > ++offset) { + switch (stmt.charAt(offset)) { + case ' ': + continue; + case '=': + while (stmt.length() > ++offset) { + switch (stmt.charAt(offset)) { + case ' ': + continue; + default: + return (offset << 8) | SLOW_DATANODE; + } + } + return OTHER; + default: + return OTHER; + } + } + } + } + return OTHER; + } + + // SHOW @@SLOW WHERE SCHEMA= XXXXXX + static int show2SlowWhereSCheck(String stmt, int offset) { + if (stmt.length() > offset + "CHEMA".length()) { + char c1 = stmt.charAt(++offset); + char c2 = stmt.charAt(++offset); + char c3 = stmt.charAt(++offset); + char c4 = stmt.charAt(++offset); + char c5 = stmt.charAt(++offset); + if ((c1 == 'C' || c1 == 'c') && (c2 == 'H' || c2 == 'h') && (c3 == 'E' || c3 == 'e') + && (c4 == 'M' || c4 == 'm') && (c5 == 'A' || c5 == 'a')) { + while (stmt.length() > ++offset) { + switch (stmt.charAt(offset)) { + case ' ': + continue; + case '=': + while (stmt.length() > ++offset) { + switch (stmt.charAt(offset)) { + case ' ': + continue; + default: + return (offset << 8) | SLOW_SCHEMA; + } + } + return OTHER; + default: + return OTHER; + } + } + } + } + return OTHER; + } + + // SHOW @@T + static int show2TCheck(String stmt, int offset) { + if (stmt.length() > ++offset) { + switch (stmt.charAt(offset)) { + case 'H': + case 'h': + return show2ThCheck(stmt, offset); + case 'I': + case 'i': + return show2TiCheck(stmt, offset); + default: + return OTHER; + } + } + return OTHER; + } + + // SHOW @@VERSION + static int show2VCheck(String stmt, int offset) { + if (stmt.length() > offset + "ERSION".length()) { + char c1 = stmt.charAt(++offset); + char c2 = stmt.charAt(++offset); + char c3 = stmt.charAt(++offset); + char c4 = stmt.charAt(++offset); + char c5 = stmt.charAt(++offset); + char c6 = stmt.charAt(++offset); + if ((c1 == 'E' || c1 == 'e') && (c2 == 'R' || c2 == 'r') && (c3 == 'S' || c3 == 's') + && (c4 == 'I' || c4 == 'i') && (c5 == 'O' || c5 == 'o') && (c6 == 'N' || c6 == 'n')) { + if (stmt.length() > ++offset && stmt.charAt(offset) != ' ') { + return OTHER; + } + return VERSION; + } + } + return OTHER; + } + + // SHOW @@CO + static int show2CoCheck(String stmt, int offset) { + if (stmt.length() > ++offset) { + switch (stmt.charAt(offset)) { + case 'M': + case 'm': + return show2ComCheck(stmt, offset); + case 'N': + case 'n': + return show2ConCheck(stmt, offset); + default: + return OTHER; + } + } + return OTHER; + } + + // SHOW @@DATABASE + static int show2DataBCheck(String stmt, int offset) { + if (stmt.length() > offset + "ASE".length()) { + char c1 = stmt.charAt(++offset); + char c2 = stmt.charAt(++offset); + char c3 = stmt.charAt(++offset); + if ((c1 == 'A' || c1 == 'a') && (c2 == 'S' || c2 == 's') && (c3 == 'E' || c3 == 'e')) { +// if (stmt.length() > ++offset && stmt.charAt(offset) != ' ') { +// return OTHER; +// } + return DATABASE; + } + } + return OTHER; + } + + // SHOW @@DATANODE + static int show2DataNCheck(String stmt, int offset) { + if (stmt.length() > offset + "ODE".length()) { + char c1 = stmt.charAt(++offset); + char c2 = stmt.charAt(++offset); + char c3 = stmt.charAt(++offset); + if ((c1 == 'O' || c1 == 'o') && (c2 == 'D' || c2 == 'd') && (c3 == 'E' || c3 == 'e')) { + while (stmt.length() > ++offset) { + switch (stmt.charAt(offset)) { + case ' ': + continue; + case 'W': + case 'w': + return show2DataNWhereCheck(stmt, offset); + default: + return OTHER; + } + } + return DATANODE; + } + } + return OTHER; + } + + // SHOW @@DATANODE WHERE + static int show2DataNWhereCheck(String stmt, int offset) { + if (stmt.length() > offset + "HERE".length()) { + char c1 = stmt.charAt(++offset); + char c2 = stmt.charAt(++offset); + char c3 = stmt.charAt(++offset); + char c4 = stmt.charAt(++offset); + if ((c1 == 'H' || c1 == 'h') && (c2 == 'E' || c2 == 'e') && (c3 == 'R' || c3 == 'r') + && (c4 == 'E' || c4 == 'e')) { + while (stmt.length() > ++offset) { + switch (stmt.charAt(offset)) { + case ' ': + continue; + case 'S': + case 's': + return show2DataNWhereSchemaCheck(stmt, offset); + default: + return OTHER; + } + } + } + } + return OTHER; + } + + // SHOW @@DATANODE WHERE SCHEMA = XXXXXX + static int show2DataNWhereSchemaCheck(String stmt, int offset) { + if (stmt.length() > offset + "CHEMA".length()) { + char c1 = stmt.charAt(++offset); + char c2 = stmt.charAt(++offset); + char c3 = stmt.charAt(++offset); + char c4 = stmt.charAt(++offset); + char c5 = stmt.charAt(++offset); + if ((c1 == 'C' || c1 == 'c') && (c2 == 'H' || c2 == 'h') && (c3 == 'E' || c3 == 'e') + && (c4 == 'M' || c4 == 'm') && (c5 == 'A' || c5 == 'a')) { + while (stmt.length() > ++offset) { + switch (stmt.charAt(offset)) { + case ' ': + continue; + case '=': + while (stmt.length() > ++offset) { + switch (stmt.charAt(offset)) { + case ' ': + continue; + default: + return (offset << 8) | DATANODE_WHERE; + } + } + return OTHER; + default: + return OTHER; + } + } + } + } + return OTHER; + } + + // SHOW @@DATASOURCE + static int show2DataSCheck(String stmt, int offset) { + if (stmt.length() > offset + "OURCE".length()) { + char c1 = stmt.charAt(++offset); + char c2 = stmt.charAt(++offset); + char c3 = stmt.charAt(++offset); + char c4 = stmt.charAt(++offset); + char c5 = stmt.charAt(++offset); + if ((c1 == 'O' || c1 == 'o') && (c2 == 'U' || c2 == 'u') && (c3 == 'R' || c3 == 'r') + && (c4 == 'C' || c4 == 'c') && (c5 == 'E' || c5 == 'e')) { + while (stmt.length() > ++offset) { + switch (stmt.charAt(offset)) { + case ' ': + continue; + case 'W': + case 'w': + return show2DataSWhereCheck(stmt, offset); + case '.': + return show2DataSynCheck(stmt, offset); + default: + return OTHER; + } + } + + return DATASOURCE; + } + } + return OTHER; + } + + // SHOW @@DATASOURCE WHERE + static int show2DataSWhereCheck(String stmt, int offset) { + if (stmt.length() > offset + "HERE".length()) { + char c1 = stmt.charAt(++offset); + char c2 = stmt.charAt(++offset); + char c3 = stmt.charAt(++offset); + char c4 = stmt.charAt(++offset); + if ((c1 == 'H' || c1 == 'h') && (c2 == 'E' || c2 == 'e') && (c3 == 'R' || c3 == 'r') + && (c4 == 'E' || c4 == 'e')) { + while (stmt.length() > ++offset) { + switch (stmt.charAt(offset)) { + case ' ': + continue; + case 'd': + case 'D': + return show2DataSWhereDatanodeCheck(stmt, offset); + default: + return OTHER; + } + } + } + } + return OTHER; + } + + // SHOW @@DATASOURCE WHERE DATANODE = XXXXXX + static int show2DataSWhereDatanodeCheck(String stmt, int offset) { + if (stmt.length() > offset + "ATANODE".length()) { + char c1 = stmt.charAt(++offset); + char c2 = stmt.charAt(++offset); + char c3 = stmt.charAt(++offset); + char c4 = stmt.charAt(++offset); + char c5 = stmt.charAt(++offset); + char c6 = stmt.charAt(++offset); + char c7 = stmt.charAt(++offset); + if ((c1 == 'A' || c1 == 'a') && (c2 == 'T' || c2 == 't') && (c3 == 'A' || c3 == 'a') + && (c4 == 'N' || c4 == 'n') && (c5 == 'O' || c5 == 'o') && (c6 == 'D' || c6 == 'd') + && (c7 == 'E' || c7 == 'e')) { + while (stmt.length() > ++offset) { + switch (stmt.charAt(offset)) { + case ' ': + continue; + case '=': + while (stmt.length() > ++offset) { + switch (stmt.charAt(offset)) { + case ' ': + continue; + default: + return (offset << 8) | DATASOURCE_WHERE; + } + } + return OTHER; + default: + return OTHER; + } + } + } + } + return OTHER; + } + + // SHOW @@PARSER + static int show2PaCheck(String stmt, int offset) { + if (stmt.length() > offset + "RSER".length()) { + char c1 = stmt.charAt(++offset); + char c2 = stmt.charAt(++offset); + char c3 = stmt.charAt(++offset); + char c4 = stmt.charAt(++offset); + if ((c1 == 'R' || c1 == 'r') && (c2 == 'S' || c2 == 's') && (c3 == 'E' || c3 == 'e') + && (c4 == 'R' || c4 == 'r')) { + if (stmt.length() > ++offset && stmt.charAt(offset) != ' ') { + return OTHER; + } + return PARSER; + } + } + return OTHER; + } + + // SHOW @@PROCESSOR + static int show2PrCheck(String stmt, int offset) { + if (stmt.length() > offset + "OCESSOR".length()) { + char c1 = stmt.charAt(++offset); + char c2 = stmt.charAt(++offset); + char c3 = stmt.charAt(++offset); + char c4 = stmt.charAt(++offset); + char c5 = stmt.charAt(++offset); + char c6 = stmt.charAt(++offset); + char c7 = stmt.charAt(++offset); + if ((c1 == 'O' || c1 == 'o') && (c2 == 'C' || c2 == 'c') && (c3 == 'E' || c3 == 'e') + && (c4 == 'S' || c4 == 's') && (c5 == 'S' || c5 == 's') && (c6 == 'O' || c6 == 'o') + && (c7 == 'R' || c7 == 'r')) { + if (stmt.length() > ++offset && stmt.charAt(offset) != ' ') { + return OTHER; + } + return PROCESSOR; + } + } + return OTHER; + } + + // SHOW @@SERVER + // SHOW @@SESSION + static int show2SeCheck(String stmt, int offset) { + if (stmt.length() > offset + "SSION".length()) { + char c1 = stmt.charAt(++offset); + char c2 = stmt.charAt(++offset); + char c3 = stmt.charAt(++offset); + char c4 = stmt.charAt(++offset); + char c5 = stmt.charAt(++offset); + if ((c1 == 'S' || c1 == 's') && (c2 == 'S' || c2 == 's') && (c3 == 'I' || c3 == 'i') + && (c4 == 'O' || c4 == 'o') && (c5 == 'N' || c5 == 'n')) { + if (stmt.length() > ++offset && stmt.charAt(offset) != ' ') { + return OTHER; + } + return SESSION; + } + } + else if (stmt.length() > offset + "RVER".length()) { + char c1 = stmt.charAt(++offset); + char c2 = stmt.charAt(++offset); + char c3 = stmt.charAt(++offset); + char c4 = stmt.charAt(++offset); + if ((c1 == 'R' || c1 == 'r') && (c2 == 'V' || c2 == 'v') && (c3 == 'E' || c3 == 'e') + && (c4 == 'R' || c4 == 'r')) { + if (stmt.length() > ++offset && stmt.charAt(offset) != ' ') { + return OTHER; + } + return SERVER; + } + } + return OTHER; + } + + // SHOW @@THREADPOOL + static int show2ThCheck(String stmt, int offset) { + if (stmt.length() > offset + "READPOOL".length()) { + char c1 = stmt.charAt(++offset); + char c2 = stmt.charAt(++offset); + char c3 = stmt.charAt(++offset); + char c4 = stmt.charAt(++offset); + char c5 = stmt.charAt(++offset); + char c6 = stmt.charAt(++offset); + char c7 = stmt.charAt(++offset); + char c8 = stmt.charAt(++offset); + if ((c1 == 'R' || c1 == 'r') && (c2 == 'E' || c2 == 'e') && (c3 == 'A' || c3 == 'a') + && (c4 == 'D' || c4 == 'd') && (c5 == 'P' || c5 == 'p') && (c6 == 'O' || c6 == 'o') + && (c7 == 'O' || c7 == 'o') && (c8 == 'L' || c8 == 'l')) { + if (stmt.length() > ++offset && stmt.charAt(offset) != ' ') { + return OTHER; + } + return THREADPOOL; + } + } + return OTHER; + } + + // SHOW @@TIME. + static int show2TiCheck(String stmt, int offset) { + if (stmt.length() > offset + "ME.".length()) { + char c1 = stmt.charAt(++offset); + char c2 = stmt.charAt(++offset); + char c3 = stmt.charAt(++offset); + if ((c1 == 'M' || c1 == 'm') && (c2 == 'E' || c2 == 'e') && (c3 == '.')) { + if (stmt.length() > ++offset) { + switch (stmt.charAt(offset)) { + case 'C': + case 'c': + return show2TimeCCheck(stmt, offset); + case 'S': + case 's': + return show2TimeSCheck(stmt, offset); + default: + return OTHER; + } + } + } + } + return OTHER; + } + + // SHOW @@COMMAND + static int show2ComCheck(String stmt, int offset) { + if (stmt.length() > offset + "MAND".length()) { + char c1 = stmt.charAt(++offset); + char c2 = stmt.charAt(++offset); + char c3 = stmt.charAt(++offset); + char c4 = stmt.charAt(++offset); + if ((c1 == 'M' || c1 == 'm') && (c2 == 'A' || c2 == 'a') && (c3 == 'N' || c3 == 'n') + && (c4 == 'D' || c4 == 'd')) { + if (stmt.length() > ++offset && stmt.charAt(offset) != ' ') { + return OTHER; + } + return COMMAND; + } + } + return OTHER; + } + + // SHOW @@CONNECTION + static int show2ConCheck(String stmt, int offset) { + if (stmt.length() > offset + "NECTION".length()) { + char c1 = stmt.charAt(++offset); + char c2 = stmt.charAt(++offset); + char c3 = stmt.charAt(++offset); + char c4 = stmt.charAt(++offset); + char c5 = stmt.charAt(++offset); + char c6 = stmt.charAt(++offset); + char c7 = stmt.charAt(++offset); + if ((c1 == 'N' || c1 == 'n') && (c2 == 'E' || c2 == 'e') && (c3 == 'C' || c3 == 'c') + && (c4 == 'T' || c4 == 't') && (c5 == 'I' || c5 == 'i') && (c6 == 'O' || c6 == 'o') + && (c7 == 'N' || c7 == 'n')) { + if (stmt.length() > ++offset) { + switch (stmt.charAt(offset)) { + case ' ': + return CONNECTION; + case '.': + return show2ConnectonSQL(stmt, offset); + default: + return OTHER; + } + } + return CONNECTION; + } + } + return OTHER; + } + + // SHOW @@CONNECTION.SQL + static int show2ConnectonSQL(String stmt, int offset) { + if (stmt.length() > offset + "SQL".length()) { + char c1 = stmt.charAt(++offset); + char c2 = stmt.charAt(++offset); + char c3 = stmt.charAt(++offset); + if ((c1 == 'S' || c1 == 's') && (c2 == 'Q' || c2 == 'q') && (c3 == 'L' || c3 == 'l')) { + if (stmt.length() > ++offset && stmt.charAt(offset) != ' ') { + return OTHER; + } + return CONNECTION_SQL; + } + } + return OTHER; + } + + // SHOW @@TIME.CURRENT + static int show2TimeCCheck(String stmt, int offset) { + if (stmt.length() > offset + "URRENT".length()) { + char c1 = stmt.charAt(++offset); + char c2 = stmt.charAt(++offset); + char c3 = stmt.charAt(++offset); + char c4 = stmt.charAt(++offset); + char c5 = stmt.charAt(++offset); + char c6 = stmt.charAt(++offset); + if ((c1 == 'U' || c1 == 'u') && (c2 == 'R' || c2 == 'r') && (c3 == 'R' || c3 == 'r') + && (c4 == 'E' || c4 == 'e') && (c5 == 'N' || c5 == 'n') && (c6 == 'T' || c6 == 't')) { + if (stmt.length() > ++offset && stmt.charAt(offset) != ' ') { + return OTHER; + } + return TIME_CURRENT; + } + } + return OTHER; + } + + // SHOW @@TIME.STARTUP + static int show2TimeSCheck(String stmt, int offset) { + if (stmt.length() > offset + "TARTUP".length()) { + char c1 = stmt.charAt(++offset); + char c2 = stmt.charAt(++offset); + char c3 = stmt.charAt(++offset); + char c4 = stmt.charAt(++offset); + char c5 = stmt.charAt(++offset); + char c6 = stmt.charAt(++offset); + if ((c1 == 'T' || c1 == 't') && (c2 == 'A' || c2 == 'a') && (c3 == 'R' || c3 == 'r') + && (c4 == 'T' || c4 == 't') && (c5 == 'U' || c5 == 'u') && (c6 == 'P' || c6 == 'p')) { + if (stmt.length() > ++offset && stmt.charAt(offset) != ' ') { + return OTHER; + } + return TIME_STARTUP; + } + } + return OTHER; + } + + // SHOW @@SQ + static int show2SqCheck(String stmt, int offset) { + if (stmt.length() > ++offset) { + switch (stmt.charAt(offset)) { + case 'L': + case 'l': + return show2SqlCheck(stmt, offset); + default: + return OTHER; + } + } + return OTHER; + } + + // SHOW @@SQL + static int show2SqlCheck(String stmt, int offset) { + if (stmt.length() > ++offset) { + switch (stmt.charAt(offset)) { + case '.': + return show2SqlDotCheck(stmt, offset); + case ' ': + return show2SqlBlankCheck(stmt, offset); + default: + return OTHER; + } + } + else + return SQL; + + } + + // SHOW @@SQL. + static int show2SqlDotCheck(String stmt, int offset) { + if (stmt.length() > ++offset) { + switch (stmt.charAt(offset)) { + case 'D': + case 'd': + return show2SqlDCheck(stmt, offset); + case 'E': + case 'e': + return show2SqlECheck(stmt, offset); + case 'S': + case 's': + char c1 = stmt.charAt(++offset); + switch (c1) { + case 'L': + case 'l': + return show2SqlSLCheck(stmt, offset); + case 'U': + case 'u': + return show2SqlSUCheck(stmt, offset); + } + case 'H': + case 'h': + return show2SqlHCheck(stmt, offset); + case 'C': + case 'c': + return show2SqlCCheck(stmt, offset); + default: + return OTHER; + } + } + return OTHER; + } + + // SHOW @@SQL WHERE ID = XXXXXX + static int show2SqlBlankCheck(String stmt, int offset) { + for (++offset; stmt.length() > offset;) { + switch (stmt.charAt(offset)) { + case ' ': + return SQL; + case 'W': + case 'w': + if (isWhere(stmt, offset)) { + return SQL; + } else { + return OTHER; + } + default: + return OTHER; + } + } + + return OTHER; + } + + // SHOW @@SQL.DETAIL WHERE ID = XXXXXX + static int show2SqlDCheck(String stmt, int offset) { + if (stmt.length() > offset + "ETAIL".length()) { + char c1 = stmt.charAt(++offset); + char c2 = stmt.charAt(++offset); + char c3 = stmt.charAt(++offset); + char c4 = stmt.charAt(++offset); + char c5 = stmt.charAt(++offset); + if ((c1 == 'E' || c1 == 'e') && (c2 == 'T' || c2 == 't') && (c3 == 'A' || c3 == 'a') + && (c4 == 'I' || c4 == 'i') && (c5 == 'L' || c5 == 'l')) { + for (++offset; stmt.length() > offset; ++offset) { + switch (stmt.charAt(offset)) { + case ' ': + continue; + case 'W': + case 'w': + if (isWhere(stmt, offset)) { + return SQL_DETAIL; + } else { + return OTHER; + } + default: + return OTHER; + } + } + } + } + return OTHER; + } + + // SHOW @@SQL.EXECUTE + static int show2SqlECheck(String stmt, int offset) { + if (stmt.length() > offset + "XECUTE".length()) { + char c1 = stmt.charAt(++offset); + char c2 = stmt.charAt(++offset); + char c3 = stmt.charAt(++offset); + char c4 = stmt.charAt(++offset); + char c5 = stmt.charAt(++offset); + char c6 = stmt.charAt(++offset); + if ((c1 == 'X' || c1 == 'x') && (c2 == 'E' || c2 == 'e') && (c3 == 'C' || c3 == 'c') + && (c4 == 'U' || c4 == 'u') && (c5 == 'T' || c5 == 't') && (c6 == 'E' || c6 == 'e')) { + if (stmt.length() > ++offset && stmt.charAt(offset) != ' ') { + return OTHER; + } + return SQL_EXECUTE; + } + } + return OTHER; + } + + // SHOW @@SQL.SLOW + static int show2SqlSLCheck(String stmt, int offset) { + if (stmt.length() > offset + "OW".length()) { + char c1 = stmt.charAt(++offset); + char c2 = stmt.charAt(++offset); + if ((c1 == 'O' || c1 == 'o') && (c2 == 'W' || c2 == 'w')) { + if (stmt.length() > ++offset && stmt.charAt(offset) != ' ') { + return OTHER; + } + return SQL_SLOW; + } + } + return OTHER; + } + + // SHOW @@SQL.HIGH + static int show2SqlHCheck(String stmt, int offset) { + + if (stmt.length() > offset + "IGH".length()) { + char c1 = stmt.charAt(++offset); + char c2 = stmt.charAt(++offset); + char c3 = stmt.charAt(++offset); + if ((c1 == 'I' || c1 == 'i') && (c2 == 'G' || c2 == 'g') && (c3 == 'H' || c3 == 'h') ) { + if (stmt.length() > ++offset && stmt.charAt(offset) != ' ') { + return OTHER; + } + return SQL_HIGH; + } + } + return OTHER; + } + + // SHOW @@sql.condition + static int show2SqlCCheck(String stmt, int offset) { + + if (stmt.length() > offset + "ONDITION".length()) { + char c1 = stmt.charAt(++offset); + char c2 = stmt.charAt(++offset); + char c3 = stmt.charAt(++offset); + char c4 = stmt.charAt(++offset); + char c5 = stmt.charAt(++offset); + char c6 = stmt.charAt(++offset); + char c7 = stmt.charAt(++offset); + char c8 = stmt.charAt(++offset); + if ( (c1 == 'O' || c1 == 'o') && (c2 == 'N' || c2 == 'n') && (c3 == 'D' || c3 == 'd') && + (c4 == 'I' || c4 == 'i') && (c5 == 'T' || c5 == 't') && (c6 == 'I' || c6 == 'i') && + (c7 == 'O' || c7 == 'o') && (c8 == 'N' || c8 == 'n') ) { + if (stmt.length() > ++offset && stmt.charAt(offset) != ' ') { + return OTHER; + } + return SQL_CONDITION; + } + } + return OTHER; + } + + // SHOW @@SQL.SUM + static int show2SqlSUCheck(String stmt, int offset) { + if (stmt.length() > offset + "M".length()) { + char c1 = stmt.charAt(++offset); + if ( c1 == 'M' || c1 == 'm') { + if (stmt.length() > ++offset && stmt.charAt(offset) == '.') { + + /** + * TODO: modify by zhuam + * + * 兼容之前指令 + * 在保留 SHOW @@SQL.SUM 指令的同时, 扩展支持 SHOW @@SQL.SUM.TABLE 、 SHOW @@SQL.SUM.USER + */ + if ( stmt.length() > (offset+4) ) { + char c2 = stmt.charAt(++offset); + char c3 = stmt.charAt(++offset); + char c4 = stmt.charAt(++offset); + char c5 = stmt.charAt(++offset); + + if ( (c2 == 'U' || c2 == 'u') && (c3 == 'S' || c3 == 's') + && (c4 == 'E' || c4 == 'e') && (c5 == 'R' || c5 == 'r') ) { + return SQL_SUM_USER; + + } else if ( (c2 == 'T' || c2 == 't') && (c3 == 'A' || c3 == 'a') + && (c4 == 'B' || c4 == 'b') && (c5 == 'L' || c5 == 'l') ) { + + if ( stmt.length() > (offset+1) ) { + char c6 = stmt.charAt(++offset); + if ( c6 == 'E' || c6 == 'e') { + return SQL_SUM_TABLE; + } + } + } + + } + + return OTHER; + } + return SQL_SUM_USER; + } + } + return OTHER; + } + + + static boolean isWhere(String stmt, int offset) { + if (stmt.length() > offset + 5) { + char c1 = stmt.charAt(++offset); + char c2 = stmt.charAt(++offset); + char c3 = stmt.charAt(++offset); + char c4 = stmt.charAt(++offset); + char c5 = stmt.charAt(++offset); + if ((c1 == 'H' || c1 == 'h') && (c2 == 'E' || c2 == 'e') && (c3 == 'R' || c3 == 'r') + && (c4 == 'E' || c4 == 'e') && (c5 == ' ')) { + boolean jump1 = false; + for (++offset; stmt.length() > offset && !jump1; ++offset) { + switch (stmt.charAt(offset)) { + case ' ': + continue; + case 'I': + case 'i': + jump1 = true; + break; + default: + return false; + } + } + if ((stmt.length() > offset) && (stmt.charAt(offset) == 'D' || stmt.charAt(offset) == 'd')) { + boolean jump2 = false; + for (++offset; stmt.length() > offset && !jump2; ++offset) { + switch (stmt.charAt(offset)) { + case ' ': + continue; + case '=': + jump2 = true; + break; + default: + return false; + } + } + return isSqlId(stmt, offset); + } + } + } + return false; + } + + static boolean isSqlId(String stmt, int offset) { + String id = stmt.substring(offset).trim(); + try { + Long.parseLong(id); + } catch (Exception e) { + return false; + } + return true; + } + + public static String getWhereParameter(String stmt) { + int offset = stmt.indexOf('='); + ++offset; + return stmt.substring(offset).trim(); + } + } \ No newline at end of file diff --git a/src/main/java/org/opencloudb/response/ReloadQueryCf.java b/src/main/java/org/opencloudb/response/ReloadQueryCf.java new file mode 100644 index 000000000..76774afad --- /dev/null +++ b/src/main/java/org/opencloudb/response/ReloadQueryCf.java @@ -0,0 +1,32 @@ +package org.opencloudb.response; + + +import org.apache.log4j.Logger; +import org.opencloudb.manager.ManagerConnection; +import org.opencloudb.net.mysql.OkPacket; +import org.opencloudb.stat.QueryConditionAnalyzer; + +public class ReloadQueryCf { + + private static final Logger logger = Logger.getLogger(ReloadSqlSlowTime.class); + + public static void execute(ManagerConnection c, String filter) { + + QueryConditionAnalyzer.getInstance().setTableColumnFilter(filter); + + StringBuilder s = new StringBuilder(); + s.append(c).append("Reset show @@sql.condition="+ filter +" success by manager"); + + logger.warn(s.toString()); + + OkPacket ok = new OkPacket(); + ok.packetId = 1; + ok.affectedRows = 1; + ok.serverStatus = 2; + ok.message = "Reset show @@sql.condition success".getBytes(); + ok.write(c); + + System.out.println(s.toString()); + } + +} diff --git a/src/main/java/org/opencloudb/response/ShowSQLCondition.java b/src/main/java/org/opencloudb/response/ShowSQLCondition.java new file mode 100644 index 000000000..da15a169b --- /dev/null +++ b/src/main/java/org/opencloudb/response/ShowSQLCondition.java @@ -0,0 +1,115 @@ +package org.opencloudb.response; + +import java.nio.ByteBuffer; +import java.util.List; +import java.util.Map; + +import org.opencloudb.config.Fields; +import org.opencloudb.manager.ManagerConnection; +import org.opencloudb.mysql.PacketUtil; +import org.opencloudb.net.mysql.EOFPacket; +import org.opencloudb.net.mysql.FieldPacket; +import org.opencloudb.net.mysql.ResultSetHeaderPacket; +import org.opencloudb.net.mysql.RowDataPacket; +import org.opencloudb.stat.QueryConditionAnalyzer; +import org.opencloudb.util.LongUtil; +import org.opencloudb.util.StringUtil; + +/** + * SQL 查询条件 值统计 + * + * @author zhuam + * + */ +public class ShowSQLCondition { + + private static final int FIELD_COUNT = 4; + private static final ResultSetHeaderPacket header = PacketUtil.getHeader(FIELD_COUNT); + private static final FieldPacket[] fields = new FieldPacket[FIELD_COUNT]; + private static final EOFPacket eof = new EOFPacket(); + + static { + int i = 0; + byte packetId = 0; + header.packetId = ++packetId; + + fields[i] = PacketUtil.getField("ID", Fields.FIELD_TYPE_LONGLONG); + fields[i++].packetId = ++packetId; + + fields[i] = PacketUtil.getField("KEY", Fields.FIELD_TYPE_VAR_STRING); + fields[i++].packetId = ++packetId; + + fields[i] = PacketUtil.getField("VALUE", Fields.FIELD_TYPE_VAR_STRING); + fields[i++].packetId = ++packetId; + + fields[i] = PacketUtil.getField("COUNT", Fields.FIELD_TYPE_LONGLONG); + fields[i++].packetId = ++packetId; + + eof.packetId = ++packetId; + } + + public static void execute(ManagerConnection c) { + ByteBuffer buffer = c.allocate(); + + // write header + buffer = header.write(buffer, c,true); + + // write fields + for (FieldPacket field : fields) { + buffer = field.write(buffer, c,true); + } + + // write eof + buffer = eof.write(buffer, c,true); + + // write rows + byte packetId = eof.packetId; + + String key = QueryConditionAnalyzer.getInstance().getKey(); + List> list = QueryConditionAnalyzer.getInstance().getValues(); + if ( list != null ) { + + int size = list.size(); + long total = 0L; + + for (int i = 0; i < size; i++) { + Map.Entry entry = list.get(i); + Object value = entry.getKey(); + Long count = entry.getValue(); + total += count; + + RowDataPacket row = getRow(i, key, value.toString(), count, c.getCharset()); + row.packetId = ++packetId; + buffer = row.write(buffer, c,true); + } + + RowDataPacket vk_row = getRow(size + 1, "VALUE KEY", "size", size, c.getCharset()); + vk_row.packetId = ++packetId; + buffer = vk_row.write(buffer, c,true); + + RowDataPacket vc_row = getRow(size + 2, "VALUE COUNT", "total", total, c.getCharset()); + vc_row.packetId = ++packetId; + buffer = vc_row.write(buffer, c,true); + + } + + // write last eof + EOFPacket lastEof = new EOFPacket(); + lastEof.packetId = ++packetId; + buffer = lastEof.write(buffer, c,true); + + // write buffer + c.write(buffer); + } + + private static RowDataPacket getRow(int i, String key, String value, long count, String charset) { + RowDataPacket row = new RowDataPacket(FIELD_COUNT); + row.add( LongUtil.toBytes( i ) ); + row.add( StringUtil.encode(key, charset) ); + row.add( StringUtil.encode(value, charset) ); + row.add( LongUtil.toBytes( count ) ); + return row; + } + + +} diff --git a/src/main/java/org/opencloudb/stat/HostStatAnalyzer.java b/src/main/java/org/opencloudb/stat/HostStatAnalyzer.java new file mode 100644 index 000000000..235472cb6 --- /dev/null +++ b/src/main/java/org/opencloudb/stat/HostStatAnalyzer.java @@ -0,0 +1,16 @@ +package org.opencloudb.stat; + +/** + * 前端SQL客户端主机 的访问统计 + * + * @author zhuam + * + */ +public class HostStatAnalyzer implements QueryResultListener { + + @Override + public void onQuery(QueryResult query) { + + } + +} diff --git a/src/main/java/org/opencloudb/stat/QueryConditionAnalyzer.java b/src/main/java/org/opencloudb/stat/QueryConditionAnalyzer.java new file mode 100644 index 000000000..9caca9237 --- /dev/null +++ b/src/main/java/org/opencloudb/stat/QueryConditionAnalyzer.java @@ -0,0 +1,214 @@ +package org.opencloudb.stat; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.locks.ReentrantLock; + +import org.opencloudb.server.parser.ServerParse; + +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.dialect.mysql.parser.MySqlStatementParser; +import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlSchemaStatVisitor; +import com.alibaba.druid.stat.TableStat.Condition; + +/** + * 特定 SQL 查询条件的统计分析 + * -------------------------------------------------- + * + * 例: + * SELECT * FROM v1user Where userName=? AND cityName =? + * SELECT * FROM v1user Where userName=? + * SELECT * FROM v1user Where userName=? AND age > 20 + * + * SELECT * FROM v1user Where userName = "张三" AND cityName = "北京"; + * SELECT * FROM v1user Where userName = "李四" + * SELECT * FROM v1user Where userName = "张三" AND age > 20 + * + * 现在我们希望知道DB 中 业务比较关注的 userName 有哪些,次数是多少, 怎么处理哩,如下 + * + * 设置: 表名&条件列 ( v1user&userName ) 即可,取消请设置 NULL + * + * @author zhuam + * + */ +public class QueryConditionAnalyzer implements QueryResultListener { + + private String tableName = null; + private String columnName = null; + + // column value -> count + private final HashMap map = new HashMap(); + + private ReentrantLock lock = new ReentrantLock(); + + private SQLParser sqlParser = new SQLParser(); + + private final static QueryConditionAnalyzer instance = new QueryConditionAnalyzer(); + + private QueryConditionAnalyzer() {} + + public static QueryConditionAnalyzer getInstance() { + return instance; + } + + + @Override + public void onQuery(QueryResult query) { + + this.lock.lock(); + try { + + int sqlType = query.getSqlType(); + String sql = query.getSql(); + + switch(sqlType) { + case ServerParse.SELECT: + + List values = sqlParser.parseConditionValues(sql, this.tableName, this.columnName); + if ( values != null ) { + for(Object value : values) { + + Long count = this.map.get(value); + if (count == null) { + count = 1L; + } else { + count++; + } + this.map.put(value, count); + } + } + } + + } finally { + this.lock.unlock(); + } + } + + public boolean setTableColumnFilter(String filter) { + + boolean isOk = false; + + this.lock.lock(); + try { + + if ( !"NULL".equalsIgnoreCase(filter) ) { + + String[] table_column = filter.split("&"); + if ( table_column != null && table_column.length == 2 ) { + this.tableName = table_column[0]; + this.columnName = table_column[1]; + this.map.clear(); + + isOk = true; + } + + } else { + + this.tableName = null; + this.columnName = null; + this.map.clear(); + + isOk = true; + } + + } finally { + this.lock.unlock(); + } + + return isOk; + } + + public String getKey() { + return this.tableName + "." + this.columnName; + } + + public List> getValues() { + List> list = new ArrayList>(map.entrySet()); + return list; + } + + + // SQL 解析 + class SQLParser { + + /** + * 去掉库名、去掉`` + * @param tableName + * @return + */ + private String fixName(String tableName) { + if ( tableName != null ) { + tableName = tableName.replace("`", ""); + int dotIdx = tableName.indexOf("."); + if ( dotIdx > 0 ) { + tableName = tableName.substring(1 + dotIdx).trim(); + } + } + return tableName; + } + + /** + * 解析 SQL 获取指定表及条件列的值 + * + * @param sql + * @param tableName + * @param colnumName + * @return + */ + public List parseConditionValues(String sql, String tableName, String colnumName) { + + List values = null; + + if ( sql != null && tableName != null && columnName != null ) { + + values = new ArrayList(); + + MySqlStatementParser parser = new MySqlStatementParser(sql); + SQLStatement stmt = parser.parseStatement(); + + MySqlSchemaStatVisitor visitor = new MySqlSchemaStatVisitor(); + stmt.accept(visitor); + + String currentTable = visitor.getCurrentTable(); + if ( tableName.equalsIgnoreCase( currentTable ) ) { + + List conditions = visitor.getConditions(); + for(Condition condition: conditions) { + + String ccN = condition.getColumn().getName(); + ccN = fixName(ccN); + + if ( colnumName.equalsIgnoreCase( ccN ) ) { + List ccVL = condition.getValues(); + values.addAll( ccVL ); + } + } + } + } + return values; + } + } + + /* public static void main(String arg[]) { + + String sql = "SELECT `fnum`, `forg`, `fdst`, `airline`, `ftype` , `ports_of_call`, " + + "`scheduled_deptime`, `scheduled_arrtime`, `actual_deptime`, `actual_arrtime`, " + + "`flight_status_code` FROM dynamic " + + "WHERE `fnum` = 'CA123' AND `forg` = 'PEK' AND `fdst` = 'SHA' " + + "AND `scheduled_deptime` BETWEEN 1212121 AND 232323233 " + + "AND `fservice` = 'J' AND `fcategory` = 1 " + + "AND `share_execute_flag` = 1 ORDER BY scheduled_deptime"; + + QueryResult qr = new QueryResult("zhuam", ServerParse.SELECT, sql, 0); + + QueryConditionAnalyzer analyzer = QueryConditionAnalyzer.getInstance(); + analyzer.setTableColumnFilter("dynamic&fnum"); + analyzer.onQuery(qr); + + List> list = analyzer.getValues(); + System.out.println( list ); + }*/ + +} \ No newline at end of file diff --git a/src/main/java/org/opencloudb/stat/QueryResultDispatcher.java b/src/main/java/org/opencloudb/stat/QueryResultDispatcher.java index 94fad9dd7..8ff291df6 100644 --- a/src/main/java/org/opencloudb/stat/QueryResultDispatcher.java +++ b/src/main/java/org/opencloudb/stat/QueryResultDispatcher.java @@ -1,64 +1,65 @@ -package org.opencloudb.stat; - -import java.util.List; -import java.util.concurrent.CopyOnWriteArrayList; - -import org.apache.log4j.Logger; -import org.opencloudb.MycatServer; - -/** - * SQL执行后的派发 QueryResult 事件 - * - * @author zhuam - * - */ -public class QueryResultDispatcher { - - private static final Logger LOGGER = Logger.getLogger(QueryResultDispatcher.class); - - private static List listeners = new CopyOnWriteArrayList(); - - // 初始化强制加载 - static { - listeners.add( UserStatAnalyzer.getInstance() ); - listeners.add( TableStatAnalyzer.getInstance() ); - listeners.add( HighFrequencySqlAnalyzer.getInstance() ); - } - - public static void addListener(QueryResultListener listener) { - if (listener == null) { - throw new NullPointerException(); - } - listeners.add(listener); - } - - public static void removeListener(QueryResultListener listener) { - listeners.remove(listener); - } - - public static void removeAllListener() { - listeners.clear(); - } - - public static void dispatchQuery(final QueryResult query) { - - //TODO:异步分发,待进一步调优 - MycatServer.getInstance().getBusinessExecutor().execute(new Runnable() { - - public void run() { - //注入 结束时间 - long now = System.currentTimeMillis(); - query.setEndTime( now ); - - for(QueryResultListener listener: listeners) { - try { - listener.onQuery( query ); - } catch(Exception e) { - LOGGER.error(e); - } - } - } - }); - } - +package org.opencloudb.stat; + +import java.util.List; +import java.util.concurrent.CopyOnWriteArrayList; + +import org.apache.log4j.Logger; +import org.opencloudb.MycatServer; + +/** + * SQL执行后的派发 QueryResult 事件 + * + * @author zhuam + * + */ +public class QueryResultDispatcher { + + private static final Logger LOGGER = Logger.getLogger(QueryResultDispatcher.class); + + private static List listeners = new CopyOnWriteArrayList(); + + // 初始化强制加载 + static { + listeners.add( UserStatAnalyzer.getInstance() ); + listeners.add( TableStatAnalyzer.getInstance() ); + listeners.add( HighFrequencySqlAnalyzer.getInstance() ); + listeners.add( QueryConditionAnalyzer.getInstance() ); + } + + public static void addListener(QueryResultListener listener) { + if (listener == null) { + throw new NullPointerException(); + } + listeners.add(listener); + } + + public static void removeListener(QueryResultListener listener) { + listeners.remove(listener); + } + + public static void removeAllListener() { + listeners.clear(); + } + + public static void dispatchQuery(final QueryResult query) { + + //TODO:异步分发,待进一步调优 + MycatServer.getInstance().getBusinessExecutor().execute(new Runnable() { + + public void run() { + //注入 结束时间 + long now = System.currentTimeMillis(); + query.setEndTime( now ); + + for(QueryResultListener listener: listeners) { + try { + listener.onQuery( query ); + } catch(Exception e) { + LOGGER.error(e); + } + } + } + }); + } + } \ No newline at end of file From f34cd1fed1af1f603a5ccf8d903f06518c02f519 Mon Sep 17 00:00:00 2001 From: zhuam Date: Fri, 25 Dec 2015 18:14:11 +0800 Subject: [PATCH 2/3] =?UTF-8?q?=E7=BB=93=E6=9E=9C=E9=9B=86=E5=AD=97?= =?UTF-8?q?=E6=AE=B5=E8=BF=94=E5=9B=9E=E9=A1=BA=E5=BA=8F=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/opencloudb/response/ShowSQL.java | 256 +++++------ .../org/opencloudb/response/ShowSQLHigh.java | 220 ++++----- .../stat/HighFrequencySqlAnalyzer.java | 418 +++++++++--------- .../stat/QueryConditionAnalyzer.java | 7 +- .../java/org/opencloudb/stat/TableStat.java | 278 ++++++------ 5 files changed, 590 insertions(+), 589 deletions(-) diff --git a/src/main/java/org/opencloudb/response/ShowSQL.java b/src/main/java/org/opencloudb/response/ShowSQL.java index f142f26f3..9d6915612 100644 --- a/src/main/java/org/opencloudb/response/ShowSQL.java +++ b/src/main/java/org/opencloudb/response/ShowSQL.java @@ -1,129 +1,129 @@ -/* - * Copyright (c) 2013, OpenCloudDB/MyCAT and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software;Designed and Developed mainly by many Chinese - * opensource volunteers. you can redistribute it and/or modify it under the - * terms of the GNU General Public License version 2 only, as published by the - * Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Any questions about this component can be directed to it's project Web address - * https://code.google.com/p/opencloudb/. - * - */ -package org.opencloudb.response; - -import java.nio.ByteBuffer; -import java.util.Map; - -import org.opencloudb.config.Fields; -import org.opencloudb.manager.ManagerConnection; -import org.opencloudb.mysql.PacketUtil; -import org.opencloudb.net.mysql.EOFPacket; -import org.opencloudb.net.mysql.FieldPacket; -import org.opencloudb.net.mysql.ResultSetHeaderPacket; -import org.opencloudb.net.mysql.RowDataPacket; -import org.opencloudb.stat.UserStatAnalyzer; - -import org.opencloudb.stat.UserSqlStat; -import org.opencloudb.stat.UserStat; -import org.opencloudb.util.LongUtil; -import org.opencloudb.util.StringUtil; - - -/** - * 查询用户最近执行的SQL记录 - * - * @author mycat - * @author zhuam - */ -public final class ShowSQL { - - private static final int FIELD_COUNT = 5; - private static final ResultSetHeaderPacket header = PacketUtil.getHeader(FIELD_COUNT); - private static final FieldPacket[] fields = new FieldPacket[FIELD_COUNT]; - private static final EOFPacket eof = new EOFPacket(); - static { - int i = 0; - byte packetId = 0; - header.packetId = ++packetId; - - fields[i] = PacketUtil.getField("ID", Fields.FIELD_TYPE_LONGLONG); - fields[i++].packetId = ++packetId; - - fields[i] = PacketUtil.getField("USER", Fields.FIELD_TYPE_VARCHAR); - fields[i++].packetId = ++packetId; - - fields[i] = PacketUtil.getField("SQL", Fields.FIELD_TYPE_VAR_STRING); - fields[i++].packetId = ++packetId; - - fields[i] = PacketUtil.getField("START_TIME", Fields.FIELD_TYPE_LONGLONG); - fields[i++].packetId = ++packetId; - - fields[i] = PacketUtil.getField("EXECUTE_TIME", Fields.FIELD_TYPE_LONGLONG); - fields[i++].packetId = ++packetId; - - eof.packetId = ++packetId; - } - - public static void execute(ManagerConnection c, long sql) { - ByteBuffer buffer = c.allocate(); - - // write header - buffer = header.write(buffer, c,true); - - // write fields - for (FieldPacket field : fields) { - buffer = field.write(buffer, c,true); - } - - // write eof - buffer = eof.write(buffer, c,true); - - // write rows - byte packetId = eof.packetId; - Map statMap = UserStatAnalyzer.getInstance().getUserStatMap(); - for (UserStat userStat : statMap.values()) { - String user = userStat.getUser(); - UserSqlStat.Sql[] sqls = userStat.getSqlStat().getSqls(); - for (int i = sqls.length - 1; i >= 0; i--) { - if (sqls[i] != null) { - RowDataPacket row = getRow(user, sqls[i], i, c.getCharset()); - row.packetId = ++packetId; - buffer = row.write(buffer, c,true); - } - } - } - - - // write last eof - EOFPacket lastEof = new EOFPacket(); - lastEof.packetId = ++packetId; - buffer = lastEof.write(buffer, c,true); - - // write buffer - c.write(buffer); - } - - private static RowDataPacket getRow(String user, UserSqlStat.Sql sql, int idx, String charset) { - - RowDataPacket row = new RowDataPacket(FIELD_COUNT); - row.add(LongUtil.toBytes(idx)); - row.add( StringUtil.encode( user, charset) ); - row.add( StringUtil.encode( sql.getSql(), charset) ); - row.add( LongUtil.toBytes( sql.getStartTime() ) ); - row.add( LongUtil.toBytes( sql.getExecuteTime() ) ); - return row; - } - +/* + * Copyright (c) 2013, OpenCloudDB/MyCAT and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software;Designed and Developed mainly by many Chinese + * opensource volunteers. you can redistribute it and/or modify it under the + * terms of the GNU General Public License version 2 only, as published by the + * Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Any questions about this component can be directed to it's project Web address + * https://code.google.com/p/opencloudb/. + * + */ +package org.opencloudb.response; + +import java.nio.ByteBuffer; +import java.util.Map; + +import org.opencloudb.config.Fields; +import org.opencloudb.manager.ManagerConnection; +import org.opencloudb.mysql.PacketUtil; +import org.opencloudb.net.mysql.EOFPacket; +import org.opencloudb.net.mysql.FieldPacket; +import org.opencloudb.net.mysql.ResultSetHeaderPacket; +import org.opencloudb.net.mysql.RowDataPacket; +import org.opencloudb.stat.UserStatAnalyzer; + +import org.opencloudb.stat.UserSqlStat; +import org.opencloudb.stat.UserStat; +import org.opencloudb.util.LongUtil; +import org.opencloudb.util.StringUtil; + + +/** + * 查询用户最近执行的SQL记录 + * + * @author mycat + * @author zhuam + */ +public final class ShowSQL { + + private static final int FIELD_COUNT = 5; + private static final ResultSetHeaderPacket header = PacketUtil.getHeader(FIELD_COUNT); + private static final FieldPacket[] fields = new FieldPacket[FIELD_COUNT]; + private static final EOFPacket eof = new EOFPacket(); + static { + int i = 0; + byte packetId = 0; + header.packetId = ++packetId; + + fields[i] = PacketUtil.getField("ID", Fields.FIELD_TYPE_LONGLONG); + fields[i++].packetId = ++packetId; + + fields[i] = PacketUtil.getField("USER", Fields.FIELD_TYPE_VARCHAR); + fields[i++].packetId = ++packetId; + + fields[i] = PacketUtil.getField("START_TIME", Fields.FIELD_TYPE_LONGLONG); + fields[i++].packetId = ++packetId; + + fields[i] = PacketUtil.getField("EXECUTE_TIME", Fields.FIELD_TYPE_LONGLONG); + fields[i++].packetId = ++packetId; + + fields[i] = PacketUtil.getField("SQL", Fields.FIELD_TYPE_VAR_STRING); + fields[i++].packetId = ++packetId; + + eof.packetId = ++packetId; + } + + public static void execute(ManagerConnection c, long sql) { + ByteBuffer buffer = c.allocate(); + + // write header + buffer = header.write(buffer, c,true); + + // write fields + for (FieldPacket field : fields) { + buffer = field.write(buffer, c,true); + } + + // write eof + buffer = eof.write(buffer, c,true); + + // write rows + byte packetId = eof.packetId; + Map statMap = UserStatAnalyzer.getInstance().getUserStatMap(); + for (UserStat userStat : statMap.values()) { + String user = userStat.getUser(); + UserSqlStat.Sql[] sqls = userStat.getSqlStat().getSqls(); + for (int i = sqls.length - 1; i >= 0; i--) { + if (sqls[i] != null) { + RowDataPacket row = getRow(user, sqls[i], i, c.getCharset()); + row.packetId = ++packetId; + buffer = row.write(buffer, c,true); + } + } + } + + + // write last eof + EOFPacket lastEof = new EOFPacket(); + lastEof.packetId = ++packetId; + buffer = lastEof.write(buffer, c,true); + + // write buffer + c.write(buffer); + } + + private static RowDataPacket getRow(String user, UserSqlStat.Sql sql, int idx, String charset) { + + RowDataPacket row = new RowDataPacket(FIELD_COUNT); + row.add(LongUtil.toBytes(idx)); + row.add( StringUtil.encode( user, charset) ); + row.add( LongUtil.toBytes( sql.getStartTime() ) ); + row.add( LongUtil.toBytes( sql.getExecuteTime() ) ); + row.add( StringUtil.encode( sql.getSql(), charset) ); + return row; + } + } \ No newline at end of file diff --git a/src/main/java/org/opencloudb/response/ShowSQLHigh.java b/src/main/java/org/opencloudb/response/ShowSQLHigh.java index 1fbe7b83a..073f2b0bd 100644 --- a/src/main/java/org/opencloudb/response/ShowSQLHigh.java +++ b/src/main/java/org/opencloudb/response/ShowSQLHigh.java @@ -1,110 +1,110 @@ -package org.opencloudb.response; - -import java.nio.ByteBuffer; -import java.util.List; -import java.util.Map; - -import org.opencloudb.config.Fields; -import org.opencloudb.manager.ManagerConnection; -import org.opencloudb.mysql.PacketUtil; -import org.opencloudb.net.mysql.EOFPacket; -import org.opencloudb.net.mysql.FieldPacket; -import org.opencloudb.net.mysql.ResultSetHeaderPacket; -import org.opencloudb.net.mysql.RowDataPacket; -import org.opencloudb.stat.HighFrequencySqlAnalyzer; -import org.opencloudb.stat.HighFrequencySqlAnalyzer.SqlFrequency; -import org.opencloudb.util.LongUtil; -import org.opencloudb.util.StringUtil; - -/** - * 查询高频 SQL - * - * @author zhuam - * - */ -public final class ShowSQLHigh { - - private static final int FIELD_COUNT = 8; - private static final ResultSetHeaderPacket header = PacketUtil.getHeader(FIELD_COUNT); - private static final FieldPacket[] fields = new FieldPacket[FIELD_COUNT]; - private static final EOFPacket eof = new EOFPacket(); - - static { - int i = 0; - byte packetId = 0; - header.packetId = ++packetId; - - fields[i] = PacketUtil.getField("ID", Fields.FIELD_TYPE_LONGLONG); - fields[i++].packetId = ++packetId; - - fields[i] = PacketUtil.getField("SQL", Fields.FIELD_TYPE_VAR_STRING); - fields[i++].packetId = ++packetId; - - fields[i] = PacketUtil.getField("FREQUENCY", Fields.FIELD_TYPE_LONGLONG); - fields[i++].packetId = ++packetId; - - fields[i] = PacketUtil.getField("AVG_TIME", Fields.FIELD_TYPE_LONGLONG); - fields[i++].packetId = ++packetId; - fields[i] = PacketUtil.getField("MAX_TIME", Fields.FIELD_TYPE_LONGLONG); - fields[i++].packetId = ++packetId; - fields[i] = PacketUtil.getField("MIN_TIME", Fields.FIELD_TYPE_LONGLONG); - fields[i++].packetId = ++packetId; - fields[i] = PacketUtil.getField("EXECUTE_TIME", Fields.FIELD_TYPE_LONGLONG); - fields[i++].packetId = ++packetId; - - fields[i] = PacketUtil.getField("LAST_TIME", Fields.FIELD_TYPE_LONGLONG); - fields[i++].packetId = ++packetId; - - eof.packetId = ++packetId; - } - - public static void execute(ManagerConnection c) { - ByteBuffer buffer = c.allocate(); - - // write header - buffer = header.write(buffer, c,true); - - // write fields - for (FieldPacket field : fields) { - buffer = field.write(buffer, c,true); - } - - // write eof - buffer = eof.write(buffer, c,true); - - // write rows - byte packetId = eof.packetId; - List> list = HighFrequencySqlAnalyzer.getInstance().getSqlFrequency(); - if ( list != null ) { - for (int i = 0; i < list.size(); i++) { - SqlFrequency sqlFrequency = list.get(i).getValue(); - RowDataPacket row = getRow(i, sqlFrequency.getSql(), sqlFrequency.getCount(), sqlFrequency.getAvgTime(),sqlFrequency.getMaxTime(),sqlFrequency.getMinTime(),sqlFrequency.getExecuteTime(),sqlFrequency.getLastTime(), c.getCharset()); - row.packetId = ++packetId; - buffer = row.write(buffer, c,true); - } - } - - // write last eof - EOFPacket lastEof = new EOFPacket(); - lastEof.packetId = ++packetId; - buffer = lastEof.write(buffer, c,true); - - // write buffer - c.write(buffer); - } - - private static RowDataPacket getRow(int i, String sql, int count, long avgTime,long maxTime,long minTime,long executTime,long lastTime, String charset) { - RowDataPacket row = new RowDataPacket(FIELD_COUNT); - row.add( LongUtil.toBytes( i ) ); - row.add( StringUtil.encode(sql, charset) ); - row.add( LongUtil.toBytes( count ) ); - row.add( LongUtil.toBytes( avgTime ) ); - row.add( LongUtil.toBytes( maxTime ) ); - row.add( LongUtil.toBytes( minTime ) ); - row.add( LongUtil.toBytes( executTime ) ); - row.add( LongUtil.toBytes( lastTime ) ); - return row; - } - - -} +package org.opencloudb.response; + +import java.nio.ByteBuffer; +import java.util.List; +import java.util.Map; + +import org.opencloudb.config.Fields; +import org.opencloudb.manager.ManagerConnection; +import org.opencloudb.mysql.PacketUtil; +import org.opencloudb.net.mysql.EOFPacket; +import org.opencloudb.net.mysql.FieldPacket; +import org.opencloudb.net.mysql.ResultSetHeaderPacket; +import org.opencloudb.net.mysql.RowDataPacket; +import org.opencloudb.stat.HighFrequencySqlAnalyzer; +import org.opencloudb.stat.HighFrequencySqlAnalyzer.SqlFrequency; +import org.opencloudb.util.LongUtil; +import org.opencloudb.util.StringUtil; + +/** + * 查询高频 SQL + * + * @author zhuam + * + */ +public final class ShowSQLHigh { + + private static final int FIELD_COUNT = 8; + private static final ResultSetHeaderPacket header = PacketUtil.getHeader(FIELD_COUNT); + private static final FieldPacket[] fields = new FieldPacket[FIELD_COUNT]; + private static final EOFPacket eof = new EOFPacket(); + + static { + int i = 0; + byte packetId = 0; + header.packetId = ++packetId; + + fields[i] = PacketUtil.getField("ID", Fields.FIELD_TYPE_LONGLONG); + fields[i++].packetId = ++packetId; + + fields[i] = PacketUtil.getField("FREQUENCY", Fields.FIELD_TYPE_LONGLONG); + fields[i++].packetId = ++packetId; + + fields[i] = PacketUtil.getField("AVG_TIME", Fields.FIELD_TYPE_LONGLONG); + fields[i++].packetId = ++packetId; + fields[i] = PacketUtil.getField("MAX_TIME", Fields.FIELD_TYPE_LONGLONG); + fields[i++].packetId = ++packetId; + fields[i] = PacketUtil.getField("MIN_TIME", Fields.FIELD_TYPE_LONGLONG); + fields[i++].packetId = ++packetId; + fields[i] = PacketUtil.getField("EXECUTE_TIME", Fields.FIELD_TYPE_LONGLONG); + fields[i++].packetId = ++packetId; + + fields[i] = PacketUtil.getField("LAST_TIME", Fields.FIELD_TYPE_LONGLONG); + fields[i++].packetId = ++packetId; + + fields[i] = PacketUtil.getField("SQL", Fields.FIELD_TYPE_VAR_STRING); + fields[i++].packetId = ++packetId; + + eof.packetId = ++packetId; + } + + public static void execute(ManagerConnection c) { + ByteBuffer buffer = c.allocate(); + + // write header + buffer = header.write(buffer, c,true); + + // write fields + for (FieldPacket field : fields) { + buffer = field.write(buffer, c,true); + } + + // write eof + buffer = eof.write(buffer, c,true); + + // write rows + byte packetId = eof.packetId; + List> list = HighFrequencySqlAnalyzer.getInstance().getSqlFrequency(); + if ( list != null ) { + for (int i = 0; i < list.size(); i++) { + SqlFrequency sqlFrequency = list.get(i).getValue(); + RowDataPacket row = getRow(i, sqlFrequency.getSql(), sqlFrequency.getCount(), sqlFrequency.getAvgTime(),sqlFrequency.getMaxTime(),sqlFrequency.getMinTime(),sqlFrequency.getExecuteTime(),sqlFrequency.getLastTime(), c.getCharset()); + row.packetId = ++packetId; + buffer = row.write(buffer, c,true); + } + } + + // write last eof + EOFPacket lastEof = new EOFPacket(); + lastEof.packetId = ++packetId; + buffer = lastEof.write(buffer, c,true); + + // write buffer + c.write(buffer); + } + + private static RowDataPacket getRow(int i, String sql, int count, long avgTime,long maxTime,long minTime,long executTime,long lastTime, String charset) { + RowDataPacket row = new RowDataPacket(FIELD_COUNT); + row.add( LongUtil.toBytes( i ) ); + row.add( LongUtil.toBytes( count ) ); + row.add( LongUtil.toBytes( avgTime ) ); + row.add( LongUtil.toBytes( maxTime ) ); + row.add( LongUtil.toBytes( minTime ) ); + row.add( LongUtil.toBytes( executTime ) ); + row.add( LongUtil.toBytes( lastTime ) ); + row.add( StringUtil.encode(sql, charset) ); + return row; + } + + +} diff --git a/src/main/java/org/opencloudb/stat/HighFrequencySqlAnalyzer.java b/src/main/java/org/opencloudb/stat/HighFrequencySqlAnalyzer.java index 41c047c9e..b784d25bb 100644 --- a/src/main/java/org/opencloudb/stat/HighFrequencySqlAnalyzer.java +++ b/src/main/java/org/opencloudb/stat/HighFrequencySqlAnalyzer.java @@ -1,207 +1,211 @@ -package org.opencloudb.stat; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.Comparator; -import java.util.HashMap; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; -import java.util.concurrent.locks.ReentrantReadWriteLock; - -import org.opencloudb.server.parser.ServerParse; - -import com.alibaba.druid.sql.visitor.ParameterizedOutputVisitorUtils; - -/** - * 高频SQL - * - * @author zhuam - * - */ -public class HighFrequencySqlAnalyzer implements QueryResultListener { - - private static final int CAPACITY_SIZE = 100; - private static final int DELETE_SIZE = 10; - - private LinkedHashMap sqlFrequencyMap = new LinkedHashMap(); - private ReentrantReadWriteLock lock = new ReentrantReadWriteLock(); - - private SQLParser sqlParser = new SQLParser(); - - private final static HighFrequencySqlAnalyzer instance = new HighFrequencySqlAnalyzer(); - - private HighFrequencySqlAnalyzer() {} - - public static HighFrequencySqlAnalyzer getInstance() { - return instance; - } - - @Override - public void onQuery(QueryResult query) { - - int sqlType = query.getSqlType(); - String sql = query.getSql(); - String newSql = this.sqlParser.mergeSql(sql); - long executeTime = query.getEndTime() - query.getStartTime(); - this.lock.writeLock().lock(); - try { - - switch(sqlType) { - case ServerParse.SELECT: - case ServerParse.UPDATE: - case ServerParse.INSERT: - case ServerParse.DELETE: - case ServerParse.REPLACE: - - if ( this.sqlFrequencyMap.size() >= CAPACITY_SIZE ) { - - // 删除频率次数排名靠后的SQL - List> list = this.sortFrequency( sqlFrequencyMap, true ); - for (int i = 0; i < DELETE_SIZE; i++) { - - Entry entry = list.get(i); - String key = entry.getKey(); - this.sqlFrequencyMap.remove( key ); - } - } - - SqlFrequency frequency = this.sqlFrequencyMap.get( newSql ); - if ( frequency == null) { - frequency = new SqlFrequency(); - frequency.setSql( newSql ); - } - frequency.setLastTime( query.getEndTime() ); - frequency.incCount(); - frequency.setExecuteTime(executeTime); - this.sqlFrequencyMap.put(newSql, frequency); - - } - - } finally { - this.lock.writeLock().unlock(); - } - } - - /** - * 获取 SQL 访问频率 - */ - public List> getSqlFrequency() { - - List> list = null; - - lock.readLock().lock(); - try { - list = this.sortFrequency( sqlFrequencyMap, false ); - } finally { - lock.readLock().unlock(); - } - return list; - } - - /** - * 排序 - */ - private List> sortFrequency(HashMap map, - final boolean bAsc) { - - List> list = new ArrayList>(map.entrySet()); - - Collections.sort(list, new Comparator>() { - public int compare(Map.Entry o1, Map.Entry o2) { - - if (!bAsc) { - return o2.getValue().getCount() - o1.getValue().getCount(); // 降序 - } else { - return o1.getValue().getCount() - o2.getValue().getCount(); // 升序 - } - } - }); - - return list; - - } - - public class SqlFrequency { - - private String sql; - private int count = 0; - private long lastTime = 0; - private long executeTime=0; - private long maxTime=0; - private long avgTime=0; - private long minTime=0; - - public String getSql() { - return sql; - } - - public void setSql(String sql) { - this.sql = sql; - } - - public int getCount() { - return count; - } - - public void incCount() { - this.count++; - } - - public long getLastTime() { - return lastTime; - } - - public void setLastTime(long lastTime) { - this.lastTime = lastTime; - } - public long getExecuteTime() { - return executeTime; - } - public long getMaxTime() { - return maxTime; - } - public long getMinTime() { - return minTime; - } - public long getAvgTime() { - return avgTime; - } - public void setExecuteTime(long execTime) { - if (execTime> this.maxTime){ - this.maxTime = execTime; - } - if (this.minTime==0){ - this.minTime = execTime; - } - if (execTime>0) { - if (execTime < this.minTime){ - this.minTime = execTime; - } - if (this.executeTime+execTime>0){ - this.avgTime=(this.executeTime+execTime)/2; - } - } - this.executeTime = execTime; - //System.out.println(" exec:"+execTime +" max:"+maxTime+" min:"+minTime+ " avg:"+avgTime); - } - } - - - class SQLParser { - - public String fixSql(String sql) { - if ( sql != null) - return sql.replace("\n", " "); - return sql; - } - - public String mergeSql(String sql) { - - String newSql = ParameterizedOutputVisitorUtils.parameterize(sql, "mysql"); - return fixSql( newSql ); - } - } - -} +package org.opencloudb.stat; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.concurrent.locks.ReentrantReadWriteLock; + +import org.opencloudb.server.parser.ServerParse; + +import com.alibaba.druid.sql.visitor.ParameterizedOutputVisitorUtils; + +/** + * 高频SQL + * + * @author zhuam + * + */ +public class HighFrequencySqlAnalyzer implements QueryResultListener { + + private static final int CAPACITY_SIZE = 100; + private static final int DELETE_SIZE = 10; + + private LinkedHashMap sqlFrequencyMap = new LinkedHashMap(); + private ReentrantReadWriteLock lock = new ReentrantReadWriteLock(); + + private SQLParser sqlParser = new SQLParser(); + + private final static HighFrequencySqlAnalyzer instance = new HighFrequencySqlAnalyzer(); + + private HighFrequencySqlAnalyzer() {} + + public static HighFrequencySqlAnalyzer getInstance() { + return instance; + } + + @Override + public void onQuery(QueryResult query) { + + int sqlType = query.getSqlType(); + String sql = query.getSql(); + String newSql = this.sqlParser.mergeSql(sql); + long executeTime = query.getEndTime() - query.getStartTime(); + this.lock.writeLock().lock(); + try { + + switch(sqlType) { + case ServerParse.SELECT: + case ServerParse.UPDATE: + case ServerParse.INSERT: + case ServerParse.DELETE: + case ServerParse.REPLACE: + + if ( this.sqlFrequencyMap.size() >= CAPACITY_SIZE ) { + + // 删除频率次数排名靠后的SQL + List> list = this.sortFrequency( sqlFrequencyMap, true ); + for (int i = 0; i < DELETE_SIZE; i++) { + + Entry entry = list.get(i); + String key = entry.getKey(); + this.sqlFrequencyMap.remove( key ); + } + } + + SqlFrequency frequency = this.sqlFrequencyMap.get( newSql ); + if ( frequency == null) { + frequency = new SqlFrequency(); + frequency.setSql( newSql ); + } + frequency.setLastTime( query.getEndTime() ); + frequency.incCount(); + frequency.setExecuteTime(executeTime); + this.sqlFrequencyMap.put(newSql, frequency); + + } + + } finally { + this.lock.writeLock().unlock(); + } + } + + /** + * 获取 SQL 访问频率 + */ + public List> getSqlFrequency() { + + List> list = null; + + lock.readLock().lock(); + try { + list = this.sortFrequency( sqlFrequencyMap, false ); + } finally { + lock.readLock().unlock(); + } + return list; + } + + /** + * 排序 + */ + private List> sortFrequency(HashMap map, + final boolean bAsc) { + + List> list = new ArrayList>(map.entrySet()); + + Collections.sort(list, new Comparator>() { + public int compare(Map.Entry o1, Map.Entry o2) { + + if (!bAsc) { + return o2.getValue().getCount() - o1.getValue().getCount(); // 降序 + } else { + return o1.getValue().getCount() - o2.getValue().getCount(); // 升序 + } + } + }); + + return list; + + } + + public class SqlFrequency { + + private String sql; + private int count = 0; + private long lastTime = 0; + private long executeTime = 0; + private long maxTime = 0; + private long avgTime = 0; + private long minTime = 0; + + public String getSql() { + return sql; + } + + public void setSql(String sql) { + this.sql = sql; + } + + public int getCount() { + return count; + } + + public void incCount() { + this.count++; + } + + public long getLastTime() { + return lastTime; + } + + public void setLastTime(long lastTime) { + this.lastTime = lastTime; + } + + public long getExecuteTime() { + return executeTime; + } + + public long getMaxTime() { + return maxTime; + } + + public long getMinTime() { + return minTime; + } + + public long getAvgTime() { + return avgTime; + } + + public void setExecuteTime(long execTime) { + if (execTime > this.maxTime) { + this.maxTime = execTime; + } + if (this.minTime == 0) { + this.minTime = execTime; + } + if (execTime > 0) { + if (execTime < this.minTime) { + this.minTime = execTime; + } + if (this.executeTime + execTime > 0) { + this.avgTime = (this.executeTime + execTime) / 2; + } + } + this.executeTime = execTime; + } + } + + + class SQLParser { + + public String fixSql(String sql) { + if ( sql != null) + return sql.replace("\n", " "); + return sql; + } + + public String mergeSql(String sql) { + + String newSql = ParameterizedOutputVisitorUtils.parameterize(sql, "mysql"); + return fixSql( newSql ); + } + } + +} diff --git a/src/main/java/org/opencloudb/stat/QueryConditionAnalyzer.java b/src/main/java/org/opencloudb/stat/QueryConditionAnalyzer.java index 9caca9237..57f1547b5 100644 --- a/src/main/java/org/opencloudb/stat/QueryConditionAnalyzer.java +++ b/src/main/java/org/opencloudb/stat/QueryConditionAnalyzer.java @@ -191,7 +191,8 @@ public List parseConditionValues(String sql, String tableName, String co } } - /* public static void main(String arg[]) { + /* ----------------------------------------------------------------- + public static void main(String arg[]) { String sql = "SELECT `fnum`, `forg`, `fdst`, `airline`, `ftype` , `ports_of_call`, " + "`scheduled_deptime`, `scheduled_arrtime`, `actual_deptime`, `actual_arrtime`, " + @@ -209,6 +210,6 @@ public List parseConditionValues(String sql, String tableName, String co List> list = analyzer.getValues(); System.out.println( list ); - }*/ - + } + */ } \ No newline at end of file diff --git a/src/main/java/org/opencloudb/stat/TableStat.java b/src/main/java/org/opencloudb/stat/TableStat.java index a89cafe46..6a9cf7ce3 100644 --- a/src/main/java/org/opencloudb/stat/TableStat.java +++ b/src/main/java/org/opencloudb/stat/TableStat.java @@ -1,141 +1,137 @@ -package org.opencloudb.stat; - -import java.util.ArrayList; -import java.util.List; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.atomic.AtomicLong; - -import org.opencloudb.server.parser.ServerParse; - -/** - * SQL统计中,统计出来每个表的读,写的TPS,分辨出当前最热的表, - * 并且根据是否有关联JOIN来区分为几个不同的“区域”,是一个重要功能,意味着,某些表可以转移到其他的数据库里,做智能优化。 - * - * 首先是每个表的读写TPS 2个指标,有时段。然后是 哪那些表有JOIN查询 ,来区分 独立的区域 - * - * @author zhuam - * - */ -public class TableStat { - - //1、读写 - //2、主表 - //3、关联表 次数 - //4、读写 TPS - - public String table; - - private final AtomicLong rCount = new AtomicLong(0); - private final AtomicLong wCount = new AtomicLong(0); - - // 关联表 - private final ConcurrentHashMap relaTableMap = new ConcurrentHashMap(); - - - /** - * 最后执行时间 - */ - private long lastExecuteTime; - - - public TableStat(String table) { - super(); - this.table = table; - } - - public void reset() { - this.rCount.set(0); - this.wCount.set(0); - this.relaTableMap.clear(); - this.lastExecuteTime = 0; - } - - public void update(int sqlType, String sql, long startTime, long endTime, List relaTables) { - - //记录 RW - switch(sqlType) { - case ServerParse.SELECT: - this.rCount.incrementAndGet(); - break; - case ServerParse.UPDATE: - case ServerParse.INSERT: - case ServerParse.DELETE: - case ServerParse.REPLACE: - this.wCount.incrementAndGet(); - break; - } - - // 记录 关联表执行情况 - for(String table: relaTables) { - RelaTable relaTable = this.relaTableMap.get( table ); - if ( relaTable == null ) { - relaTable = new RelaTable(table, 1); - } else { - relaTable.incCount(); - } - this.relaTableMap.put(table, relaTable); - } - - - this.lastExecuteTime = endTime; - } - - public String getTable() { - return table; - } - - public long getRCount() { - return this.rCount.get(); - } - - public long getWCount() { - return this.wCount.get(); - } - - public int getCount() { - return new Long(getRCount()+getWCount()).intValue(); - } - - public List getRelaTables() { - List tables = new ArrayList(); - tables.addAll( this.relaTableMap.values() ); - return tables; - } - - public long getLastExecuteTime() { - return lastExecuteTime; - } - - - - /** - * 关联表 - * @author Ben - * - */ - public static class RelaTable { - - private String tableName; - private int count; - - public RelaTable(String tableName, int count) { - super(); - this.tableName = tableName; - this.count = count; - } - - public String getTableName() { - return this.tableName; - } - - public int getCount() { - return this.count; - } - - public void incCount() { - this.count++; - } - } - - -} +package org.opencloudb.stat; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.atomic.AtomicLong; + +import org.opencloudb.server.parser.ServerParse; + +/** + * SQL统计中,统计出来每个表的读,写的TPS,分辨出当前最热的表, + * 并且根据是否有关联JOIN来区分为几个不同的“区域”,是一个重要功能,意味着,某些表可以转移到其他的数据库里,做智能优化。 + * + * 首先是每个表的读写TPS 2个指标,有时段。然后是 哪那些表有JOIN查询 ,来区分 独立的区域 + * + * @author zhuam + * + */ +public class TableStat { + + //1、读写 + //2、主表 + //3、关联表 次数 + //4、读写 TPS + + public String table; + + private final AtomicLong rCount = new AtomicLong(0); + private final AtomicLong wCount = new AtomicLong(0); + + // 关联表 + private final ConcurrentHashMap relaTableMap = new ConcurrentHashMap(); + + /** + * 最后执行时间 + */ + private long lastExecuteTime; + + + public TableStat(String table) { + super(); + this.table = table; + } + + public void reset() { + this.rCount.set(0); + this.wCount.set(0); + this.relaTableMap.clear(); + this.lastExecuteTime = 0; + } + + public void update(int sqlType, String sql, long startTime, long endTime, List relaTables) { + + //记录 RW + switch(sqlType) { + case ServerParse.SELECT: + this.rCount.incrementAndGet(); + break; + case ServerParse.UPDATE: + case ServerParse.INSERT: + case ServerParse.DELETE: + case ServerParse.REPLACE: + this.wCount.incrementAndGet(); + break; + } + + // 记录 关联表执行情况 + for(String table: relaTables) { + RelaTable relaTable = this.relaTableMap.get( table ); + if ( relaTable == null ) { + relaTable = new RelaTable(table, 1); + } else { + relaTable.incCount(); + } + this.relaTableMap.put(table, relaTable); + } + + this.lastExecuteTime = endTime; + } + + public String getTable() { + return table; + } + + public long getRCount() { + return this.rCount.get(); + } + + public long getWCount() { + return this.wCount.get(); + } + + public int getCount() { + return new Long(getRCount()+getWCount()).intValue(); + } + + public List getRelaTables() { + List tables = new ArrayList(); + tables.addAll( this.relaTableMap.values() ); + return tables; + } + + public long getLastExecuteTime() { + return lastExecuteTime; + } + + + /** + * 关联表 + * @author Ben + * + */ + public static class RelaTable { + + private String tableName; + private int count; + + public RelaTable(String tableName, int count) { + super(); + this.tableName = tableName; + this.count = count; + } + + public String getTableName() { + return this.tableName; + } + + public int getCount() { + return this.count; + } + + public void incCount() { + this.count++; + } + } + +} From a2ea29577d9f094d1b680459570e2fecd54c8e5e Mon Sep 17 00:00:00 2001 From: zhuam Date: Mon, 28 Dec 2015 10:54:46 +0800 Subject: [PATCH 3/3] =?UTF-8?q?=E4=BC=98=E5=8C=96=E5=B1=95=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../opencloudb/response/ShowSQLCondition.java | 4 +-- .../stat/QueryConditionAnalyzer.java | 26 ++++++++++++------- 2 files changed, 19 insertions(+), 11 deletions(-) diff --git a/src/main/java/org/opencloudb/response/ShowSQLCondition.java b/src/main/java/org/opencloudb/response/ShowSQLCondition.java index da15a169b..fc0c7cdbc 100644 --- a/src/main/java/org/opencloudb/response/ShowSQLCondition.java +++ b/src/main/java/org/opencloudb/response/ShowSQLCondition.java @@ -83,11 +83,11 @@ public static void execute(ManagerConnection c) { buffer = row.write(buffer, c,true); } - RowDataPacket vk_row = getRow(size + 1, "VALUE KEY", "size", size, c.getCharset()); + RowDataPacket vk_row = getRow(size + 1, key + ".valuekey", "size", size, c.getCharset()); vk_row.packetId = ++packetId; buffer = vk_row.write(buffer, c,true); - RowDataPacket vc_row = getRow(size + 2, "VALUE COUNT", "total", total, c.getCharset()); + RowDataPacket vc_row = getRow(size + 2, key + ".valuecount", "total", total, c.getCharset()); vc_row.packetId = ++packetId; buffer = vc_row.write(buffer, c,true); diff --git a/src/main/java/org/opencloudb/stat/QueryConditionAnalyzer.java b/src/main/java/org/opencloudb/stat/QueryConditionAnalyzer.java index 57f1547b5..09db5b08e 100644 --- a/src/main/java/org/opencloudb/stat/QueryConditionAnalyzer.java +++ b/src/main/java/org/opencloudb/stat/QueryConditionAnalyzer.java @@ -6,6 +6,7 @@ import java.util.Map; import java.util.concurrent.locks.ReentrantLock; +import org.apache.log4j.Logger; import org.opencloudb.server.parser.ServerParse; import com.alibaba.druid.sql.ast.SQLStatement; @@ -35,6 +36,8 @@ */ public class QueryConditionAnalyzer implements QueryResultListener { + private static final Logger LOGGER = Logger.getLogger(QueryConditionAnalyzer.class); + private String tableName = null; private String columnName = null; @@ -65,18 +68,23 @@ public void onQuery(QueryResult query) { switch(sqlType) { case ServerParse.SELECT: - List values = sqlParser.parseConditionValues(sql, this.tableName, this.columnName); if ( values != null ) { - for(Object value : values) { + + if ( this.map.size() < 100000 ) { - Long count = this.map.get(value); - if (count == null) { - count = 1L; - } else { - count++; - } - this.map.put(value, count); + for(Object value : values) { + Long count = this.map.get(value); + if (count == null) { + count = 1L; + } else { + count++; + } + this.map.put(value, count); + } + + } else { + LOGGER.debug(" this map is too large size "); } } }