package com.ncs.opts.face.system.action;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.LineNumberReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.InterceptorRef;
import org.apache.struts2.convention.annotation.InterceptorRefs;
import org.apache.struts2.convention.annotation.Namespace;
import org.apache.struts2.convention.annotation.ParentPackage;
import org.apache.struts2.convention.annotation.Result;
import org.apache.struts2.convention.annotation.Results;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import com.ncs.opts.face.common.BasicAction;
/**
*
* 属性文件jdbc.properties内容如下
*
* Jdbc.username = icpside
*
* Jdbc.password = icpside
*
* mysqlpath = C:\\Program Files\\MySQL\\MySQL Server 5.1\\bin\\ MYSQL 安装路径
*
* sqlpath = D:\\mysqlback\\ 备份路径
*
* sqlName = 要备份的文件名称 例如:beifen.sql
*
* @author MH
*
*/
@Namespace("/sys")
@ParentPackage("opts-default")
@InterceptorRefs( { @InterceptorRef("annotationInterceptor"),
@InterceptorRef("defaultStack") })
@Results( {
@Result(name = "bakDatabaseSuccess", location = "/sys/databasemanager.jsp"),
@Result(name = "bakDatabaseError", location = "/sys/databasemanager.jsp"),
@Result(name = "loadSuccess", location = "/sys/databasemanager.jsp"),
@Result(name = "loadError", location = "/sys/databasemanager.jsp"),
@Result(name = "OK", location = "/sys/mapview.jsp"),
})
public class DataBaseManagerAction extends BasicAction {
private List list;
private Map map;
public List getList() {
return list;
}
public void setList(List list) {
this.list = list;
}
public Map getMap() {
return map;
}
public void setMap(Map map) {
this.map = map;
}
private InputStream configFile;
private Properties props;
public String getProperty(String property) {
return props.getProperty(property);
}
public void loadConfig() throws IOException {
// 当前类文件目录下的文件
configFile = getClass().getResourceAsStream("/jdbc.properties");
props = new Properties();
props.load(configFile);
}
/**
* 数据备份
*
* @return
*/
@Action("bakDatabase")
public String bakDatabase() {
String backup = backup();
if (backup.equals("0")) {
this.addActionMessage("数据库备份成功!");
return "bakDatabaseSuccess";
} else {
this.addActionError("数据库备份失败,请检查配置文件是否配置有误!");
return "bakDatabaseError";
}
}
/**
* 还原数据
*
* @return
*/
@Action("recoverDatabase")
public String recoverDatabase() {
String load = load();
if (load.equals("0")) {
this.addActionMessage("数据库还原成功!");
return "loadSuccess";
} else {
this.addActionError("数据库还原失败,请检查配置文件是否配置有误!");
return "loadError";
}
}
/**
* mysql数据备份 接收脚本名,并返回此路径 sqlName为备份的脚本名比如xxx.sql 并返回结果 0为成功1为失败
*/
public static String backup() {
// 这里是读取的属性文件,也可以直接使用
String sqlName = getPprVue("data.name");
String root = getPprVue("jdbc.username");
String pass = getPprVue("jdbc.password");
String mysqlpaths = getPprVue("mysqlpath");
String sqlpath = getPprVue("sqlpath");
File backupath = new File(sqlpath);
if (!backupath.exists()) {
backupath.mkdir();
}
String command = mysqlpaths;// mysql的bin路径
command += "mysqldump ";
command += "--opt ";
// command+="--complete-insert ";
command += "-h localhost ";
command += "--user=" + root + " ";
command += "--password=" + pass + " ";
command += "--lock-all-tables=true ";
command += "--result-file=" + sqlpath + sqlName + " ";
command += "icpdb ";// 数据库名称
// command+="> D:/mysqlback/uuu.sql ";
// 得到MYSQL的用户名密码后调用 mysql 的 cmd:
try {
Process p = Runtime.getRuntime().exec(command);
System.out.println(command);
// 设置输出流编码为utf8。为了防止乱码
InputStreamReader ir = new InputStreamReader(p.getInputStream(),
"utf8");
LineNumberReader input = new LineNumberReader(ir);
String line;
while ((line = input.readLine()) != null)
System.out.println(line);
input.close();
System.out.println("/* 数据库备份成功! */");
return "0";
// 0代表成功,1代表失败
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return "1";
}
/**
* mysql数据恢复 接收脚本路径,并返回结果 0为成功1为失败
*/
public static String load() {
try {
Runtime rt = Runtime.getRuntime();
String sqlpath = getPprVue("sqlpath");
String sqlName = getPprVue("data.name");
String root = getPprVue("jdbc.username");
String pass = getPprVue("jdbc.password");
// 得到MYSQL的用户名密码后调用 mysql 的 cmd:
Process child = rt.exec(getPprVue("mysqlpath") + "mysql -u "
+ root + " -p" + pass + " icpdb");
OutputStream out = child.getOutputStream();// 控制台的输入信息作为输出流
String inStr;
StringBuffer sb = new StringBuffer("");
String outStr;
BufferedReader br = new BufferedReader(new InputStreamReader(
new FileInputStream(sqlpath + sqlName), "utf8"));
while ((inStr = br.readLine()) != null) {
sb.append(inStr + "\r\n");
}
outStr = sb.toString();
OutputStreamWriter writer = new OutputStreamWriter(out, "utf8");
writer.write(outStr);
// 注:这里如果用缓冲方式写入文件的话,会导致中文乱码,用flush()方法则可以避免
writer.flush();
// 别忘记关闭输入输出流
out.close();
br.close();
writer.close();
System.out.println("/* 数据库还原成功! */");
return "0";
// 0代表成功,1代表失败
} catch (Exception e) {
e.printStackTrace();
}
return "1";
}
// 读取属性值
public static String getPprVue(String properName) {
String properValue = null;
try {
DataBaseManagerAction pro = new DataBaseManagerAction();
pro.loadConfig();
// 读取对应的KEY
properValue = pro.getProperty(properName);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return properValue;
}
// public static void main(String[] args) throws IOException {
// String backup = backup();
// System.out.println(backup);
// String load = load();
// System.out.println(load);
// }
@Action("getMAP")
public String getMAP() {
if (null != list && list.size() > 0) {
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
}
if (null != map && map.size() > 0) {
System.out.println(map.get("name"));
System.out.println(map.get("pass"));
}
return "OK";
}
public static void main(String[] args) {
String command = "G:\\MySQL Server 5.1\\bin mysqldump --opt -h localhost --user=root --password=icpside --lock-all-tables=true --result-file=D:\\mysqlback\\backNm.sql icpdb";
try {
Process p = Runtime.getRuntime().exec(command);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}