📄 databasemanageaction.java
字号:
package cn.jsprun.struts.action;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;
import java.util.zip.ZipOutputStream;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import javax.xml.parsers.DocumentBuilderFactory;
import org.apache.oro.text.regex.MalformedPatternException;
import org.apache.oro.text.regex.MatchResult;
import org.apache.oro.text.regex.Pattern;
import org.apache.oro.text.regex.PatternCompiler;
import org.apache.oro.text.regex.PatternMatcher;
import org.apache.oro.text.regex.Perl5Compiler;
import org.apache.oro.text.regex.Perl5Matcher;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.actions.DispatchAction;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import cn.jsprun.domain.Members;
import cn.jsprun.service.system.DataBaseService;
import cn.jsprun.utils.Base64Decoder;
import cn.jsprun.utils.Base64Encoder;
import cn.jsprun.utils.BeanFactory;
import cn.jsprun.utils.Cache;
import cn.jsprun.utils.Common;
import cn.jsprun.utils.Config;
import cn.jsprun.utils.DataParse;
import cn.jsprun.utils.ForumInit;
import cn.jsprun.utils.JspRunConfig;
import cn.jsprun.utils.Log;
import cn.jsprun.utils.Md5Token;
import cn.jsprun.utils.ZipUtil;
import cn.jsprun.vo.system.FieldVO;
import cn.jsprun.vo.system.TableStatusVO;
public class DataBaseManageAction extends DispatchAction {
private DataBaseService dataBaseService = (DataBaseService) BeanFactory.getBean("dataBaseService");
private DataParse dataParse=(DataParse)BeanFactory.getBean("dataParse");
public ActionForward updateForumCache(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response) {
ServletContext context=servlet.getServletContext();
ForumInit.initServletContext(context);
Cache cache=new Cache(context.getRealPath("/"),request);
String resultInfo=null;
try {
if(cache.updatecache()){
resultInfo="全部缓存更新完毕。";
}else{
resultInfo="缓存更新失败";
}
} catch (Exception e) {
resultInfo=e.getMessage();
}
request.setAttribute("resultInfo", resultInfo);
return mapping.findForward("result");
}
public ActionForward toExport(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) {
List<String> tableNames = dataBaseService.findAllTableNames("jrun_");
HttpSession session=request.getSession();
int timestamp = (Integer)(request.getAttribute("timestamp"));
float timeoffset=(Float)session.getAttribute("timeoffset");
request.setAttribute("tableNames", tableNames);
request.setAttribute("randName", Common.gmdate("yyMMdd", timestamp, String.valueOf(timeoffset)) + "_" + Common.getRandStr(8, false));
return mapping.findForward("toExport");
}
@SuppressWarnings("unchecked")
public ActionForward exportData(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response) {
String exportsubmit=request.getParameter("exportsubmit");
if(exportsubmit==null){
return toExport(mapping, form, request, response);
}
String filename = request.getParameter("filename");
if (filename.equals("")||filename.matches(".*\\.(exe|jsp|asp|aspx|cgi|fcgi|pl)$")) {
request .setAttribute("errorInfo", "您没有输入备份文件名或文件名中使用了敏感的扩展名,请返回修改。");
return mapping.findForward("error");
}
filename.replaceAll("[/|\\\\|\\.]", "");
List<String> tableNames = new ArrayList<String>();
String type = request.getParameter("type");
if ("jsprun".equals(type)) {
tableNames = dataBaseService.findAllTableNames("jrun_");
}else if ("custom".equals(type)) {
String setup = request.getParameter("setup");
if (setup == null || !"1".equals(setup)) {
Map<String,String> setting=dataBaseService.executeQuery("SELECT value FROM jrun_settings WHERE variable='custombackup'").get(0);
Map<Integer, String> map = dataParse.characterParse(setting.get("value"), false);
if (map != null && map.size() > 0) {
Set<Integer> keys = map.keySet();
for (Integer key : keys) {
tableNames.add(map.get(key));
}
}
} else {
String[] customtables = request.getParameterValues("customtables");
String customtablesnew =null;
if (customtables != null) {
Map<Integer, String> map = new HashMap<Integer, String>(customtables.length);
int length=customtables.length;
for (int i = 0; i < length; i++) {
map.put(i, customtables[i]);
tableNames.add(customtables[i]);
}
customtablesnew =dataParse.combinationChar(map);
}else{
customtablesnew="";
}
dataBaseService.runQuery("REPLACE INTO jrun_settings (variable, value) VALUES ('custombackup', '"+customtablesnew+"')",true);
}
}
if (tableNames.size() <= 0) {
request.setAttribute("errorInfo", "您至少需要选择一个数据表进行备份,请返回修改。");
return mapping.findForward("error");
}
String method = request.getParameter("method");
long sizelimit = Common.toDigit(request.getParameter("sizelimit"));
int extendins = Common.toDigit(request.getParameter("extendins"));
String sqlcompat = request.getParameter("sqlcompat");
String sqlcharset = request.getParameter("sqlcharset");
String usehex = request.getParameter("usehex");
int volume = request.getParameter("volume") != null ? Common.toDigit(request.getParameter("volume"), 10000L, 1L).intValue() : 1;
int tableid = Common.toDigit(request.getParameter("tableid"));
int startfrom = Common.toDigit(request.getParameter("startfrom"));
String realPath = servlet.getServletContext().getRealPath("/");
Config config = new Config(realPath + "/config.properties");
String version=config.getValue("version");
int timestamp = (Integer)(request.getAttribute("timestamp"));
String encoded = timestamp + "," + JspRunConfig.version + "," + type + ","+ method + "," + volume;
String idstring = "# Identify: "+ Base64Encoder.encode(encoded, JspRunConfig.charset) + "\n";
String dumpcharset = !sqlcharset.equals("") ? sqlcharset : JspRunConfig.charset.replaceAll("-", "");
String setnames = (!sqlcharset.equals("")&& version.compareTo("4.1") > 0 && (!sqlcompat.equals("") || sqlcompat.equals("MYSQL41"))) ? "SET NAMES '" + dumpcharset + "';\n\n": "";
if (version.compareTo("4.1") > 0) {
if (!sqlcharset.equals("")) {
dataBaseService.runQuery("SET NAMES '" + sqlcharset + "';\n\n",true);
}
if (sqlcompat.equals("MYSQL40")) {
dataBaseService.runQuery("SET SQL_MODE='MYSQL40'",true);
} else if (sqlcompat.equals("MYSQL41")) {
dataBaseService.runQuery("SET SQL_MODE=''",true);
}
}
Map<String,String> settings=this.getValues("'backupdir'");
String backupdir = this.createBackupdir(realPath,settings.get("backupdir"));
String backupfilename = backupdir + "/" + filename;
if (method.equals("multivol")) {
List<String> excepttables = new ArrayList<String>();
excepttables.add("jrun_adminsessions");
excepttables.add("jrun_failedlogins");
excepttables.add("jrun_pmsearchindex");
excepttables.add("jrun_relatedthreads");
excepttables.add("jrun_rsscaches");
excepttables.add("jrun_searchindex");
excepttables.add("jrun_spacecaches");
excepttables.add("jrun_sessions");
StringBuffer sqldump = new StringBuffer();
boolean complete = true;
for (; complete && tableid < tableNames.size()&& sqldump.length() + 500 < sizelimit * 1000; tableid++) {
Map map = dataBaseService.sqldumptable(excepttables, tableNames.get(tableid), startfrom, sqldump.length()+500,sizelimit*1000, complete, version, extendins, sqlcompat,dumpcharset, sqlcharset, usehex.equals("1") ? true: false);
sqldump.append((StringBuffer)map.get("tabledump"));
if (map.get("startfrom") != null) {
startfrom = Common.toDigit(map.get("startfrom").toString());
}
if (map.get("complete") != null) {
complete = (Boolean)map.get("complete");
}
if (complete) {
startfrom = 0;
}
}
if (!complete) {
tableid--;
}
HttpSession session=request.getSession();
int timeoffset=(int)((Float)session.getAttribute("timeoffset")*3600);
String timeformat=(String)session.getAttribute("timeformat");
String dateformat=(String)session.getAttribute("dateformat");
String time = Common.gmdate(dateformat+" "+timeformat, timestamp+timeoffset);
String dumpfileName = backupfilename + "-" + volume + ".sql";
long usezip = Common.toDigit(request.getParameter("usezip"), 2l, 0l);
if (sqldump.length()>0) {
sqldump.insert(0,idstring+ "# <?exit();?>\n"+ "# JspRun! Multi-Volume Data Dump Vol."+ volume+ "\n"+ "# Version: JspRun! "+ JspRunConfig.version+ "\n"+ "# Time: "+ time+ "\n"+ "# Type: "+ type+ "\n"+ "# Table Prefix: jrun_\n"+ "# \n"+ "# JspRun! Home: http://www.JspRun.com\n"+ "# Please visit our website for newest infomation about JspRun!\n"+ "# --------------------------------------------------------\n\n\n"+ setnames);
File dumpfile = new File(realPath + dumpfileName);
if (!dumpfile.exists()) {
try {
dumpfile.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
}
FileOutputStream fos=null;
OutputStreamWriter osw=null;
BufferedWriter bw = null;
try {
fos=new FileOutputStream(dumpfile);
osw=new OutputStreamWriter(fos,JspRunConfig.charset);
bw = new BufferedWriter(osw);
bw.write(sqldump.toString());
bw.flush();
osw.flush();
fos.flush();
} catch (IOException e) {
e.printStackTrace();
}finally{
try {
bw.close();
osw.close();
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (usezip==2) {
try {
dumpfileName = backupfilename + "-" + volume + ".zip";
FileOutputStream zfos = new FileOutputStream(realPath+ dumpfileName);
ZipOutputStream zos = new ZipOutputStream(zfos);
ZipUtil.zipFile(dumpfile, zos);
zos.close();
fos.close();
dumpfile.delete();
} catch (Exception e) {
e.printStackTrace();
}
}
dumpfile=null;
request.setAttribute("successInfo", "分卷备份: 数据文件 #" + volume+ " 成功创建,程序将自动继续。");
request.setAttribute("requestPath", request.getContextPath()+ "/database.do?action=exportData&exportsubmit=yes&type=" + type+ "&saveto=server&filename=" + filename+ "&method=" + method + "&sizelimit="+ sizelimit + "&volume=" + (++volume)+ "&tableid=" + tableid + "&startfrom="+ startfrom + "&extendins=" + extendins+ "&sqlcharset=" + sqlcharset + "&sqlcompat="+ sqlcompat + "&usehex=" + usehex + "&usezip="+ usezip);
return mapping.findForward("success");
} else {
volume--;
if (usezip==1) {
try {
String zipfilename = backupfilename + ".zip";
FileOutputStream fos = new FileOutputStream(realPath+ zipfilename);
ZipOutputStream zos = new ZipOutputStream(fos);
for (int i = 1; i <= volume; i++) {
File dumpfile = new File(realPath + backupfilename+ "-" + i + ".sql");
ZipUtil.zipFile(dumpfile, zos);
dumpfile.delete();
}
zos.close();
fos.close();
String resultInfo = "数据成功备份并压缩至服务器 <a href=\""+ request.getContextPath()+ zipfilename.replaceFirst("\\.", "") + "\">"+ zipfilename + "</a> 中。";
request.setAttribute("resultInfo", resultInfo);
return mapping.findForward("result");
} catch (Exception e) {
e.printStackTrace();
}
} else {
String resultInfo = "恭喜您,全部 " + volume+ " 个备份文件成功创建,备份完成。<br/>";
for (int i = 1; i <= volume; i++) {
dumpfileName = backupfilename + "-" + i+ (usezip==2 ? ".zip" : ".sql");
resultInfo += "<li><a href=\""+ request.getContextPath()+ dumpfileName.replaceFirst("\\.", "") + "\">"+ dumpfileName + "\n";
}
request.setAttribute("resultInfo", resultInfo);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -