|
@@ -2,19 +2,17 @@ package com.alibaba.otter.canal.parse.inbound.mysql.dbsync;
|
|
|
|
|
|
import java.io.IOException;
|
|
|
import java.util.ArrayList;
|
|
|
-import java.util.HashMap;
|
|
|
import java.util.List;
|
|
|
-import java.util.Map;
|
|
|
|
|
|
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.exception.CanalParseException;
|
|
|
import com.alibaba.otter.canal.parse.inbound.TableMeta;
|
|
|
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.ddl.DruidDdlParser;
|
|
|
+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.TableMetaTSDB;
|
|
|
import com.alibaba.otter.canal.protocol.position.EntryPosition;
|
|
|
import com.google.common.cache.CacheBuilder;
|
|
@@ -77,43 +75,23 @@ public class TableMetaCache {
|
|
|
}
|
|
|
|
|
|
private TableMeta getTableMetaByDB(String fullname) throws IOException {
|
|
|
- ResultSetPacket packet = connection.query("desc " + fullname);
|
|
|
+ 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(packet));
|
|
|
+ return new TableMeta(schema, table, parserTableMeta(schema, table, packet));
|
|
|
}
|
|
|
|
|
|
- public static List<FieldMeta> parserTableMeta(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);
|
|
|
+ public static List<FieldMeta> parserTableMeta(String schema, String table, ResultSetPacket packet) {
|
|
|
+ if (packet.getFieldValues().size() > 1) {
|
|
|
+ String createDDL = packet.getFieldValues().get(1);
|
|
|
+ MemoryTableMeta memoryTableMeta = new MemoryTableMeta();
|
|
|
+ memoryTableMeta.apply(DatabaseTableMeta.INIT_POSITION, schema, createDDL, null);
|
|
|
+ TableMeta tableMeta = memoryTableMeta.find(schema, table);
|
|
|
+ return tableMeta.getFields();
|
|
|
+ } else {
|
|
|
+ return new ArrayList<FieldMeta>();
|
|
|
}
|
|
|
-
|
|
|
- return result;
|
|
|
}
|
|
|
|
|
|
public TableMeta getTableMeta(String schema, String table) {
|