package com.haogrgr.test.main;
import java.io.File;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import com.google.common.base.Charsets;
import com.google.common.io.Files;
public class MyqlToH2 {
public static void main(String[] args) throws Exception {
File file = new File("/Users/tudesheng/projects/haogrgr/haogrgr-test/src/test/resources/sql/test_schema2.sql");
String content = Files.toString(file, Charsets.UTF_8);
//设置模式为mysql
content = "SET MODE MYSQL;\n\n" + content;
//`不支持, 替换掉
content = content.replaceAll("`", "");
//`msg_body` varchar(5000) COLLATE utf8_bin NOT NULL, 中的COLLATE utf8_bin不兼容替换掉
content = content.replaceAll("COLLATE.*(?=D)", "");
//注释也替换掉吧, 不替换应该也没啥问题
content = content.replaceAll("COMMENT.*'(?=,)", "");
//) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin; 这一行也替换掉, ENGINE语法不支持
content = content.replaceAll("\\).*ENGINE=InnoDB.*", ");");
//content = content.replaceAll("\\).*ENGINE.*(?=;)", ")");
//double(22,2) 不支持
content = content.replaceAll("double\\(.*?\\)", "double");
//KEY idx_cndcp_lg_scheme_cw126126 (channel_key,wh_res_code(255)) 不支持,鬼知道是什么语法, 去掉(255)
content = content.replaceAll("(KEY .*?\\(.*?)\\(\\d+\\)(.*)", "$1$2");
//时戳更新不支持, 修改为H2 AS CURRENT_TIMESTAMP语法
content = content.replaceAll("DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP", " AS CURRENT_TIMESTAMP");
//H2索引名得全局唯一, 替换为全局唯一
content = uniqueKey(content);
System.out.println(content);
}
/**
* h2的索引名必须全局唯一
*
* @param content sql建表脚本
* @return 替换索引名为全局唯一
*/
private static String uniqueKey(String content) {
int inc = 0;
Pattern pattern = Pattern.compile("(?<=KEY )(.*?)(?= \\()");
Matcher matcher = pattern.matcher(content);
StringBuffer sb = new StringBuffer();
while (matcher.find()) {
matcher.appendReplacement(sb, matcher.group() + inc++);
}
matcher.appendTail(sb);
content = sb.toString();
return content;
}
}