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:
LUA
2020-10-22 18:13:10 +08:00
committed by GitHub
parent f0d1495b92
commit e08ac1d425
7 changed files with 687 additions and 52 deletions
@@ -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"));
}
}