fixed issue #330 & #350 , json length & escapse

This commit is contained in:
agapple
2017-08-03 21:15:09 +08:00
parent ca350a79bd
commit 67436b2bc4
3 changed files with 40 additions and 5 deletions

View File

@@ -363,12 +363,12 @@ public class JsonConversion {
buf.append('"').append(text).append('"'); buf.append('"').append(text).append('"');
} else { } else {
text = m_data.getFixString((int) m_length, charsetName); text = m_data.getFixString((int) m_length, charsetName);
buf.append('"').append(text).append('"'); buf.append('"').append(escapse(text)).append('"');
} }
break; break;
case STRING: case STRING:
buf.append('"').append(m_string_value).append('"'); buf.append('"').append(escapse(m_string_value)).append('"');
break; break;
case ERROR: case ERROR:
throw new IllegalArgumentException("illegal json data"); throw new IllegalArgumentException("illegal json data");
@@ -378,6 +378,21 @@ public class JsonConversion {
} }
} }
private static StringBuilder escapse(String data) {
StringBuilder sb = new StringBuilder(data.length());
int endIndex = data.length();
for (int i = 0; i < endIndex; ++i) {
char c = data.charAt(i);
if (c == '"') {
sb.append('\\');
} else if (c == '\\') {
sb.append("\\");
}
sb.append(c);
}
return sb;
}
public static enum Json_enum_type { public static enum Json_enum_type {
OBJECT, ARRAY, STRING, INT, UINT, DOUBLE, LITERAL_NULL, LITERAL_TRUE, LITERAL_FALSE, OPAQUE, ERROR OBJECT, ARRAY, STRING, INT, UINT, DOUBLE, LITERAL_NULL, LITERAL_TRUE, LITERAL_FALSE, OPAQUE, ERROR
} }

View File

@@ -949,8 +949,28 @@ public final class RowsLogBuffer {
break; break;
} }
case LogEvent.MYSQL_TYPE_JSON: { case LogEvent.MYSQL_TYPE_JSON: {
len = buffer.getUint16(); switch (meta) {
buffer.forward(meta - 2); case 1: {
len = buffer.getUint8();
break;
}
case 2: {
len = buffer.getUint16();
break;
}
case 3: {
len = buffer.getUint24();
break;
}
case 4: {
len = (int) buffer.getUint32();
break;
}
default:
throw new IllegalArgumentException("!! Unknown JSON packlen = " + meta);
}
// len = buffer.getUint16();
// buffer.forward(meta - 4);
int position = buffer.position(); int position = buffer.position();
Json_Value jsonValue = JsonConversion.parse_value(buffer.getUint8(), buffer, len - 1, charsetName); Json_Value jsonValue = JsonConversion.parse_value(buffer.getUint8(), buffer, len - 1, charsetName);
StringBuilder builder = new StringBuilder(); StringBuilder builder = new StringBuilder();

View File

@@ -275,7 +275,7 @@ public abstract class AbstractEventParser<EVENT> extends AbstractCanalLifeCycle
parseThread.setUncaughtExceptionHandler(handler); parseThread.setUncaughtExceptionHandler(handler);
parseThread.setName(String.format("destination = %s , address = %s , EventParser", parseThread.setName(String.format("destination = %s , address = %s , EventParser",
destination, destination,
runningInfo == null ? null : runningInfo.getAddress().toString())); runningInfo == null ? null : runningInfo.getAddress()));
parseThread.start(); parseThread.start();
} }