mirror of
https://github.com/actiontech/dble.git
synced 2026-05-04 05:20:48 -05:00
feat: implicit commit (#2165)
* feat: implicit commit * fix: add singleTransactionsCount * perf: merge code * perf: merge code * fix: update implicit commit When lock table, commit transactions are not displayed
This commit is contained in:
@@ -140,9 +140,8 @@ public class RWSplitNonBlockingSession {
|
||||
|
||||
public void unbindIfSafe() {
|
||||
if (rwSplitService.isAutocommit() && !rwSplitService.isTxStart() && !rwSplitService.isLocked() &&
|
||||
!rwSplitService.isTxStart() &&
|
||||
!rwSplitService.isInLoadData() &&
|
||||
!rwSplitService.isInPrepare()) {
|
||||
!rwSplitService.isInPrepare() && this.conn != null) {
|
||||
this.conn.release();
|
||||
this.conn = null;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,403 @@
|
||||
/*
|
||||
* Copyright (C) 2016-2020 ActionTech.
|
||||
* based on code by MyCATCopyrightHolder Copyright (c) 2013, OpenCloudDB/MyCAT.
|
||||
* License: http://www.gnu.org/licenses/gpl.html GPL version 2 or higher.
|
||||
*/
|
||||
package com.actiontech.dble.server.parser;
|
||||
|
||||
import com.actiontech.dble.route.parser.util.ParseUtil;
|
||||
/**
|
||||
* @author mycat
|
||||
*/
|
||||
public final class RwSplitServerParse extends ServerParse {
|
||||
private RwSplitServerParse() {
|
||||
super();
|
||||
}
|
||||
|
||||
public static final int GRANT = 201;
|
||||
public static final int REVOKE = 202;
|
||||
public static final int INSTALL = 205;
|
||||
public static final int RENAME = 206;
|
||||
public static final int UNINSTALL = 207;
|
||||
public static final int START_TRANSACTION = 208;
|
||||
|
||||
public static int parse(String stmt) {
|
||||
int length = stmt.length();
|
||||
//FIX BUG FOR SQL SUCH AS /XXXX/SQL
|
||||
int rt = OTHER;
|
||||
for (int i = 0; i < length; ++i) {
|
||||
switch (stmt.charAt(i)) {
|
||||
case ' ':
|
||||
case '\t':
|
||||
case '\r':
|
||||
case '\n':
|
||||
continue;
|
||||
case '/':
|
||||
// such as /*!40101 SET character_set_client = @saved_cs_client
|
||||
// */;
|
||||
if (i == 0 && stmt.charAt(1) == '*' && stmt.charAt(2) == '!' && stmt.charAt(length - 2) == '*' &&
|
||||
stmt.charAt(length - 1) == '/') {
|
||||
return MYSQL_CMD_COMMENT;
|
||||
}
|
||||
//fall through
|
||||
case '#':
|
||||
i = ParseUtil.comment(stmt, i);
|
||||
if (i + 1 == length) {
|
||||
return MYSQL_COMMENT;
|
||||
}
|
||||
continue;
|
||||
case '-':
|
||||
i = ParseUtil.commentDoubleDash(stmt, i);
|
||||
if (i + 1 == length) {
|
||||
return MYSQL_COMMENT;
|
||||
}
|
||||
continue;
|
||||
case 'A':
|
||||
case 'a':
|
||||
rt = aCheck(stmt, i);
|
||||
break;
|
||||
case 'B':
|
||||
case 'b':
|
||||
rt = beginCheck(stmt, i);
|
||||
break;
|
||||
case 'C':
|
||||
case 'c':
|
||||
rt = cCheck(stmt, i);
|
||||
break;
|
||||
case 'D':
|
||||
case 'd':
|
||||
rt = deleteOrdCheck(stmt, i);
|
||||
break;
|
||||
case 'E':
|
||||
case 'e':
|
||||
rt = eCheck(stmt, i);
|
||||
break;
|
||||
case 'G':
|
||||
case 'g':
|
||||
rt = gCheck(stmt, i);
|
||||
break;
|
||||
case 'I':
|
||||
case 'i':
|
||||
rt = iCheck(stmt, i);
|
||||
break;
|
||||
case 'M':
|
||||
case 'm':
|
||||
rt = migrateCheck(stmt, i);
|
||||
break;
|
||||
case 'O':
|
||||
case 'o':
|
||||
rt = optimizeCheck(stmt, i);
|
||||
break;
|
||||
case 'P':
|
||||
case 'p':
|
||||
rt = prepareCheck(stmt, i);
|
||||
break;
|
||||
case 'R':
|
||||
case 'r':
|
||||
rt = rCheck(stmt, i);
|
||||
break;
|
||||
case 'S':
|
||||
case 's':
|
||||
rt = sCheck(stmt, i);
|
||||
break;
|
||||
case 'T':
|
||||
case 't':
|
||||
rt = tCheck(stmt, i);
|
||||
break;
|
||||
case 'U':
|
||||
case 'u':
|
||||
rt = uCheck(stmt, i);
|
||||
break;
|
||||
case 'K':
|
||||
case 'k':
|
||||
rt = killCheck(stmt, i);
|
||||
break;
|
||||
case 'H':
|
||||
case 'h':
|
||||
rt = helpCheck(stmt, i);
|
||||
break;
|
||||
case 'L':
|
||||
case 'l':
|
||||
rt = lCheck(stmt, i);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
return rt;
|
||||
}
|
||||
|
||||
// INSERT' ' | INSTALL ' '
|
||||
protected static int iCheck(String stmt, int offset) {
|
||||
int type = OTHER;
|
||||
if (stmt.length() > offset + 2) {
|
||||
char c1 = stmt.charAt(++offset);
|
||||
char c2 = stmt.charAt(++offset);
|
||||
char c3 = stmt.charAt(++offset);
|
||||
if ((c1 == 'N' || c1 == 'n') && (c2 == 'S' || c2 == 's')) {
|
||||
switch (c3) {
|
||||
case 'E':
|
||||
case 'e':
|
||||
type = inseCheck(stmt, offset);
|
||||
break;
|
||||
case 'T':
|
||||
case 't':
|
||||
type = instCheck(stmt, offset);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
return type;
|
||||
}
|
||||
|
||||
private static int instCheck(String stmt, int offset) {
|
||||
if (stmt.length() > offset + 3) {
|
||||
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 == 'L' || c2 == 'l') && (c3 == 'L' || c3 == 'l') && ParseUtil.isSpace(c4)) {
|
||||
return INSTALL;
|
||||
}
|
||||
}
|
||||
return OTHER;
|
||||
}
|
||||
|
||||
private static int inseCheck(String stmt, int offset) {
|
||||
if (stmt.length() > offset + 2) {
|
||||
char c1 = stmt.charAt(++offset);
|
||||
char c2 = stmt.charAt(++offset);
|
||||
char c3 = stmt.charAt(++offset);
|
||||
if ((c1 == 'R' || c1 == 'r') && (c2 == 'T' || c2 == 't') && ParseUtil.isSpace(c3)) {
|
||||
return INSERT;
|
||||
}
|
||||
}
|
||||
return OTHER;
|
||||
}
|
||||
|
||||
|
||||
//grant
|
||||
private static int gCheck(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);
|
||||
if ((c1 == 'R' || c1 == 'r') &&
|
||||
(c2 == 'A' || c2 == 'a') &&
|
||||
(c3 == 'N' || c3 == 'n') &&
|
||||
(c4 == 'T' || c4 == 't') && ParseUtil.isSpace(c5)) {
|
||||
return GRANT;
|
||||
}
|
||||
}
|
||||
return OTHER;
|
||||
}
|
||||
|
||||
protected static int rCheck(String stmt, int offset) {
|
||||
if (stmt.length() > ++offset) {
|
||||
switch (stmt.charAt(offset)) {
|
||||
case 'E':
|
||||
case 'e':
|
||||
return reCheck(stmt, offset);
|
||||
case 'O':
|
||||
case 'o':
|
||||
return rollbackCheck(stmt, offset);
|
||||
default:
|
||||
return OTHER;
|
||||
}
|
||||
}
|
||||
return OTHER;
|
||||
}
|
||||
|
||||
private static int reCheck(String stmt, int offset) {
|
||||
if (stmt.length() > ++offset) {
|
||||
switch (stmt.charAt(offset)) {
|
||||
case 'N':
|
||||
case 'n':
|
||||
return rename(stmt, offset);
|
||||
case 'P':
|
||||
case 'p':
|
||||
return repCheck(stmt, offset);
|
||||
case 'l':
|
||||
case 'L':
|
||||
return release(stmt, offset);
|
||||
case 'v':
|
||||
case 'V':
|
||||
return revoke(stmt, offset);
|
||||
default:
|
||||
return OTHER;
|
||||
}
|
||||
}
|
||||
return OTHER;
|
||||
}
|
||||
|
||||
|
||||
//revoke
|
||||
private static int revoke(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);
|
||||
if ((c1 == 'o' || c1 == 'O') && (c2 == 'k' || c2 == 'K') && (c3 == 'e' || c3 == 'E') && ParseUtil.isSpace(c4)) {
|
||||
return REVOKE;
|
||||
}
|
||||
}
|
||||
return OTHER;
|
||||
}
|
||||
|
||||
protected static int rename(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 == 'A' || c1 == 'a') && (c2 == 'M' || c2 == 'm') && (c3 == 'E' || c3 == 'e') &&
|
||||
(c4 == ' ' || c4 == '\t' || c4 == '\r' || c4 == '\n')) {
|
||||
return RENAME;
|
||||
}
|
||||
}
|
||||
return OTHER;
|
||||
}
|
||||
|
||||
//UNLOCK | UNINSTALL
|
||||
private static int unCheck(String stmt, int offset) {
|
||||
int type = OTHER;
|
||||
switch (stmt.charAt(++offset)) {
|
||||
case 'L':
|
||||
case 'l':
|
||||
type = unlCheck(stmt, offset);
|
||||
break;
|
||||
case 'I':
|
||||
case 'i':
|
||||
type = uniCheck(stmt, offset);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return type;
|
||||
}
|
||||
|
||||
private static int uniCheck(String stmt, int offset) {
|
||||
if (stmt.length() > offset + 6) {
|
||||
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 == 'S' || c2 == 's') &&
|
||||
(c3 == 'T' || c3 == 't') &&
|
||||
(c4 == 'A' || c4 == 'a') &&
|
||||
(c5 == 'L' || c5 == 'l') &&
|
||||
(c6 == 'L' || c6 == 'l') &&
|
||||
ParseUtil.isSpace(c7)) {
|
||||
return UNINSTALL;
|
||||
}
|
||||
}
|
||||
return OTHER;
|
||||
}
|
||||
|
||||
private static int unlCheck(String stmt, int offset) {
|
||||
if (stmt.length() > offset + 3) {
|
||||
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 == 'C' || c2 == 'c') &&
|
||||
(c3 == 'K' || c3 == 'k') &&
|
||||
ParseUtil.isSpace(c4)) {
|
||||
return UNLOCK;
|
||||
}
|
||||
}
|
||||
return OTHER;
|
||||
}
|
||||
|
||||
// UPDATE' ' | USE' '
|
||||
protected static int uCheck(String stmt, int offset) {
|
||||
if (stmt.length() > ++offset) {
|
||||
switch (stmt.charAt(offset)) {
|
||||
case 'P':
|
||||
case 'p':
|
||||
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 == 'D' || c1 == 'd') &&
|
||||
(c2 == 'A' || c2 == 'a') &&
|
||||
(c3 == 'T' || c3 == 't') &&
|
||||
(c4 == 'E' || c4 == 'e') &&
|
||||
(c5 == ' ' || c5 == '\t' || c5 == '\r' || c5 == '\n')) {
|
||||
return UPDATE;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 'S':
|
||||
case 's':
|
||||
if (stmt.length() > offset + 2) {
|
||||
char c1 = stmt.charAt(++offset);
|
||||
char c2 = stmt.charAt(++offset);
|
||||
if ((c1 == 'E' || c1 == 'e') &&
|
||||
(c2 == ' ' || c2 == '\t' || c2 == '\r' || c2 == '\n')) {
|
||||
return (offset << 8) | USE;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 'N':
|
||||
case 'n':
|
||||
return unCheck(stmt, offset);
|
||||
default:
|
||||
return OTHER;
|
||||
}
|
||||
}
|
||||
return OTHER;
|
||||
}
|
||||
|
||||
protected static int sCheck(String stmt, int offset) {
|
||||
if (stmt.length() > ++offset) {
|
||||
switch (stmt.charAt(offset)) {
|
||||
case 'A':
|
||||
case 'a':
|
||||
return savepointCheck(stmt, offset);
|
||||
case 'E':
|
||||
case 'e':
|
||||
return seCheck(stmt, offset);
|
||||
case 'H':
|
||||
case 'h':
|
||||
return showCheck(stmt, offset);
|
||||
case 'T':
|
||||
case 't':
|
||||
return startCheck(stmt, offset);
|
||||
default:
|
||||
return OTHER;
|
||||
}
|
||||
}
|
||||
return OTHER;
|
||||
}
|
||||
|
||||
// START' '
|
||||
private static int startCheck(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 == 'A' || c1 == 'a') && (c2 == 'R' || c2 == 'r') &&
|
||||
(c3 == 'T' || c3 == 't') &&
|
||||
(c4 == ' ' || c4 == '\t' || c4 == '\r' || c4 == '\n')) {
|
||||
stmt = stmt.substring(offset).trim();
|
||||
return RwSplitServerParseStart.parse(stmt, 0);
|
||||
}
|
||||
}
|
||||
return OTHER;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,60 @@
|
||||
/*
|
||||
* Copyright (C) 2016-2020 ActionTech.
|
||||
* based on code by MyCATCopyrightHolder Copyright (c) 2013, OpenCloudDB/MyCAT.
|
||||
* License: http://www.gnu.org/licenses/gpl.html GPL version 2 or higher.
|
||||
*/
|
||||
package com.actiontech.dble.server.parser;
|
||||
|
||||
import com.actiontech.dble.route.parser.util.ParseUtil;
|
||||
|
||||
/**
|
||||
* @author mycat
|
||||
*/
|
||||
public final class RwSplitServerParseStart extends ServerParseStart {
|
||||
private RwSplitServerParseStart() {
|
||||
}
|
||||
|
||||
public static final int TRANSACTION = RwSplitServerParse.START_TRANSACTION;
|
||||
|
||||
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 'T':
|
||||
case 't':
|
||||
return transactionCheck(stmt, i);
|
||||
default:
|
||||
return RwSplitServerParse.OTHER;
|
||||
}
|
||||
}
|
||||
return RwSplitServerParse.OTHER;
|
||||
}
|
||||
|
||||
private static int transactionCheck(String stmt, int offset) {
|
||||
if (stmt.length() > offset + 10) {
|
||||
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);
|
||||
char c9 = stmt.charAt(++offset);
|
||||
char c10 = stmt.charAt(++offset);
|
||||
if ((c1 == 'R' || c1 == 'r') && (c2 == 'A' || c2 == 'a') && (c3 == 'N' || c3 == 'n') &&
|
||||
(c4 == 'S' || c4 == 's') && (c5 == 'A' || c5 == 'a') && (c6 == 'C' || c6 == 'c') &&
|
||||
(c7 == 'T' || c7 == 't') && (c8 == 'I' || c8 == 'i') && (c9 == 'O' || c9 == 'o') &&
|
||||
(c10 == 'N' || c10 == 'n')) {
|
||||
return TRANSACTION;
|
||||
}
|
||||
}
|
||||
return OTHER;
|
||||
}
|
||||
}
|
||||
@@ -14,8 +14,8 @@ import java.util.regex.Pattern;
|
||||
/**
|
||||
* @author mycat
|
||||
*/
|
||||
public final class ServerParse {
|
||||
private ServerParse() {
|
||||
public class ServerParse {
|
||||
protected ServerParse() {
|
||||
}
|
||||
|
||||
public static final int OTHER = -1;
|
||||
@@ -197,7 +197,7 @@ public final class ServerParse {
|
||||
return rt;
|
||||
}
|
||||
|
||||
private static int eCheck(String stmt, int offset) {
|
||||
protected static int eCheck(String stmt, int offset) {
|
||||
int sqlType = OTHER;
|
||||
if (stmt.length() > offset + 1) {
|
||||
char c1 = stmt.charAt(++offset);
|
||||
@@ -220,7 +220,7 @@ public final class ServerParse {
|
||||
return sqlType;
|
||||
}
|
||||
|
||||
private static int flushCheck(String stmt, int offset) {
|
||||
protected static int flushCheck(String stmt, int offset) {
|
||||
if (stmt.length() > offset + 5) {
|
||||
char c1 = stmt.charAt(++offset);
|
||||
char c2 = stmt.charAt(++offset);
|
||||
@@ -235,7 +235,7 @@ public final class ServerParse {
|
||||
return OTHER;
|
||||
}
|
||||
|
||||
private static int lCheck(String stmt, int offset) {
|
||||
protected static int lCheck(String stmt, int offset) {
|
||||
if (stmt.length() > offset + 3) {
|
||||
char c1 = stmt.charAt(++offset);
|
||||
if (c1 == 'o' || c1 == 'O') {
|
||||
@@ -300,7 +300,7 @@ public final class ServerParse {
|
||||
return OTHER;
|
||||
}
|
||||
|
||||
private static int migrateCheck(String stmt, int offset) {
|
||||
protected static int migrateCheck(String stmt, int offset) {
|
||||
if (stmt.length() > offset + 7) {
|
||||
char c1 = stmt.charAt(++offset);
|
||||
char c2 = stmt.charAt(++offset);
|
||||
@@ -321,7 +321,7 @@ public final class ServerParse {
|
||||
return OTHER;
|
||||
}
|
||||
|
||||
private static int optimizeCheck(String stmt, int offset) {
|
||||
protected static int optimizeCheck(String stmt, int offset) {
|
||||
if (stmt.length() > offset + 7) {
|
||||
char c1 = stmt.charAt(++offset);
|
||||
char c2 = stmt.charAt(++offset);
|
||||
@@ -340,7 +340,7 @@ public final class ServerParse {
|
||||
return OTHER;
|
||||
}
|
||||
|
||||
private static int prepareCheck(String stmt, int offset) {
|
||||
protected static int prepareCheck(String stmt, int offset) {
|
||||
if (isPrepare(stmt, offset)) return SCRIPT_PREPARE;
|
||||
return OTHER;
|
||||
}
|
||||
@@ -364,7 +364,7 @@ public final class ServerParse {
|
||||
}
|
||||
|
||||
//truncate
|
||||
private static int tCheck(String stmt, int offset) {
|
||||
protected static int tCheck(String stmt, int offset) {
|
||||
if (stmt.length() > offset + 7) {
|
||||
char c1 = stmt.charAt(++offset);
|
||||
char c2 = stmt.charAt(++offset);
|
||||
@@ -385,7 +385,7 @@ public final class ServerParse {
|
||||
}
|
||||
|
||||
//alter table/view/... and analyze
|
||||
private static int aCheck(String stmt, int offset) {
|
||||
protected static int aCheck(String stmt, int offset) {
|
||||
if (stmt.length() > offset + 1) {
|
||||
switch (stmt.charAt(++offset)) {
|
||||
case 'l':
|
||||
@@ -620,7 +620,7 @@ public final class ServerParse {
|
||||
}
|
||||
|
||||
// delete or drop
|
||||
private static int deleteOrdCheck(String stmt, int offset) {
|
||||
protected static int deleteOrdCheck(String stmt, int offset) {
|
||||
int sqlType = OTHER;
|
||||
switch (stmt.charAt((offset + 1))) {
|
||||
case 'E':
|
||||
@@ -638,7 +638,7 @@ public final class ServerParse {
|
||||
}
|
||||
|
||||
// HELP' '
|
||||
private static int helpCheck(String stmt, int offset) {
|
||||
protected static int helpCheck(String stmt, int offset) {
|
||||
if (stmt.length() > offset + "ELP ".length()) {
|
||||
char c1 = stmt.charAt(++offset);
|
||||
char c2 = stmt.charAt(++offset);
|
||||
@@ -689,7 +689,7 @@ public final class ServerParse {
|
||||
}
|
||||
|
||||
// KILL' '
|
||||
private static int killCheck(String stmt, int offset) {
|
||||
protected static int killCheck(String stmt, int offset) {
|
||||
if (stmt.length() > offset + "ILL ".length()) {
|
||||
char c1 = stmt.charAt(++offset);
|
||||
char c2 = stmt.charAt(++offset);
|
||||
@@ -747,7 +747,7 @@ public final class ServerParse {
|
||||
}
|
||||
|
||||
// BEGIN
|
||||
private static int beginCheck(String stmt, int offset) {
|
||||
protected static int beginCheck(String stmt, int offset) {
|
||||
if (stmt.length() > offset + 4) {
|
||||
char c1 = stmt.charAt(++offset);
|
||||
char c2 = stmt.charAt(++offset);
|
||||
@@ -819,7 +819,7 @@ public final class ServerParse {
|
||||
return OTHER;
|
||||
}
|
||||
|
||||
private static int cCheck(String stmt, int offset) {
|
||||
protected static int cCheck(String stmt, int offset) {
|
||||
int sqlType = OTHER;
|
||||
switch (stmt.charAt((offset + 1))) {
|
||||
case 'A':
|
||||
@@ -930,7 +930,7 @@ public final class ServerParse {
|
||||
}
|
||||
|
||||
// INSERT' '
|
||||
private static int insertCheck(String stmt, int offset) {
|
||||
protected static int insertCheck(String stmt, int offset) {
|
||||
if (stmt.length() > offset + 6) {
|
||||
char c1 = stmt.charAt(++offset);
|
||||
char c2 = stmt.charAt(++offset);
|
||||
@@ -948,7 +948,7 @@ public final class ServerParse {
|
||||
return OTHER;
|
||||
}
|
||||
|
||||
private static int rCheck(String stmt, int offset) {
|
||||
protected static int rCheck(String stmt, int offset) {
|
||||
if (stmt.length() > ++offset) {
|
||||
switch (stmt.charAt(offset)) {
|
||||
case 'E':
|
||||
@@ -983,7 +983,7 @@ public final class ServerParse {
|
||||
return OTHER;
|
||||
}
|
||||
|
||||
private static int release(String stmt, int offset) {
|
||||
protected static int release(String stmt, int offset) {
|
||||
if (stmt.length() > offset + 5) {
|
||||
char c1 = stmt.charAt(++offset);
|
||||
char c2 = stmt.charAt(++offset);
|
||||
@@ -998,7 +998,7 @@ public final class ServerParse {
|
||||
return OTHER;
|
||||
}
|
||||
|
||||
private static int repCheck(String stmt, int offset) {
|
||||
protected static int repCheck(String stmt, int offset) {
|
||||
if (stmt.length() > ++offset) {
|
||||
switch (stmt.charAt(offset)) {
|
||||
case 'A':
|
||||
@@ -1014,7 +1014,7 @@ public final class ServerParse {
|
||||
return OTHER;
|
||||
}
|
||||
|
||||
private static int rename(String stmt, int offset) {
|
||||
protected static int rename(String stmt, int offset) {
|
||||
if (stmt.length() > offset + 4) {
|
||||
char c1 = stmt.charAt(++offset);
|
||||
char c2 = stmt.charAt(++offset);
|
||||
@@ -1057,7 +1057,7 @@ public final class ServerParse {
|
||||
}
|
||||
|
||||
// ROLLBACK
|
||||
private static int rollbackCheck(String stmt, int offset) {
|
||||
protected static int rollbackCheck(String stmt, int offset) {
|
||||
if (stmt.length() > offset + 6) {
|
||||
char c1 = stmt.charAt(++offset);
|
||||
char c2 = stmt.charAt(++offset);
|
||||
@@ -1078,7 +1078,7 @@ public final class ServerParse {
|
||||
return OTHER;
|
||||
}
|
||||
|
||||
private static int sCheck(String stmt, int offset) {
|
||||
protected static int sCheck(String stmt, int offset) {
|
||||
if (stmt.length() > ++offset) {
|
||||
switch (stmt.charAt(offset)) {
|
||||
case 'A':
|
||||
@@ -1101,7 +1101,7 @@ public final class ServerParse {
|
||||
}
|
||||
|
||||
// SAVEPOINT
|
||||
private static int savepointCheck(String stmt, int offset) {
|
||||
protected static int savepointCheck(String stmt, int offset) {
|
||||
if (stmt.length() > offset + 8) {
|
||||
char c1 = stmt.charAt(++offset);
|
||||
char c2 = stmt.charAt(++offset);
|
||||
@@ -1122,7 +1122,7 @@ public final class ServerParse {
|
||||
return OTHER;
|
||||
}
|
||||
|
||||
private static int seCheck(String stmt, int offset) {
|
||||
protected static int seCheck(String stmt, int offset) {
|
||||
if (stmt.length() > ++offset) {
|
||||
switch (stmt.charAt(offset)) {
|
||||
case 'L':
|
||||
@@ -1173,7 +1173,7 @@ public final class ServerParse {
|
||||
}
|
||||
|
||||
// SHOW' '
|
||||
private static int showCheck(String stmt, int offset) {
|
||||
protected static int showCheck(String stmt, int offset) {
|
||||
if (stmt.length() > offset + 3) {
|
||||
char c1 = stmt.charAt(++offset);
|
||||
char c2 = stmt.charAt(++offset);
|
||||
@@ -1203,7 +1203,7 @@ public final class ServerParse {
|
||||
}
|
||||
|
||||
// UPDATE' ' | USE' '
|
||||
private static int uCheck(String stmt, int offset) {
|
||||
protected static int uCheck(String stmt, int offset) {
|
||||
if (stmt.length() > ++offset) {
|
||||
switch (stmt.charAt(offset)) {
|
||||
case 'P':
|
||||
|
||||
@@ -10,8 +10,8 @@ import com.actiontech.dble.route.parser.util.ParseUtil;
|
||||
/**
|
||||
* @author mycat
|
||||
*/
|
||||
public final class ServerParseStart {
|
||||
private ServerParseStart() {
|
||||
public class ServerParseStart {
|
||||
protected ServerParseStart() {
|
||||
}
|
||||
|
||||
public static final int OTHER = -1;
|
||||
@@ -53,7 +53,7 @@ public final class ServerParseStart {
|
||||
}
|
||||
}
|
||||
|
||||
private static int skipTrans(String stmt, int offset) {
|
||||
protected static int skipTrans(String stmt, int offset) {
|
||||
if (stmt.length() > offset + "ransaction".length()) {
|
||||
char c1 = stmt.charAt(++offset);
|
||||
char c2 = stmt.charAt(++offset);
|
||||
|
||||
@@ -6,7 +6,7 @@ import com.actiontech.dble.rwsplit.RWSplitNonBlockingSession;
|
||||
import com.actiontech.dble.server.ServerQueryHandler;
|
||||
import com.actiontech.dble.server.handler.SetHandler;
|
||||
import com.actiontech.dble.server.handler.UseHandler;
|
||||
import com.actiontech.dble.server.parser.ServerParse;
|
||||
import com.actiontech.dble.server.parser.RwSplitServerParse;
|
||||
import com.actiontech.dble.singleton.RouteService;
|
||||
import com.actiontech.dble.singleton.TraceManager;
|
||||
import com.google.common.collect.ImmutableMap;
|
||||
@@ -28,41 +28,54 @@ public class RWSplitQueryHandler implements FrontendQueryHandler {
|
||||
TraceManager.TraceObject traceObject = TraceManager.serviceTrace(session.getService(), "handle-query-sql");
|
||||
TraceManager.log(ImmutableMap.of("sql", sql), traceObject);
|
||||
try {
|
||||
int rs = ServerParse.parse(sql);
|
||||
session.getService().queryCount();
|
||||
int rs = RwSplitServerParse.parse(sql);
|
||||
int hintLength = RouteService.isHintSql(sql);
|
||||
int sqlType = rs & 0xff;
|
||||
if (hintLength >= 0) {
|
||||
session.executeHint(sqlType, sql, null);
|
||||
} else {
|
||||
if (sqlType != RwSplitServerParse.START && sqlType != RwSplitServerParse.BEGIN &&
|
||||
sqlType != RwSplitServerParse.COMMIT && sqlType != RwSplitServerParse.ROLLBACK && sqlType != RwSplitServerParse.SET) {
|
||||
session.getService().singleTransactionsCount();
|
||||
}
|
||||
switch (sqlType) {
|
||||
case ServerParse.USE:
|
||||
case RwSplitServerParse.USE:
|
||||
String schema = UseHandler.getSchemaName(sql, rs >>> 8);
|
||||
session.execute(true, (isSuccess, rwSplitService) -> rwSplitService.setSchema(schema));
|
||||
break;
|
||||
case ServerParse.SHOW:
|
||||
case ServerParse.SELECT:
|
||||
case RwSplitServerParse.SHOW:
|
||||
case RwSplitServerParse.SELECT:
|
||||
session.execute(false, null);
|
||||
break;
|
||||
case ServerParse.SET:
|
||||
case RwSplitServerParse.SET:
|
||||
SetHandler.handle(sql, session.getService(), rs >>> 8);
|
||||
break;
|
||||
case ServerParse.LOCK:
|
||||
session.execute(true, (isSuccess, rwSplitService) -> rwSplitService.setLocked(true));
|
||||
break;
|
||||
case ServerParse.UNLOCK:
|
||||
session.execute(true, (isSuccess, rwSplitService) -> rwSplitService.setLocked(false));
|
||||
break;
|
||||
case ServerParse.START:
|
||||
case ServerParse.BEGIN:
|
||||
session.execute(true, (isSuccess, rwSplitService) -> rwSplitService.setTxStart(true));
|
||||
break;
|
||||
case ServerParse.COMMIT:
|
||||
case ServerParse.ROLLBACK:
|
||||
case RwSplitServerParse.LOCK:
|
||||
session.execute(true, (isSuccess, rwSplitService) -> {
|
||||
rwSplitService.getSession().unbindIfSafe(true);
|
||||
if (rwSplitService.isTxStart()) {
|
||||
rwSplitService.setTxStart(false);
|
||||
session.getService().singleTransactionsCount();
|
||||
}
|
||||
rwSplitService.setLocked(true);
|
||||
});
|
||||
break;
|
||||
case ServerParse.LOAD_DATA_INFILE_SQL:
|
||||
case RwSplitServerParse.UNLOCK:
|
||||
session.execute(true, (isSuccess, rwSplitService) -> rwSplitService.setLocked(false));
|
||||
break;
|
||||
case RwSplitServerParse.START_TRANSACTION:
|
||||
case RwSplitServerParse.BEGIN:
|
||||
session.execute(true, (isSuccess, rwSplitService) -> rwSplitService.setTxStart(true));
|
||||
break;
|
||||
case RwSplitServerParse.COMMIT:
|
||||
case RwSplitServerParse.ROLLBACK:
|
||||
session.execute(true, (isSuccess, rwSplitService) -> {
|
||||
rwSplitService.setTxStart(false);
|
||||
rwSplitService.getSession().unbindIfSafe(true);
|
||||
session.getService().singleTransactionsCount();
|
||||
});
|
||||
break;
|
||||
case RwSplitServerParse.LOAD_DATA_INFILE_SQL:
|
||||
session.getService().setInLoadData(true);
|
||||
session.execute(true, (isSuccess, rwSplitService) -> rwSplitService.setInLoadData(false));
|
||||
break;
|
||||
@@ -71,7 +84,7 @@ public class RWSplitQueryHandler implements FrontendQueryHandler {
|
||||
// 2. DML
|
||||
// 3. procedure
|
||||
// 4. function
|
||||
session.execute(true, null);
|
||||
session.execute(true, handleCallback(sqlType));
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -83,4 +96,29 @@ public class RWSplitQueryHandler implements FrontendQueryHandler {
|
||||
}
|
||||
}
|
||||
|
||||
private Callback handleCallback(int sqlType) {
|
||||
switch (sqlType) {
|
||||
case RwSplitServerParse.DDL:
|
||||
case RwSplitServerParse.ALTER_VIEW:
|
||||
case RwSplitServerParse.CREATE_DATABASE:
|
||||
case RwSplitServerParse.CREATE_VIEW:
|
||||
case RwSplitServerParse.DROP_VIEW:
|
||||
case RwSplitServerParse.INSTALL:
|
||||
case RwSplitServerParse.RENAME:
|
||||
case RwSplitServerParse.UNINSTALL:
|
||||
case RwSplitServerParse.GRANT:
|
||||
case RwSplitServerParse.REVOKE:
|
||||
return (isSuccess, rwSplitService) -> {
|
||||
if (session.getService().isTxStart()) {
|
||||
rwSplitService.setTxStart(false);
|
||||
rwSplitService.getSession().unbindIfSafe(true);
|
||||
session.getService().singleTransactionsCount();
|
||||
}
|
||||
};
|
||||
default:
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -0,0 +1,135 @@
|
||||
package com.actiontech.dble.server.parser;
|
||||
|
||||
import org.junit.Assert;
|
||||
import org.junit.Test;
|
||||
|
||||
|
||||
public class RwSplitServerParseTest {
|
||||
|
||||
|
||||
@Test
|
||||
public void testIsGrant() {
|
||||
Assert.assertEquals(RwSplitServerParse.GRANT, 0xff & RwSplitServerParse.parse(" grant ..."));
|
||||
Assert.assertEquals(RwSplitServerParse.GRANT, 0xff & RwSplitServerParse.parse("GRANT ..."));
|
||||
Assert.assertEquals(RwSplitServerParse.GRANT, 0xff & RwSplitServerParse.parse(" Grant a"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testIsRevoke() {
|
||||
Assert.assertEquals(RwSplitServerParse.REVOKE, 0xff & RwSplitServerParse.parse(" revoke ..."));
|
||||
Assert.assertEquals(RwSplitServerParse.REVOKE, 0xff & RwSplitServerParse.parse("REVOKE ..."));
|
||||
Assert.assertEquals(RwSplitServerParse.REVOKE, 0xff & RwSplitServerParse.parse(" Revoke a"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testIsInstall() {
|
||||
Assert.assertEquals(RwSplitServerParse.INSTALL, 0xff & RwSplitServerParse.parse(" install ..."));
|
||||
Assert.assertEquals(RwSplitServerParse.INSTALL, 0xff & RwSplitServerParse.parse("INSTALL ..."));
|
||||
Assert.assertEquals(RwSplitServerParse.INSTALL, 0xff & RwSplitServerParse.parse(" Install a"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testIsRename() {
|
||||
Assert.assertEquals(RwSplitServerParse.RENAME, 0xff & RwSplitServerParse.parse(" rename ..."));
|
||||
Assert.assertEquals(RwSplitServerParse.RENAME, 0xff & RwSplitServerParse.parse("RENAME ..."));
|
||||
Assert.assertEquals(RwSplitServerParse.RENAME, 0xff & RwSplitServerParse.parse(" Rename a"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testIsUnInstall() {
|
||||
Assert.assertEquals(RwSplitServerParse.UNINSTALL, 0xff & RwSplitServerParse.parse(" uninstall ..."));
|
||||
Assert.assertEquals(RwSplitServerParse.UNINSTALL, 0xff & RwSplitServerParse.parse("UNINSTALL ..."));
|
||||
Assert.assertEquals(RwSplitServerParse.UNINSTALL, 0xff & RwSplitServerParse.parse(" Uninstall a"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testIsStartTransaction() {
|
||||
Assert.assertEquals(RwSplitServerParse.START_TRANSACTION, 0xff & RwSplitServerParse.parse(" START TRANSACTION"));
|
||||
Assert.assertEquals(RwSplitServerParse.START_TRANSACTION, 0xff & RwSplitServerParse.parse(" start transaction"));
|
||||
Assert.assertEquals(RwSplitServerParse.START_TRANSACTION, 0xff & RwSplitServerParse.parse(" Start Transaction"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testIsStartSlave() {
|
||||
Assert.assertEquals(RwSplitServerParse.OTHER & 0xff, 0xff & RwSplitServerParse.parse(" START SLAVE ..."));
|
||||
Assert.assertEquals(RwSplitServerParse.OTHER & 0xff, 0xff & RwSplitServerParse.parse(" start slave ..."));
|
||||
Assert.assertEquals(RwSplitServerParse.OTHER & 0xff, 0xff & RwSplitServerParse.parse(" Start Slave a"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testIsAnalyze() {
|
||||
Assert.assertEquals(RwSplitServerParse.UNSUPPORT & 0xff, 0xff & RwSplitServerParse.parse(" ANALYZE TABLE test"));
|
||||
Assert.assertEquals(RwSplitServerParse.UNSUPPORT & 0xff, 0xff & RwSplitServerParse.parse(" analyze table test"));
|
||||
Assert.assertEquals(RwSplitServerParse.UNSUPPORT & 0xff, 0xff & RwSplitServerParse.parse(" Analyze Table test"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testIsCache() {
|
||||
Assert.assertEquals(RwSplitServerParse.OTHER & 0xff, 0xff & RwSplitServerParse.parse(" CACHE INDEX test"));
|
||||
Assert.assertEquals(RwSplitServerParse.OTHER & 0xff, 0xff & RwSplitServerParse.parse(" cache index test"));
|
||||
Assert.assertEquals(RwSplitServerParse.OTHER & 0xff, 0xff & RwSplitServerParse.parse(" Cache Index test"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testIsCheck() {
|
||||
Assert.assertEquals(RwSplitServerParse.OTHER & 0xff, 0xff & RwSplitServerParse.parse(" CHECK TABLE test"));
|
||||
Assert.assertEquals(RwSplitServerParse.OTHER & 0xff, 0xff & RwSplitServerParse.parse(" check table test"));
|
||||
Assert.assertEquals(RwSplitServerParse.OTHER & 0xff, 0xff & RwSplitServerParse.parse(" Check Table test"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testIsFlush() {
|
||||
Assert.assertEquals(RwSplitServerParse.OTHER & 0xff, 0xff & RwSplitServerParse.parse(" flush"));
|
||||
Assert.assertEquals(RwSplitServerParse.OTHER & 0xff, 0xff & RwSplitServerParse.parse(" FLUSH"));
|
||||
Assert.assertEquals(RwSplitServerParse.OTHER & 0xff, 0xff & RwSplitServerParse.parse(" Flush"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testIsLoadIndex() {
|
||||
Assert.assertEquals(RwSplitServerParse.UNSUPPORT & 0xff, 0xff & RwSplitServerParse.parse(" LOAD INDEX INTO CACHE"));
|
||||
Assert.assertEquals(RwSplitServerParse.UNSUPPORT & 0xff, 0xff & RwSplitServerParse.parse(" load index into cache"));
|
||||
Assert.assertEquals(RwSplitServerParse.UNSUPPORT & 0xff, 0xff & RwSplitServerParse.parse(" Load Index Into Cache"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testIsOptimize() {
|
||||
Assert.assertEquals(RwSplitServerParse.UNSUPPORT & 0xff, 0xff & RwSplitServerParse.parse(" OPTIMIZE TABLE test"));
|
||||
Assert.assertEquals(RwSplitServerParse.UNSUPPORT & 0xff, 0xff & RwSplitServerParse.parse(" optimize table test"));
|
||||
Assert.assertEquals(RwSplitServerParse.UNSUPPORT & 0xff, 0xff & RwSplitServerParse.parse(" Optimize Table Test"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testIsRepair() {
|
||||
Assert.assertEquals(RwSplitServerParse.UNSUPPORT & 0xff, 0xff & RwSplitServerParse.parse(" REPAIR TABLE test "));
|
||||
Assert.assertEquals(RwSplitServerParse.UNSUPPORT & 0xff, 0xff & RwSplitServerParse.parse(" repair table test "));
|
||||
Assert.assertEquals(RwSplitServerParse.UNSUPPORT & 0xff, 0xff & RwSplitServerParse.parse(" Repair Table test "));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testIsReset() {
|
||||
Assert.assertEquals(RwSplitServerParse.OTHER & 0xff, 0xff & RwSplitServerParse.parse(" RESET test"));
|
||||
Assert.assertEquals(RwSplitServerParse.OTHER & 0xff, 0xff & RwSplitServerParse.parse(" reset test"));
|
||||
Assert.assertEquals(RwSplitServerParse.OTHER & 0xff, 0xff & RwSplitServerParse.parse(" Reset test"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testIsStop() {
|
||||
Assert.assertEquals(RwSplitServerParse.OTHER & 0xff, 0xff & RwSplitServerParse.parse(" STOP SLAVE"));
|
||||
Assert.assertEquals(RwSplitServerParse.OTHER & 0xff, 0xff & RwSplitServerParse.parse(" stop slave"));
|
||||
Assert.assertEquals(RwSplitServerParse.OTHER & 0xff, 0xff & RwSplitServerParse.parse(" Stop Slave"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testIsResetSlave() {
|
||||
Assert.assertEquals(RwSplitServerParse.OTHER & 0xff, 0xff & RwSplitServerParse.parse(" RESET SLAVE"));
|
||||
Assert.assertEquals(RwSplitServerParse.OTHER & 0xff, 0xff & RwSplitServerParse.parse(" reset slave"));
|
||||
Assert.assertEquals(RwSplitServerParse.OTHER & 0xff, 0xff & RwSplitServerParse.parse(" Reset Slave"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testIsChange() {
|
||||
Assert.assertEquals(RwSplitServerParse.OTHER & 0xff, 0xff & RwSplitServerParse.parse(" CHANGE MASTER TO"));
|
||||
Assert.assertEquals(RwSplitServerParse.OTHER & 0xff, 0xff & RwSplitServerParse.parse(" change master to"));
|
||||
Assert.assertEquals(RwSplitServerParse.OTHER & 0xff, 0xff & RwSplitServerParse.parse(" Change Master to"));
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user