svn hooks 增加数据库数据校验
时间:2020-05-20
本文章向大家介绍svn hooks 增加数据库数据校验,主要包括svn hooks 增加数据库数据校验使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
业务需求:
小乌龟提交java文件时如果该java文件中存在StrUtil.getText("");则拿到里面的数据,使用该数据查数据库如果数据库不存在该数据则不让用户提交svn
windows系统下
1:在svn服务端中找到对应项目的hooks
2:写pre-commit.bat
@echo off set export LANG=zh_CN.UTF-8 setlocal set Repos=%1 set TXN=%2 set SCM=admin set CUR=%~dp0 rem 输出路径 预先存放数据库驱动包、conf.properties文件 set outdir=D:\hdcn\multlang_svn\out set tmpfile= for /f %%k in ('java -classpath ".;C:/Repositories/springboot/hooks" CheckString "uuid"') do set tmpfile=%%k for /f "tokens=1-2 delims= " %%i in ('svnlook changed -t "%TXN%" "%Repos%"') do ( svnlook cat -t "%TXN%" "%Repos%" "%%j" >%outdir%\%tmpfile% for /f %%y in ('java -cp ".;C:/Repositories/springboot/hooks;D:/hdcn/multlang_svn/out/ojdbc8.jar" CheckString "%%i" "%outdir%\%tmpfile%" "%%j" "%outdir%"') do ( echo file:"%%j" "no found [%%y] in t_sys_language" 1>&2 goto err ) ) del %outdir%\%tmpfile% goto right :err del %outdir%\%tmpfile% exit 1 :right exit 0
3:写java类CheckString 供bat调用
import java.io.*; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; public class CheckString { private final static String varregex = "\"(.*?)\""; private final static String javaregex = "StrUtil\\s*.\\s*getText\\s*\\(\\s*\"(.*?)\"\\s*\\)"; Properties properties = null; Connection connection = null; private String dbdriver; private String dburl; private String dbuser; private String dbpasswd; private String logfile; private String curdir; public static void main(String[] args) { CheckString svnLang = new CheckString(); if (args[0].equalsIgnoreCase("uuid")) { System.out.println(svnLang.getRandFileName()); return; } svnLang.setCurdir(args[3]); try { svnLang.loadConf(); svnLang.vaildLang(args[0], args[1], args[2]); svnLang.writeLog("success"); } catch (Exception e) { StringWriter sw = new StringWriter(); PrintWriter pw = new PrintWriter(sw); e.printStackTrace(pw); svnLang.writeLog(sw.toString()); pw.close(); } } public boolean vaildLang(String ope, String textfile, String svnfile) throws Exception { //只有新增和修改的数据才需要校验 U修改 A新增 if (!("U".equalsIgnoreCase(ope) || "A".equalsIgnoreCase(ope))) { return true; } List<String> langKey = new ArrayList<>(); String extname = getFileExt(svnfile); if ("java".equalsIgnoreCase(extname)) { String textcontext = txt2String(textfile); langKey.addAll(regularJava(textcontext)); } else { return true; } if (langKey.size() <= 0) { return true; } try { for (String key: langKey) { if (!hasLang(key)) { System.out.println(key); return false; } } } finally { closeDb(); } return true; } private void connDb() throws Exception { Class.forName(dbdriver); connection = DriverManager.getConnection(dburl, dbuser, dbpasswd); } private void closeDb() throws Exception { if (connection != null) { connection.close(); } } private boolean hasLang(String msgname) throws Exception { if (connection == null) { connDb(); } String sql = "select count(1) as cou from t_language where msgname=? "; PreparedStatement pstmt = connection.prepareStatement(sql); pstmt.setString(1, msgname); ResultSet rst = pstmt.executeQuery(); rst.next(); Long cou = rst.getLong("cou"); if (cou > 0) { return true; } return false; } private static String txt2String(String filename) throws Exception { File file = new File(filename); StringBuilder result = new StringBuilder(); InputStreamReader read = new InputStreamReader(new FileInputStream(file),"UTF-8"); BufferedReader br = new BufferedReader(read); try { String s; while ((s = br.readLine()) != null) { result.append(System.lineSeparator() + s); } } finally { br.close(); } return result.toString(); } private List<String> regularJava(String text) { return regular(text, javaregex); } private List<String> regular(String text, String regex) { List<String> rt = new ArrayList<>(); Pattern p=Pattern.compile(regex); Matcher m=p.matcher(text); while(m.find()){ String gs = m.group(); String v = getVarLang(gs); if (v != null) { rt.add(v); } } return rt; } private String getVarLang(String text) { Pattern p=Pattern.compile(varregex); Matcher m=p.matcher(text); while(m.find()){ String gs = m.group(); gs = gs.substring(1, gs.length()-1); return gs; } return null; } private String getFileExt(String filename) { String extname = filename.substring(filename.lastIndexOf(".") + 1); return extname; } public String getRandFileName() { UUID uuid = UUID.randomUUID(); return uuid.toString().replace("-", "")+".txt"; } private void loadConf() throws Exception { if (properties == null) { properties = new Properties(); properties.load(new FileInputStream(this.curdir+ System.getProperty("file.separator")+ "conf.properties")); Enumeration<?> enum1 = properties.propertyNames(); while(enum1.hasMoreElements()) { String strKey = (String) enum1.nextElement(); String strValue = properties.getProperty(strKey); if ("db_driver".equalsIgnoreCase(strKey)) { this.dbdriver = strValue; } else if ("db_url".equalsIgnoreCase(strKey)) { this.dburl = strValue; } else if ("db_username".equalsIgnoreCase(strKey)) { this.dbuser = strValue; } else if ("db_password".equalsIgnoreCase(strKey)) { this.dbpasswd = strValue; } } } } public void writeLog(String txt) { FileWriter fw = null; PrintWriter pw = null; try { File file = new File(this.logfile); fw = new FileWriter(file, true); pw = new PrintWriter(fw); pw.write(txt); pw.write("\r\n"); pw.flush(); pw.close(); } catch (Exception e) { e.printStackTrace(); } finally { if (fw != null) { try { fw.close(); } catch (Exception e) { e.printStackTrace(); } } if (pw != null) { try { pw.close(); } catch (Exception e) { e.printStackTrace(); } } } } public void setCurdir(String dir) { this.curdir = dir; this.logfile = this.curdir + System.getProperty("file.separator") + "log.log"; } }
4:将checkString编译的.class文件、pre-commit.bat 放到hooks路径底下
5:小乌龟测试提交
FAQ
bat 容易出现乱码问题
java 回写到bat中乱码问题(这边是读取文件指定编码格式)
原文地址:https://www.cnblogs.com/zhangjiangbin/p/12924742.html
- 零基础学编程012:画出复利曲线图
- OpenAI发布高度优化的GPU计算内核—块稀疏GPU内核
- SQL SERVER 原来还可以这样玩 FOR XML PATH
- 零基础学编程011:复利数据表问题(总结)
- 一个小程序引发的思考
- 深入内核:DUMP Block的数据读取与脏数据写入影响
- 零基础学编程010:最终可以输出完整的复利数据表了
- 在C#使用文件监控对象FileSystemWatcher 实现数据同步
- 零基础学编程018:条件语句
- 零基础学编程022:函数的世界
- 帝国cms如何调用指定id的文章到首页?
- C 语言 static、extern与指针函数介绍
- 2017最流行的十大Python库
- 笔记:mysql升序排列asc,降序排列desc
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Netty 异步的、事件驱动的网络应用程序框架和工具
- Consul 服务发现和配置
- Consul 启动命令,Web UI
- Thrift 跨服务开发框架
- Java并发之BlockingQueue 阻塞队列(ArrayBlockingQueue、LinkedBlockingQueue、DelayQueue、PriorityBlockingQueue、Sy
- Java并发之CountDownLatch 多功能同步工具类
- Java并发之CyclicBarrier 可重用同步工具类
- Java并发之ScheduledExecutorService(schedule、scheduleAtFixedRate、scheduleWithFixedDelay)
- Java并发之Condition 并发同步控制
- Java并发工具类Semaphore应用实例
- Java并发之死锁实例
- Java并发之ThreadPoolExecutor 线程执行服务
- Java并发之工具类 ForkJoin 任务分解
- 简单的 http 服务器
- 动态代理:cgib、jdk、java javassist