@@ -123,7 +123,7 @@ public abstract class AbstractFileWork { | |||||
deleteSize++; | deleteSize++; | ||||
} | } | ||||
} | } | ||||
log.debug("[解析canal文件]:::file:" + file.getName() + " insert size:[" + insertSize + "] update size:[" + updateSize + "] delete size:[" + deleteSize + "] create size:[" + createSize + "] alter size:[" + alterSize + "]" + "drop size:[" + dropSize + "]"); | |||||
log.debug("[解析canal文件]:::file:" + file.getName() + " insert size:[" + insertSize + "] update size:[" + updateSize + "] delete size:[" + deleteSize + "] create size:[" + createSize + "] alter size:[" + alterSize + "]" + " drop size:[" + dropSize + "]"); | |||||
} | } | ||||
protected abstract String getDbType(); | protected abstract String getDbType(); | ||||
@@ -221,7 +221,11 @@ public abstract class AbstractFileWork { | |||||
protected Map<String, String> decodeCreateSql(String sql) { | protected Map<String, String> decodeCreateSql(String sql) { | ||||
Map<String, String> map = new HashMap<>(); | Map<String, String> map = new HashMap<>(); | ||||
String data = sql.substring(sql.indexOf("(") + 1, sql.lastIndexOf(")")).trim().replaceAll("`", "").replace("\t", ""); | String data = sql.substring(sql.indexOf("(") + 1, sql.lastIndexOf(")")).trim().replaceAll("`", "").replace("\t", ""); | ||||
String[] rows = data.split(",\\n");//data.split(",(?=(?:[^\']*\'[^\']*\')*[^\']*$)", -1); | |||||
String[] rows = data.split(",\n");//data.split(",(?=(?:[^\']*\'[^\']*\')*[^\']*$)", -1); | |||||
if (rows.length == 1) { | |||||
rows = data.split(",\r\n"); | |||||
} | |||||
for (String row : rows) { | for (String row : rows) { | ||||
//索引不管 | //索引不管 | ||||
if (row.contains("INDEX")) continue; | if (row.contains("INDEX")) continue; | ||||
@@ -52,25 +52,25 @@ public class KbSqlFileWork extends AbstractFileWork { | |||||
//添加sql | //添加sql | ||||
if (sql.contains("ADD")) { | if (sql.contains("ADD")) { | ||||
sb.append("ALTER TABLE public.").append(canalVO.getTableName()); | sb.append("ALTER TABLE public.").append(canalVO.getTableName()); | ||||
sql = sql.substring(sql.indexOf("ADD COLUMN")); | |||||
sql = sql.substring(sql.indexOf("ADD")); | |||||
String[] sqls = sql.split(",(?=(?:[^\']*\'[^\']*\')*[^\']*$)", -1); | String[] sqls = sql.split(",(?=(?:[^\']*\'[^\']*\')*[^\']*$)", -1); | ||||
for (String str : sqls) { | for (String str : sqls) { | ||||
String[] ss = str.split(" "); | String[] ss = str.split(" "); | ||||
sb.append(" ADD COLUMN ").append(ss[2]).append(" ").append(convertFieldType(ss[3])).append(" NULL ").append(","); | |||||
sb.append(" ADD if not exists ").append(ss[1]).append(" ").append(ss[2]).append(" ").append(convertFieldType(ss[3])).append(" NULL ").append(","); | |||||
} | } | ||||
sb.deleteCharAt(sb.length() - 1); | sb.deleteCharAt(sb.length() - 1); | ||||
} else if (sql.contains("DROP")) { | } else if (sql.contains("DROP")) { | ||||
sb.append("ALTER TABLE public.").append(canalVO.getTableName()); | sb.append("ALTER TABLE public.").append(canalVO.getTableName()); | ||||
sql = sql.substring(sql.indexOf("DROP COLUMN")); | |||||
sql = sql.substring(sql.indexOf("DROP")); | |||||
String[] sqls = sql.split(",(?=(?:[^\']*\'[^\']*\')*[^\']*$)", -1); | String[] sqls = sql.split(",(?=(?:[^\']*\'[^\']*\')*[^\']*$)", -1); | ||||
for (String str : sqls) { | for (String str : sqls) { | ||||
String[] ss = str.split(" "); | String[] ss = str.split(" "); | ||||
sb.append(" DROP COLUMN ").append(ss[2]).append(","); | |||||
sb.append(" DROP COLUMN IF EXISTS ").append(ss[2]).append(","); | |||||
} | } | ||||
sb.deleteCharAt(sb.length() - 1); | sb.deleteCharAt(sb.length() - 1); | ||||
} else if (sql.contains("CHANGE")) { | } else if (sql.contains("CHANGE")) { | ||||
sql = sql.substring(sql.indexOf("CHANGE COLUMN")); | |||||
sql = sql.substring(sql.indexOf("CHANGE")); | |||||
String[] sqls = sql.split(",(?=(?:[^\']*\'[^\']*\')*[^\']*$)", -1); | String[] sqls = sql.split(",(?=(?:[^\']*\'[^\']*\')*[^\']*$)", -1); | ||||
for (String str : sqls) { | for (String str : sqls) { | ||||
String[] ss = str.split(" "); | String[] ss = str.split(" "); | ||||
@@ -79,7 +79,7 @@ public class KbSqlFileWork extends AbstractFileWork { | |||||
sb.deleteCharAt(sb.length() - 1); | sb.deleteCharAt(sb.length() - 1); | ||||
} else if (sql.contains("MODIFY")) { | } else if (sql.contains("MODIFY")) { | ||||
sb.append("ALTER TABLE public.").append(canalVO.getTableName()); | sb.append("ALTER TABLE public.").append(canalVO.getTableName()); | ||||
sql = sql.substring(sql.indexOf("MODIFY COLUMN")); | |||||
sql = sql.substring(sql.indexOf("MODIFY")); | |||||
String[] sqls = sql.split(",(?=(?:[^\']*\'[^\']*\')*[^\']*$)", -1); | String[] sqls = sql.split(",(?=(?:[^\']*\'[^\']*\')*[^\']*$)", -1); | ||||
for (String str : sqls) { | for (String str : sqls) { | ||||
String[] ss = str.split(" "); | String[] ss = str.split(" "); | ||||
@@ -0,0 +1,111 @@ | |||||
smtweb: | |||||
machine-id: 1 | |||||
enable-job: true | |||||
bpm: | |||||
mode: 1 | |||||
debug: true | |||||
code-java-path: 'd:/work/smtweb2/smtweb-framework/canal/file' | |||||
db: | |||||
type: kbsql | |||||
default: | |||||
rule: | |||||
prefix: _smt_ | |||||
replace: smt_ | |||||
file: | |||||
local-path: | |||||
url: | |||||
# 服务模块 | |||||
devtools: | |||||
restart: | |||||
enabled: false # 热部署开关 | |||||
additional-paths: src/main/java #重启目录 | |||||
server: | |||||
port: 8081 | |||||
servlet: | |||||
context-path: | |||||
logging: | |||||
level: | |||||
root: INFO | |||||
cc.smtweb: DEBUG | |||||
spring: | |||||
redis: | |||||
host: 127.0.0.1 | |||||
port: 6379 | |||||
password: | |||||
database: 9 | |||||
datasource: | |||||
driver-class-name: com.kingbase8.Driver | |||||
# url: jdbc:kingbase8://10.176.246.198:54321/pgzx?useUnicode=true&characterEncoding=utf-8 | |||||
# username: 'zhengxie' | |||||
# password: '%TGB6yhn' | |||||
url: jdbc:kingbase8://172.28.123.205:54321/HLJTY?useUnicode=true&characterEncoding=utf-8 | |||||
username: system | |||||
password: system | |||||
servlet: | |||||
multipart: | |||||
max-file-size: 104857600000 | |||||
max-request-size: 10485760000000 | |||||
cache: | |||||
type: caffeine | |||||
cache-names: | |||||
- core | |||||
- bpm | |||||
caffeine: | |||||
spec: maximumSize=1024,expireAfterWrite=2h | |||||
# canal配置 | |||||
canal: | |||||
file: | |||||
enable: true | |||||
#path: /data/canalFile | |||||
path: E:/canalFile | |||||
# http 规则配置 | |||||
http-config: | |||||
xss: #xss 规则 | |||||
checkHeader: false #是否进行header校验 | |||||
checkParameter: true #是否进行parameter校验 | |||||
logIs: true #是否记录日志 | |||||
chain: true #是否中断请求 | |||||
replace: true #是否开启特殊字符替换 | |||||
checkUrl: true #是否开启特殊url校验 | |||||
regex: | |||||
# 匹配含有字符: alert( ) | |||||
- .*[A|a][L|l][E|e][R|r][T|t](.*).* | |||||
# 匹配含有字符: window.location | |||||
- .*[W|w][I|i][N|n][D|d][O|o][W|w].[L|l][O|o][C|c][A|a][T|t][I|i][O|o][N|n].* | |||||
# 匹配含有字符:style = x:ex pression ( ) | |||||
- .*[S|s][T|t][Y|y][L|l][E|e]\\s*=.*[X|x]:[E|e][X|x].*[P|p][R|r][E|e][S|s]{1,2}[I|i][O|o][N|n]\\s*\\(.*\\).* | |||||
# 匹配含有字符: document.cookie | |||||
- .*[D|d][O|o][C|c][U|u][M|m][E|e][N|n][T|t].[C|c][O|o]{2}[K|k][I|i][E|e].* | |||||
# 匹配含有字符: eval( ) | |||||
- .*[E|e][V|v][A|a][L|l](.*).* | |||||
# 匹配含有字符: unescape() | |||||
- .*[U|u][N|n][E|e][S|s][C|c][A|a][P|p][E|e](.*).* | |||||
# 匹配含有字符: execscript( ) | |||||
- .*[E|e][X|x][E|e][C|c][S|s][C|c][R|r][I|i][P|p][T|t](.*).* | |||||
# 匹配含有字符: msgbox( ) | |||||
- .*[M|m][S|s][G|g][B|b][O|o][X|x](.*).* | |||||
# 匹配含有字符: confirm( ) | |||||
- .*[C|c][O|o][N|n][F|f][I|i][R|r][M|m](.*).* | |||||
# 匹配含有字符: prompt( ) | |||||
- .*[P|p][R|r][O|o][M|m][P|p][T|t](.*).* | |||||
# 匹配含有字符: <script> </script> | |||||
- .*<[S|s][C|c][R|r][I|i][P|p][T|t]>.*.*</[S|s][C|c][R|r][I|i][P|p][T|t]>.* | |||||
# 匹配含有字符: </script> | |||||
- .*</[S|s][C|c][R|r][I|i][P|p][T|t]>.* | |||||
# 匹配含有字符: <script> | |||||
- .*<[S|s][C|c][R|r][I|i][P|p][T|t]>.* | |||||
res: # 响应头规则 | |||||
configs: | |||||
{ | |||||
Set-Cookie: Secure; HttpOnly, | |||||
Referrer-Policy: origin-when-cross-origin, | |||||
X-Frame-Options: SAMEORIGIN, | |||||
X-XSS-Protection: 1;mode=block , | |||||
X-Download-Options: SAMEORIGIN , | |||||
X-Content-Type-Options: nosniff , | |||||
Content-Security-Policy: default-src 'self'; img-src 'self' data:; script-src 'self' 'unsafe-inline' 'unsafe-eval' http://localhost:7102 https://localhost:7102; style-src 'self' 'unsafe-inline'; connect-src 'self';font-src 'self' data:; , | |||||
Strict-Transport-Security: max-age=31536000;includeSubDomains , | |||||
X-Permitted-Cross-Domain-Policies: master-only | |||||
} |
@@ -0,0 +1,107 @@ | |||||
smtweb: | |||||
machine-id: 1 | |||||
enable-job: true | |||||
bpm: | |||||
mode: 1 | |||||
debug: true | |||||
code-java-path: 'd:/work/smtweb2/smtweb-framework/canal/file' | |||||
db: | |||||
type: kbsql | |||||
default: | |||||
rule: | |||||
prefix: _smt_ | |||||
replace: smt_ | |||||
file: | |||||
local-path: | |||||
url: | |||||
# 服务模块 | |||||
devtools: | |||||
restart: | |||||
enabled: false # 热部署开关 | |||||
additional-paths: src/main/java #重启目录 | |||||
server: | |||||
port: 8081 | |||||
servlet: | |||||
context-path: | |||||
logging: | |||||
level: | |||||
root: INFO | |||||
cc.smtweb: DEBUG | |||||
spring: | |||||
redis: | |||||
host: 127.0.0.1 | |||||
port: 6379 | |||||
password: | |||||
database: 9 | |||||
datasource: | |||||
driver-class-name: com.kingbase8.Driver | |||||
url: jdbc:kingbase8://10.176.246.198:54321/pgzx?useUnicode=true&characterEncoding=utf-8 | |||||
username: 'zhengxie' | |||||
password: '%TGB6yhn' | |||||
servlet: | |||||
multipart: | |||||
max-file-size: 104857600000 | |||||
max-request-size: 10485760000000 | |||||
cache: | |||||
type: caffeine | |||||
cache-names: | |||||
- core | |||||
- bpm | |||||
caffeine: | |||||
spec: maximumSize=1024,expireAfterWrite=2h | |||||
# canal配置 | |||||
canal: | |||||
file: | |||||
enable: true | |||||
path: /data/canalFile | |||||
# http 规则配置 | |||||
http-config: | |||||
xss: #xss 规则 | |||||
checkHeader: false #是否进行header校验 | |||||
checkParameter: true #是否进行parameter校验 | |||||
logIs: true #是否记录日志 | |||||
chain: true #是否中断请求 | |||||
replace: true #是否开启特殊字符替换 | |||||
checkUrl: true #是否开启特殊url校验 | |||||
regex: | |||||
# 匹配含有字符: alert( ) | |||||
- .*[A|a][L|l][E|e][R|r][T|t](.*).* | |||||
# 匹配含有字符: window.location | |||||
- .*[W|w][I|i][N|n][D|d][O|o][W|w].[L|l][O|o][C|c][A|a][T|t][I|i][O|o][N|n].* | |||||
# 匹配含有字符:style = x:ex pression ( ) | |||||
- .*[S|s][T|t][Y|y][L|l][E|e]\\s*=.*[X|x]:[E|e][X|x].*[P|p][R|r][E|e][S|s]{1,2}[I|i][O|o][N|n]\\s*\\(.*\\).* | |||||
# 匹配含有字符: document.cookie | |||||
- .*[D|d][O|o][C|c][U|u][M|m][E|e][N|n][T|t].[C|c][O|o]{2}[K|k][I|i][E|e].* | |||||
# 匹配含有字符: eval( ) | |||||
- .*[E|e][V|v][A|a][L|l](.*).* | |||||
# 匹配含有字符: unescape() | |||||
- .*[U|u][N|n][E|e][S|s][C|c][A|a][P|p][E|e](.*).* | |||||
# 匹配含有字符: execscript( ) | |||||
- .*[E|e][X|x][E|e][C|c][S|s][C|c][R|r][I|i][P|p][T|t](.*).* | |||||
# 匹配含有字符: msgbox( ) | |||||
- .*[M|m][S|s][G|g][B|b][O|o][X|x](.*).* | |||||
# 匹配含有字符: confirm( ) | |||||
- .*[C|c][O|o][N|n][F|f][I|i][R|r][M|m](.*).* | |||||
# 匹配含有字符: prompt( ) | |||||
- .*[P|p][R|r][O|o][M|m][P|p][T|t](.*).* | |||||
# 匹配含有字符: <script> </script> | |||||
- .*<[S|s][C|c][R|r][I|i][P|p][T|t]>.*.*</[S|s][C|c][R|r][I|i][P|p][T|t]>.* | |||||
# 匹配含有字符: </script> | |||||
- .*</[S|s][C|c][R|r][I|i][P|p][T|t]>.* | |||||
# 匹配含有字符: <script> | |||||
- .*<[S|s][C|c][R|r][I|i][P|p][T|t]>.* | |||||
res: # 响应头规则 | |||||
configs: | |||||
{ | |||||
Set-Cookie: Secure; HttpOnly, | |||||
Referrer-Policy: origin-when-cross-origin, | |||||
X-Frame-Options: SAMEORIGIN, | |||||
X-XSS-Protection: 1;mode=block , | |||||
X-Download-Options: SAMEORIGIN , | |||||
X-Content-Type-Options: nosniff , | |||||
Content-Security-Policy: default-src 'self'; img-src 'self' data:; script-src 'self' 'unsafe-inline' 'unsafe-eval' http://localhost:7102 https://localhost:7102; style-src 'self' 'unsafe-inline'; connect-src 'self';font-src 'self' data:; , | |||||
Strict-Transport-Security: max-age=31536000;includeSubDomains , | |||||
X-Permitted-Cross-Domain-Policies: master-only | |||||
} |
@@ -1,111 +1,4 @@ | |||||
smtweb: | |||||
machine-id: 1 | |||||
enable-job: true | |||||
bpm: | |||||
mode: 1 | |||||
debug: true | |||||
code-java-path: 'd:/work/smtweb2/smtweb-framework/canal/file' | |||||
db: | |||||
type: kbsql | |||||
default: | |||||
rule: | |||||
prefix: _smt_ | |||||
replace: smt_ | |||||
file: | |||||
local-path: | |||||
url: | |||||
# 服务模块 | |||||
devtools: | |||||
restart: | |||||
enabled: false # 热部署开关 | |||||
additional-paths: src/main/java #重启目录 | |||||
server: | |||||
port: 8081 | |||||
servlet: | |||||
context-path: | |||||
logging: | |||||
level: | |||||
root: INFO | |||||
cc.smtweb: DEBUG | |||||
spring: | spring: | ||||
redis: | |||||
host: 127.0.0.1 | |||||
port: 6379 | |||||
password: | |||||
database: 9 | |||||
datasource: | |||||
driver-class-name: com.kingbase8.Driver | |||||
url: jdbc:kingbase8://10.176.246.198:54321/pgzx?useUnicode=true&characterEncoding=utf-8 | |||||
username: 'zhengxie' | |||||
password: '%TGB6yhn' | |||||
# url: jdbc:kingbase8://172.28.123.205:54321/HLJTY?useUnicode=true&characterEncoding=utf-8 | |||||
# username: system | |||||
# password: system | |||||
servlet: | |||||
multipart: | |||||
max-file-size: 104857600000 | |||||
max-request-size: 10485760000000 | |||||
cache: | |||||
type: caffeine | |||||
cache-names: | |||||
- core | |||||
- bpm | |||||
caffeine: | |||||
spec: maximumSize=1024,expireAfterWrite=2h | |||||
# canal配置 | |||||
canal: | |||||
file: | |||||
enable: true | |||||
path: /data/canalFile | |||||
#path: E:/canalFile | |||||
# http 规则配置 | |||||
http-config: | |||||
xss: #xss 规则 | |||||
checkHeader: false #是否进行header校验 | |||||
checkParameter: true #是否进行parameter校验 | |||||
logIs: true #是否记录日志 | |||||
chain: true #是否中断请求 | |||||
replace: true #是否开启特殊字符替换 | |||||
checkUrl: true #是否开启特殊url校验 | |||||
regex: | |||||
# 匹配含有字符: alert( ) | |||||
- .*[A|a][L|l][E|e][R|r][T|t](.*).* | |||||
# 匹配含有字符: window.location | |||||
- .*[W|w][I|i][N|n][D|d][O|o][W|w].[L|l][O|o][C|c][A|a][T|t][I|i][O|o][N|n].* | |||||
# 匹配含有字符:style = x:ex pression ( ) | |||||
- .*[S|s][T|t][Y|y][L|l][E|e]\\s*=.*[X|x]:[E|e][X|x].*[P|p][R|r][E|e][S|s]{1,2}[I|i][O|o][N|n]\\s*\\(.*\\).* | |||||
# 匹配含有字符: document.cookie | |||||
- .*[D|d][O|o][C|c][U|u][M|m][E|e][N|n][T|t].[C|c][O|o]{2}[K|k][I|i][E|e].* | |||||
# 匹配含有字符: eval( ) | |||||
- .*[E|e][V|v][A|a][L|l](.*).* | |||||
# 匹配含有字符: unescape() | |||||
- .*[U|u][N|n][E|e][S|s][C|c][A|a][P|p][E|e](.*).* | |||||
# 匹配含有字符: execscript( ) | |||||
- .*[E|e][X|x][E|e][C|c][S|s][C|c][R|r][I|i][P|p][T|t](.*).* | |||||
# 匹配含有字符: msgbox( ) | |||||
- .*[M|m][S|s][G|g][B|b][O|o][X|x](.*).* | |||||
# 匹配含有字符: confirm( ) | |||||
- .*[C|c][O|o][N|n][F|f][I|i][R|r][M|m](.*).* | |||||
# 匹配含有字符: prompt( ) | |||||
- .*[P|p][R|r][O|o][M|m][P|p][T|t](.*).* | |||||
# 匹配含有字符: <script> </script> | |||||
- .*<[S|s][C|c][R|r][I|i][P|p][T|t]>.*.*</[S|s][C|c][R|r][I|i][P|p][T|t]>.* | |||||
# 匹配含有字符: </script> | |||||
- .*</[S|s][C|c][R|r][I|i][P|p][T|t]>.* | |||||
# 匹配含有字符: <script> | |||||
- .*<[S|s][C|c][R|r][I|i][P|p][T|t]>.* | |||||
res: # 响应头规则 | |||||
configs: | |||||
{ | |||||
Set-Cookie: Secure; HttpOnly, | |||||
Referrer-Policy: origin-when-cross-origin, | |||||
X-Frame-Options: SAMEORIGIN, | |||||
X-XSS-Protection: 1;mode=block , | |||||
X-Download-Options: SAMEORIGIN , | |||||
X-Content-Type-Options: nosniff , | |||||
Content-Security-Policy: default-src 'self'; img-src 'self' data:; script-src 'self' 'unsafe-inline' 'unsafe-eval' http://localhost:7102 https://localhost:7102; style-src 'self' 'unsafe-inline'; connect-src 'self';font-src 'self' data:; , | |||||
Strict-Transport-Security: max-age=31536000;includeSubDomains , | |||||
X-Permitted-Cross-Domain-Policies: master-only | |||||
} | |||||
profiles: | |||||
active: prod | |||||
include: baseparams |