From 9da2bd85247d15b149ab6c58602ceccbf9b3880c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=98=BF=E6=B2=90?= Date: Tue, 27 Feb 2024 18:44:52 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E6=95=B0=E6=8D=AE=E6=9D=83?= =?UTF-8?q?=E9=99=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../interceptor/DataScopeInnerInterceptor.java | 3 +- .../framework/mybatis/interceptor/StringValue.java | 108 +++++++++++++++++++++ 2 files changed, 109 insertions(+), 2 deletions(-) create mode 100644 maku-framework/src/main/java/net/maku/framework/mybatis/interceptor/StringValue.java diff --git a/maku-framework/src/main/java/net/maku/framework/mybatis/interceptor/DataScopeInnerInterceptor.java b/maku-framework/src/main/java/net/maku/framework/mybatis/interceptor/DataScopeInnerInterceptor.java index 41872ae..e598c98 100644 --- a/maku-framework/src/main/java/net/maku/framework/mybatis/interceptor/DataScopeInnerInterceptor.java +++ b/maku-framework/src/main/java/net/maku/framework/mybatis/interceptor/DataScopeInnerInterceptor.java @@ -5,7 +5,6 @@ import com.baomidou.mybatisplus.core.toolkit.PluginUtils; import com.baomidou.mybatisplus.extension.plugins.inner.InnerInterceptor; import net.sf.jsqlparser.JSQLParserException; import net.sf.jsqlparser.expression.Expression; -import net.sf.jsqlparser.expression.StringValue; import net.sf.jsqlparser.expression.operators.conditional.AndExpression; import net.sf.jsqlparser.parser.CCJSqlParserUtil; import net.sf.jsqlparser.statement.select.PlainSelect; @@ -73,7 +72,7 @@ public class DataScopeInnerInterceptor implements InnerInterceptor { plainSelect.setWhere(andExpression); } - return select.toString().replaceAll("'", ""); + return select.toString(); } catch (JSQLParserException e) { return buildSql; } diff --git a/maku-framework/src/main/java/net/maku/framework/mybatis/interceptor/StringValue.java b/maku-framework/src/main/java/net/maku/framework/mybatis/interceptor/StringValue.java new file mode 100644 index 0000000..a414668 --- /dev/null +++ b/maku-framework/src/main/java/net/maku/framework/mybatis/interceptor/StringValue.java @@ -0,0 +1,108 @@ +package net.maku.framework.mybatis.interceptor; + +import net.sf.jsqlparser.expression.Expression; +import net.sf.jsqlparser.expression.ExpressionVisitor; +import net.sf.jsqlparser.parser.ASTNodeAccessImpl; + +import java.util.Arrays; +import java.util.List; +import java.util.Objects; + +public class StringValue extends ASTNodeAccessImpl implements Expression { + + private String value = ""; + private String prefix = null; + + public static final List ALLOWED_PREFIXES = Arrays.asList("N", "U", "E", "R", "B", "RB", "_utf8"); + + public StringValue() { + // empty constructor + } + + public StringValue(String escapedValue) { + // removing "'" at the start and at the end + if (escapedValue.startsWith("'") && escapedValue.endsWith("'")) { + value = escapedValue.substring(1, escapedValue.length() - 1); + return; + } + + if (escapedValue.length() > 2) { + for (String p : ALLOWED_PREFIXES) { + if (escapedValue.length() > p.length() && escapedValue.substring(0, p.length()).equalsIgnoreCase(p) + && escapedValue.charAt(p.length()) == '\'') { + this.prefix = p; + value = escapedValue.substring(p.length() + 1, escapedValue.length() - 1); + return; + } + } + } + + value = escapedValue; + } + + public String getValue() { + return value; + } + + public String getPrefix() { + return prefix; + } + + public String getNotExcapedValue() { + StringBuilder buffer = new StringBuilder(value); + int index = 0; + int deletesNum = 0; + while ((index = value.indexOf("''", index)) != -1) { + buffer.deleteCharAt(index - deletesNum); + index += 2; + deletesNum++; + } + return buffer.toString(); + } + + public void setValue(String string) { + value = string; + } + + public void setPrefix(String prefix) { + this.prefix = prefix; + } + + @Override + public void accept(ExpressionVisitor expressionVisitor) { +// expressionVisitor.visit(this); + } + + @Override + public String toString() { + return (prefix != null ? prefix : "") + value; + } + + public StringValue withPrefix(String prefix) { + this.setPrefix(prefix); + return this; + } + + public StringValue withValue(String value) { + this.setValue(value); + return this; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + StringValue that = (StringValue) o; + return Objects.equals(value, that.value) && Objects.equals(prefix, that.prefix); + } + + @Override + public int hashCode() { + return Objects.hash(value, prefix); + } + +}