⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 databasemanageaction.java

📁 论坛软件系统亦称电子公告板(BBS)系统
💻 JAVA
📖 第 1 页 / 共 4 页
字号:
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 + -