1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package org.kuali.common.util.service;
17
18 import java.io.File;
19 import java.io.IOException;
20 import java.io.PrintStream;
21 import java.util.ArrayList;
22 import java.util.List;
23
24 import org.apache.commons.io.IOUtils;
25 import org.apache.commons.lang3.StringUtils;
26 import org.kuali.common.util.Assert;
27 import org.kuali.common.util.CollectionUtils;
28 import org.kuali.common.util.FormatUtils;
29 import org.kuali.common.util.LocationUtils;
30 import org.kuali.common.util.PrintlnStreamConsumer;
31 import org.slf4j.Logger;
32 import org.slf4j.LoggerFactory;
33
34 public class DefaultMySqlDumpService extends DefaultExecService implements MySqlDumpService {
35
36 private static final Logger logger = LoggerFactory.getLogger(DefaultMySqlDumpService.class);
37
38 @Override
39 public void dump(String username, String password, String hostname, String database, File outputFile) {
40 MySqlDumpContext context = new MySqlDumpContext();
41 context.setExecutable(DEFAULT_EXECUTABLE);
42 context.setUsername(username);
43 context.setPassword(password);
44 context.setHostname(hostname);
45 context.setDatabase(database);
46 context.setOutputFile(outputFile);
47 dump(context);
48 }
49
50 @Override
51 public void dump(List<String> options, String database, File outputFile) {
52 MySqlDumpContext context = new MySqlDumpContext();
53 context.setExecutable(DEFAULT_EXECUTABLE);
54 context.setOptions(options);
55 context.setDatabase(database);
56 context.setOutputFile(outputFile);
57 dump(context);
58 }
59
60 @Override
61 public void dump(MySqlDumpContext context) {
62 Assert.notNull(context.getDatabase(), "database is null");
63 Assert.notNull(context.getOutputFile(), "output file is null");
64 Assert.notNull(context.getExecutable(), "executable is null");
65 fillInOptions(context);
66 DefaultExecContext dec = getExecContext(context);
67 beforeDump(context);
68 dump(dec, context);
69 }
70
71 protected void beforeDump(MySqlDumpContext context) {
72 String username = StringUtils.trimToEmpty(context.getUsername());
73 String hostname = StringUtils.trimToEmpty(context.getHostname());
74 int port = context.getPort();
75 String database = context.getDatabase();
76 String path = LocationUtils.getCanonicalPath(context.getOutputFile());
77 Object[] args = { username, hostname, port, database, path };
78 logger.info("Dumping [{}@{}:{}/{}] -> [{}]", args);
79 }
80
81 protected void dump(DefaultExecContext context, MySqlDumpContext msdc) {
82 PrintStream out = null;
83 try {
84 out = LocationUtils.openPrintStream(msdc.getOutputFile());
85 PrintlnStreamConsumer standardOutConsumer = new PrintlnStreamConsumer(out, msdc.getIgnorers());
86 context.setStandardOutConsumer(standardOutConsumer);
87 long start = System.currentTimeMillis();
88 int result = execute(context);
89 long elapsed = System.currentTimeMillis() - start;
90 if (result != 0) {
91 throw new IllegalStateException("Non-zero exit value - " + result);
92 }
93 afterDump(msdc, elapsed, standardOutConsumer.getLineCount(), standardOutConsumer.getSkipCount());
94 } catch (IOException e) {
95 throw new IllegalStateException("Unexpected IO error", e);
96 } finally {
97 IOUtils.closeQuietly(out);
98 }
99 }
100
101 protected void afterDump(MySqlDumpContext context, long elapsed, long lineCount, long skippedCount) {
102 long length = context.getOutputFile().length();
103 String time = FormatUtils.getTime(elapsed);
104 String size = FormatUtils.getSize(length);
105 String rate = FormatUtils.getRate(elapsed, length);
106 String lines = FormatUtils.getCount(lineCount);
107 String skipped = FormatUtils.getCount(skippedCount);
108 Object[] args = { time, size, rate, lines, skipped };
109 logger.info("Dump completed. [Time:{}, Size:{}, Rate:{}, Lines:{} Skipped:{}]", args);
110 }
111
112 protected DefaultExecContext getExecContext(MySqlDumpContext context) {
113 List<String> args = getArgs(context);
114 DefaultExecContext dec = new DefaultExecContext();
115 dec.setExecutable(context.getExecutable());
116 dec.setArgs(args);
117 return dec;
118 }
119
120
121
122
123
124
125
126
127 protected List<String> getArgs(MySqlDumpContext context) {
128 List<String> args = new ArrayList<String>();
129 args.addAll(CollectionUtils.toEmptyList(context.getOptions()));
130 args.add(context.getDatabase());
131 args.addAll(CollectionUtils.toEmptyList(context.getTables()));
132 return args;
133 }
134
135
136
137
138 protected void fillInOptions(MySqlDumpContext context) {
139
140 List<String> options = context.getOptions() == null ? new ArrayList<String>() : context.getOptions();
141
142 options.add(0, "--port=" + context.getPort());
143 if (!StringUtils.isBlank(context.getHostname())) {
144 options.add(0, "--host=" + context.getHostname());
145 }
146 if (!StringUtils.isBlank(context.getPassword())) {
147 options.add(0, "--password=" + context.getPassword());
148 }
149 if (!StringUtils.isBlank(context.getUsername())) {
150 options.add(0, "--user=" + context.getUsername());
151 }
152
153 context.setOptions(options);
154 }
155 }