|
@@ -2,15 +2,19 @@ package com.alibaba.otter.canal.parse.inbound.mysql.dbsync;
|
|
|
|
|
|
import java.io.IOException;
|
|
import java.io.IOException;
|
|
import java.util.ArrayList;
|
|
import java.util.ArrayList;
|
|
|
|
+import java.util.HashMap;
|
|
import java.util.List;
|
|
import java.util.List;
|
|
|
|
+import java.util.Map;
|
|
|
|
|
|
import org.apache.commons.lang.StringUtils;
|
|
import org.apache.commons.lang.StringUtils;
|
|
|
|
|
|
|
|
+import com.alibaba.otter.canal.parse.driver.mysql.packets.server.FieldPacket;
|
|
import com.alibaba.otter.canal.parse.driver.mysql.packets.server.ResultSetPacket;
|
|
import com.alibaba.otter.canal.parse.driver.mysql.packets.server.ResultSetPacket;
|
|
import com.alibaba.otter.canal.parse.exception.CanalParseException;
|
|
import com.alibaba.otter.canal.parse.exception.CanalParseException;
|
|
import com.alibaba.otter.canal.parse.inbound.TableMeta;
|
|
import com.alibaba.otter.canal.parse.inbound.TableMeta;
|
|
import com.alibaba.otter.canal.parse.inbound.TableMeta.FieldMeta;
|
|
import com.alibaba.otter.canal.parse.inbound.TableMeta.FieldMeta;
|
|
import com.alibaba.otter.canal.parse.inbound.mysql.MysqlConnection;
|
|
import com.alibaba.otter.canal.parse.inbound.mysql.MysqlConnection;
|
|
|
|
+import com.alibaba.otter.canal.parse.inbound.mysql.ddl.DruidDdlParser;
|
|
import com.alibaba.otter.canal.parse.inbound.mysql.tsdb.DatabaseTableMeta;
|
|
import com.alibaba.otter.canal.parse.inbound.mysql.tsdb.DatabaseTableMeta;
|
|
import com.alibaba.otter.canal.parse.inbound.mysql.tsdb.MemoryTableMeta;
|
|
import com.alibaba.otter.canal.parse.inbound.mysql.tsdb.MemoryTableMeta;
|
|
import com.alibaba.otter.canal.parse.inbound.mysql.tsdb.TableMetaTSDB;
|
|
import com.alibaba.otter.canal.parse.inbound.mysql.tsdb.TableMetaTSDB;
|
|
@@ -75,14 +79,22 @@ public class TableMetaCache {
|
|
}
|
|
}
|
|
|
|
|
|
private TableMeta getTableMetaByDB(String fullname) throws IOException {
|
|
private TableMeta getTableMetaByDB(String fullname) throws IOException {
|
|
- ResultSetPacket packet = connection.query("show create table " + fullname);
|
|
|
|
- String[] names = StringUtils.split(fullname, "`.`");
|
|
|
|
- String schema = names[0];
|
|
|
|
- String table = names[1].substring(0, names[1].length());
|
|
|
|
- return new TableMeta(schema, table, parserTableMeta(schema, table, packet));
|
|
|
|
|
|
+ try {
|
|
|
|
+ ResultSetPacket packet = connection.query("show create table " + fullname);
|
|
|
|
+ String[] names = StringUtils.split(fullname, "`.`");
|
|
|
|
+ String schema = names[0];
|
|
|
|
+ String table = names[1].substring(0, names[1].length());
|
|
|
|
+ return new TableMeta(schema, table, parseTableMeta(schema, table, packet));
|
|
|
|
+ } catch (Throwable e) { // fallback to desc table
|
|
|
|
+ ResultSetPacket packet = connection.query("desc " + fullname);
|
|
|
|
+ String[] names = StringUtils.split(fullname, "`.`");
|
|
|
|
+ String schema = names[0];
|
|
|
|
+ String table = names[1].substring(0, names[1].length());
|
|
|
|
+ return new TableMeta(schema, table, parseTableMetaByDesc(packet));
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
- public static List<FieldMeta> parserTableMeta(String schema, String table, ResultSetPacket packet) {
|
|
|
|
|
|
+ public static List<FieldMeta> parseTableMeta(String schema, String table, ResultSetPacket packet) {
|
|
if (packet.getFieldValues().size() > 1) {
|
|
if (packet.getFieldValues().size() > 1) {
|
|
String createDDL = packet.getFieldValues().get(1);
|
|
String createDDL = packet.getFieldValues().get(1);
|
|
MemoryTableMeta memoryTableMeta = new MemoryTableMeta();
|
|
MemoryTableMeta memoryTableMeta = new MemoryTableMeta();
|
|
@@ -94,6 +106,40 @@ public class TableMetaCache {
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ /**
|
|
|
|
+ * 处理desc table的结果
|
|
|
|
+ */
|
|
|
|
+ public static List<FieldMeta> parseTableMetaByDesc(ResultSetPacket packet) {
|
|
|
|
+ Map<String, Integer> nameMaps = new HashMap<String, Integer>(6, 1f);
|
|
|
|
+ int index = 0;
|
|
|
|
+ for (FieldPacket fieldPacket : packet.getFieldDescriptors()) {
|
|
|
|
+ nameMaps.put(fieldPacket.getOriginalName(), index++);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ int size = packet.getFieldDescriptors().size();
|
|
|
|
+ int count = packet.getFieldValues().size() / packet.getFieldDescriptors().size();
|
|
|
|
+ List<FieldMeta> result = new ArrayList<FieldMeta>();
|
|
|
|
+ for (int i = 0; i < count; i++) {
|
|
|
|
+ FieldMeta meta = new FieldMeta();
|
|
|
|
+ // 做一个优化,使用String.intern(),共享String对象,减少内存使用
|
|
|
|
+ meta.setColumnName(packet.getFieldValues().get(nameMaps.get(COLUMN_NAME) + i * size).intern());
|
|
|
|
+ meta.setColumnType(packet.getFieldValues().get(nameMaps.get(COLUMN_TYPE) + i * size));
|
|
|
|
+ meta.setNullable(StringUtils.equalsIgnoreCase(packet.getFieldValues().get(nameMaps.get(IS_NULLABLE) + i
|
|
|
|
+ * size),
|
|
|
|
+ "YES"));
|
|
|
|
+ meta.setKey("PRI".equalsIgnoreCase(packet.getFieldValues().get(nameMaps.get(COLUMN_KEY) + i * size)));
|
|
|
|
+ meta.setUnique("UNI".equalsIgnoreCase(packet.getFieldValues().get(nameMaps.get(COLUMN_KEY) + i * size)));
|
|
|
|
+ // 特殊处理引号
|
|
|
|
+ meta.setDefaultValue(DruidDdlParser.unescapeQuotaName(packet.getFieldValues()
|
|
|
|
+ .get(nameMaps.get(COLUMN_DEFAULT) + i * size)));
|
|
|
|
+ meta.setExtra(packet.getFieldValues().get(nameMaps.get(EXTRA) + i * size));
|
|
|
|
+
|
|
|
|
+ result.add(meta);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return result;
|
|
|
|
+ }
|
|
|
|
+
|
|
public TableMeta getTableMeta(String schema, String table) {
|
|
public TableMeta getTableMeta(String schema, String table) {
|
|
return getTableMeta(schema, table, true);
|
|
return getTableMeta(schema, table, true);
|
|
}
|
|
}
|