in eventmesh-connectors/eventmesh-connector-jdbc/src/main/java/org/apache/eventmesh/connector/jdbc/source/dialect/antlr4/mysql/listener/ColumnDefinitionParserListener.java [89:203]
public void enterColumnDefinition(ColumnDefinitionContext ctx) {
// parse Column data type
this.parser.runIfAllNotNull(() -> {
DataTypeContext dataTypeContext = ctx.dataType();
String dataTypeString = null;
if (dataTypeContext instanceof StringDataTypeContext) {
StringDataTypeContext stringDataTypeCtx = (StringDataTypeContext) dataTypeContext;
dataTypeString = stringDataTypeCtx.typeName.getText();
// parse data type length
if (stringDataTypeCtx.lengthOneDimension() != null) {
this.columnEditor.length(Integer.parseInt(stringDataTypeCtx.lengthOneDimension().decimalLiteral().getText()));
}
// parse data type charset and collation
String charsetName = parser.parseCharset(stringDataTypeCtx.charsetName());
String collationName = parser.parseCollation(stringDataTypeCtx.collationName());
columnEditor.charsetName(charsetName);
columnEditor.collation(collationName);
} else if (dataTypeContext instanceof NationalStringDataTypeContext) {
NationalStringDataTypeContext nationalStringDataTypeCtx = (NationalStringDataTypeContext) dataTypeContext;
dataTypeString = nationalStringDataTypeCtx.typeName.getText();
if (nationalStringDataTypeCtx.lengthOneDimension() != null) {
this.columnEditor.length(Integer.parseInt(nationalStringDataTypeCtx.lengthOneDimension().decimalLiteral().getText()));
}
} else if (dataTypeContext instanceof NationalVaryingStringDataTypeContext) {
NationalVaryingStringDataTypeContext nationalVaryingStringDataTypeCtx = (NationalVaryingStringDataTypeContext) dataTypeContext;
dataTypeString = nationalVaryingStringDataTypeCtx.typeName.getText();
if (nationalVaryingStringDataTypeCtx.lengthOneDimension() != null) {
this.columnEditor.length(Integer.parseInt(nationalVaryingStringDataTypeCtx.lengthOneDimension().decimalLiteral().getText()));
}
} else if (dataTypeContext instanceof DimensionDataTypeContext) {
DimensionDataTypeContext dimensionDataTypeCtx = (DimensionDataTypeContext) dataTypeContext;
dataTypeString = dimensionDataTypeCtx.typeName.getText();
// parse column length
if (dimensionDataTypeCtx.lengthOneDimension() != null) {
this.columnEditor.length(Integer.parseInt(dimensionDataTypeCtx.lengthOneDimension().decimalLiteral().getText()));
}
// parse column scale if has scale
if (dimensionDataTypeCtx.lengthTwoDimension() != null) {
List<DecimalLiteralContext> decimalLiteralContexts = dimensionDataTypeCtx.lengthTwoDimension().decimalLiteral();
this.columnEditor.length(Integer.parseInt(decimalLiteralContexts.get(0).getText()));
this.columnEditor.scale(Integer.parseInt(decimalLiteralContexts.get(1).getText()));
}
if (dimensionDataTypeCtx.lengthTwoOptionalDimension() != null) {
List<DecimalLiteralContext> decimalLiteralContexts = dimensionDataTypeCtx.lengthTwoOptionalDimension().decimalLiteral();
if (decimalLiteralContexts.get(0).REAL_LITERAL() != null) {
String[] digits = decimalLiteralContexts.get(0).getText().split(".");
if (StringUtils.isBlank(digits[0]) || Integer.valueOf(digits[0]) == 0) {
this.columnEditor.length(10);
} else {
this.columnEditor.length(Integer.valueOf(digits[0]));
}
} else {
this.columnEditor.length(Integer.parseInt(decimalLiteralContexts.get(0).getText()));
}
if (decimalLiteralContexts.size() > 1) {
this.columnEditor.scale(Integer.parseInt(decimalLiteralContexts.get(1).getText()));
}
}
if (CollectionUtils.isNotEmpty(dimensionDataTypeCtx.SIGNED())) {
this.columnEditor.withOption(MysqlColumnOptions.SIGNED, dimensionDataTypeCtx.SIGNED().get(0).getText());
}
if (CollectionUtils.isNotEmpty(dimensionDataTypeCtx.UNSIGNED())) {
this.columnEditor.withOption(MysqlColumnOptions.UNSIGNED, dimensionDataTypeCtx.UNSIGNED().get(0).getText());
}
if (CollectionUtils.isNotEmpty(dimensionDataTypeCtx.ZEROFILL())) {
this.columnEditor.withOption(MysqlColumnOptions.ZEROFILL, dimensionDataTypeCtx.ZEROFILL().get(0).getText());
}
} else if (dataTypeContext instanceof SimpleDataTypeContext) {
// Do nothing for example: DATE, TINYBLOB, etc.
SimpleDataTypeContext simpleDataTypeCtx = (SimpleDataTypeContext) dataTypeContext;
dataTypeString = simpleDataTypeCtx.typeName.getText();
} else if (dataTypeContext instanceof CollectionDataTypeContext) {
CollectionDataTypeContext collectionDataTypeContext = (CollectionDataTypeContext) dataTypeContext;
dataTypeString = collectionDataTypeContext.typeName.getText();
if (collectionDataTypeContext.charsetName() != null) {
String charsetName = collectionDataTypeContext.charsetName().getText();
columnEditor.charsetName(charsetName);
}
} else if (dataTypeContext instanceof SpatialDataTypeContext) {
// do nothing
SpatialDataTypeContext spatialDataTypeCtx = (SpatialDataTypeContext) dataTypeContext;
dataTypeString = spatialDataTypeCtx.typeName.getText();
} else if (dataTypeContext instanceof LongVarcharDataTypeContext) {
LongVarcharDataTypeContext longVarcharDataTypeCtx = (LongVarcharDataTypeContext) dataTypeContext;
dataTypeString = longVarcharDataTypeCtx.typeName.getText();
String charsetName = parser.parseCharset(longVarcharDataTypeCtx.charsetName());
String collationName = parser.parseCollation(longVarcharDataTypeCtx.collationName());
columnEditor.charsetName(charsetName);
columnEditor.collation(collationName);
}
// handle enum and set type values
if (StringUtils.equalsAnyIgnoreCase(dataTypeString, "ENUM", "SET")) {
CollectionDataTypeContext collectionDataTypeContext = (CollectionDataTypeContext) dataTypeContext;
List<String> values = collectionDataTypeContext.collectionOptions().STRING_LITERAL().stream()
.map(node -> JdbcStringUtils.withoutWrapper(node.getText())).collect(Collectors.toList());
columnEditor.enumValues(values);
}
if (StringUtils.isNotBlank(dataTypeString)) {
EventMeshDataType eventMeshType = this.dataTypeConvertor.toEventMeshType(dataTypeString);
this.columnEditor.withEventMeshType(eventMeshType);
this.columnEditor.withJdbcType(this.dataTypeConvertor.toJDBCType(dataTypeString));
this.columnEditor.withType(dataTypeString);
}
}, columnEditor);
this.parser.runIfAllNotNull(() -> {
// parse column default value
ColumnDefinitionParserListener.this.defaultValueParserListener = new DefaultValueParserListener(columnEditor);
ColumnDefinitionParserListener.this.listeners.add(defaultValueParserListener);
}, tableEditor, columnEditor);
super.enterColumnDefinition(ctx);
}