Skip to content

Commit 690d7f0

Browse files
committed
Added formatters to output: text, html and csv
1 parent b1786c4 commit 690d7f0

File tree

10 files changed

+272
-35
lines changed

10 files changed

+272
-35
lines changed

README.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ Usage:
1010
FROM MY_TABLE
1111
EOF
1212

13+
If _mailSendTo_ configured the tool sends an email with formatted output.
14+
1315
## Config values:
1416

1517
* jdbcDriverPath=Path to jdbc driver jar (loaded dynamically) if null it must be in classpath
@@ -19,8 +21,11 @@ Usage:
1921
* jdbcPass=
2022
* inputSQL=Path to input sql file (not required/optional if not present it uses stdin)
2123
* outputResult=Path to output file (if not present uses stdout)
24+
25+
## Printing and formatting values:
2226
* printHeader=true/false If true adds header with query's column name. Default true
2327
* printFieldSeparator=Field separator for printing. Default tab (\t)
28+
* formatterName=Formatter type, possible values: text, html or csv (default text)
2429

2530
## Mail config values:
2631

pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
<groupId>io.github.jdlopez</groupId>
88
<artifactId>sqlcmd</artifactId>
9-
<version>1.1</version>
9+
<version>1.1.1</version>
1010

1111
<dependencies>
1212
<dependency>
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
package es.jdlopez.sqlcmd;
2+
3+
import java.io.PrintWriter;
4+
import java.sql.ResultSet;
5+
import java.sql.ResultSetMetaData;
6+
import java.sql.SQLException;
7+
8+
public class CsvFormatter extends ResultFormatter {
9+
private RunnerConfig conf;
10+
11+
public CsvFormatter(RunnerConfig c) {
12+
this.conf = c;
13+
}
14+
15+
@Override
16+
public void writeHeader(PrintWriter out, ResultSetMetaData rsmd) throws SQLException {
17+
int colCount = rsmd.getColumnCount();
18+
if (conf.getPrintHeader()) {
19+
for (int i = 1; i <= colCount; i++) {
20+
out.print(rsmd.getColumnName(i));
21+
if (i < colCount) {
22+
out.print(conf.getPrintFieldSeparator());
23+
}
24+
}
25+
out.println();
26+
} // header
27+
28+
}
29+
30+
@Override
31+
public void writeRow(PrintWriter out, ResultSet resultSet, int colCount) throws SQLException {
32+
for (int i = 1; i <= colCount; i++) {
33+
out.print(resultSet.getString(i));
34+
if (i < colCount)
35+
out.print(conf.getPrintFieldSeparator());
36+
} // for col
37+
out.println();
38+
}
39+
40+
@Override
41+
public void writeEndResultSet(PrintWriter out) {
42+
// nothing needed
43+
}
44+
45+
@Override
46+
public void writeBeginResultSet(PrintWriter out) {
47+
// nothing needed
48+
}
49+
50+
@Override
51+
public void writeUpdate(PrintWriter out, int updateCount) {
52+
out.println(updateCount);
53+
}
54+
55+
@Override
56+
public String getMime() {
57+
return "text/csv";
58+
}
59+
}
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
package es.jdlopez.sqlcmd;
2+
3+
import java.io.PrintWriter;
4+
import java.sql.ResultSet;
5+
import java.sql.ResultSetMetaData;
6+
import java.sql.SQLException;
7+
8+
// TODO: put all html code in configurable templates
9+
public class HtmlFormatter extends ResultFormatter {
10+
private RunnerConfig conf;
11+
12+
public HtmlFormatter(RunnerConfig c) {
13+
this.conf = c;
14+
}
15+
16+
@Override
17+
public void writeHeader(PrintWriter out, ResultSetMetaData rsmd) throws SQLException {
18+
if (conf.getPrintHeader()) { // this check must be on MainRunner :-(
19+
int colCount = rsmd.getColumnCount();
20+
// add thead tag???
21+
out.println("<tr>");
22+
for (int i = 1; i <= colCount; i++) {
23+
out.print(String.format("<th>%s</th>", rsmd.getColumnName(i)));
24+
}
25+
out.println("</tr>");
26+
} // header
27+
}
28+
29+
@Override
30+
public void writeRow(PrintWriter out, ResultSet resultSet, int colCount) throws SQLException {
31+
out.println("<tr>");
32+
for (int i = 1; i <= colCount; i++) {
33+
out.print(String.format("<td>%s</td>", resultSet.getString(i)));
34+
} // for col
35+
out.println("</tr>");
36+
}
37+
38+
@Override
39+
public void writeBeginResultSet(PrintWriter out) {
40+
out.println("<table>");
41+
}
42+
43+
@Override
44+
public void writeEndResultSet(PrintWriter out) {
45+
out.println("</table>");
46+
}
47+
48+
@Override
49+
public void writeUpdate(PrintWriter out, int updateCount) {
50+
out.println(String.format("<hr/>UpdateCount: %d<hr/>", updateCount));
51+
}
52+
53+
@Override
54+
public String getMime() {
55+
return "text/html";
56+
}
57+
}

src/main/java/es/jdlopez/sqlcmd/MainRunner.java

Lines changed: 14 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010
import java.io.PrintWriter;
1111
import java.io.StringWriter;
1212
import java.sql.Connection;
13-
import java.sql.Driver;
1413
import java.sql.DriverManager;
1514
import java.sql.ResultSet;
1615
import java.sql.ResultSetMetaData;
@@ -81,7 +80,11 @@ else if (config.getOutputResult() == null)
8180
config.getMailPort(),
8281
config.getMailFrom());
8382
}
84-
sendMail.sendText(config.getMailSubject(), mailBody.toString(), config.getMailSendTo());
83+
if (ResultFormatter.HTML.equalsIgnoreCase(config.getFormatterName()))
84+
sendMail.sendMime(config.buildFormatter().getMime(),
85+
config.getMailSubject(), mailBody.toString(), config.getMailSendTo());
86+
else // careful 'no object DCH for MIME type csv or others needs activation
87+
sendMail.sendText(config.getMailSubject(), mailBody.toString(), config.getMailSendTo());
8588
}
8689

8790
} finally {
@@ -91,44 +94,21 @@ else if (config.getOutputResult() == null)
9194
}
9295

9396
private static void writeUpdateCount(int updateCount, PrintWriter out, RunnerConfig config) {
94-
String s;
95-
if (config.getPrintHeader())
96-
s = String.format("==================\nUpdateCount = %d\n==================", updateCount);
97-
else
98-
s = "UpdateCount = " + updateCount;
99-
out.println(s);
100-
97+
ResultFormatter fmt = config.buildFormatter();
98+
fmt.writeUpdate(out, updateCount);
10199
}
102100

103101
private static void writeResultSet(ResultSet resultSet, PrintWriter out, RunnerConfig conf) throws SQLException {
104102
ResultSetMetaData rsmd = resultSet.getMetaData();
105103
int colCount = rsmd.getColumnCount();
106-
if (conf.getPrintHeader()) {
107-
StringBuffer underline = new StringBuffer();
108-
for (int i = 1; i <= colCount; i++) {
109-
out.print(rsmd.getColumnName(i));
110-
underline.append(repeatChar('=', rsmd.getColumnName(i).length()));
111-
if (i < colCount) {
112-
out.print(conf.getPrintFieldSeparator());
113-
underline.append(conf.getPrintFieldSeparator());
114-
}
115-
}
116-
out.println();
117-
out.println(underline.toString());
118-
} // header
104+
ResultFormatter fmt = conf.buildFormatter();
105+
fmt.writeBeginResultSet(out);
106+
fmt.writeHeader(out, rsmd);
119107
while (resultSet.next()) {
120-
for (int i = 1; i <= colCount; i++) {
121-
out.print(resultSet.getString(i));
122-
if (i < colCount)
123-
out.print(conf.getPrintFieldSeparator());
124-
} // for col
125-
out.println();
108+
fmt.writeRow(out, resultSet, colCount);
126109
} // while row
127110
out.flush();
128-
}
129-
130-
private static String repeatChar(char c, int length) {
131-
return new String(new char[length]).replace('\0', c);
111+
fmt.writeEndResultSet(out);
132112
}
133113

134114
private static String readAll(InputStream in) throws IOException {
@@ -169,6 +149,8 @@ private static RunnerConfig readArgs(String[] args) throws ConfigException {
169149
conf.setPrintFieldSeparator("\t");
170150
if (conf.getPrintHeader() == null)
171151
conf.setPrintHeader(true);
152+
if (conf.getFormatterName() == null)
153+
conf.setFormatterName("text");
172154
return conf;
173155
}
174156
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package es.jdlopez.sqlcmd;
2+
3+
import java.io.PrintWriter;
4+
import java.sql.ResultSet;
5+
import java.sql.ResultSetMetaData;
6+
import java.sql.SQLException;
7+
8+
public abstract class ResultFormatter {
9+
10+
public static final String TEXT = "text";
11+
public static final String HTML = "html";
12+
public static final String CSV = "csv";
13+
14+
public abstract void writeHeader(PrintWriter out, ResultSetMetaData rsmd) throws SQLException;
15+
16+
public abstract void writeRow(PrintWriter out, ResultSet resultSet, int colCount) throws SQLException;
17+
18+
public abstract void writeEndResultSet(PrintWriter out);
19+
20+
public abstract void writeUpdate(PrintWriter out, int updateCount);
21+
22+
public abstract void writeBeginResultSet(PrintWriter out);
23+
24+
public abstract String getMime();
25+
26+
public static String repeatChar(char c, int length) {
27+
return new String(new char[length]).replace('\0', c);
28+
}
29+
30+
}

src/main/java/es/jdlopez/sqlcmd/RunnerConfig.java

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,21 @@ public class RunnerConfig {
2020
private String mailPass;
2121
private String mailFrom;
2222
private String mailSubject;
23+
private String formatterName;
24+
25+
private ResultFormatter formatter = null;
26+
public ResultFormatter buildFormatter() {
27+
if (formatter == null) {
28+
if (ResultFormatter.HTML.equalsIgnoreCase(formatterName))
29+
formatter = new HtmlFormatter(this);
30+
else if (ResultFormatter.CSV.equalsIgnoreCase(formatterName))
31+
formatter = new CsvFormatter(this);
32+
//if (ResultFormatter.TEXT.equalsIgnoreCase(formatterName))
33+
else
34+
formatter = new TextFormatter(this);
35+
}
36+
return formatter;
37+
}
2338

2439
public String getInputSQL() {
2540
return inputSQL;
@@ -164,4 +179,12 @@ public String getMailSubject() {
164179
public void setMailSubject(String mailSubject) {
165180
this.mailSubject = mailSubject;
166181
}
182+
183+
public String getFormatterName() {
184+
return formatterName;
185+
}
186+
187+
public void setFormatterName(String formatterName) {
188+
this.formatterName = formatterName;
189+
}
167190
}

src/main/java/es/jdlopez/sqlcmd/SendMail.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,4 +56,14 @@ public void sendText(String subject, String body, String to) throws MessagingExc
5656

5757
Transport.send(msg);
5858
}
59+
60+
public void sendMime(String mime, String subject, String body, String to) throws MessagingException {
61+
Session session = Session.getInstance(sessionProps, auth);
62+
Message msg = new MimeMessage(session);
63+
msg.setFrom(new InternetAddress(from));
64+
msg.setRecipients(Message.RecipientType.TO, InternetAddress.parse(to, false));
65+
msg.setSubject(subject);
66+
msg.setContent(body, mime);
67+
Transport.send(msg);
68+
}
5969
}
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
package es.jdlopez.sqlcmd;
2+
3+
import java.io.PrintWriter;
4+
import java.sql.ResultSet;
5+
import java.sql.ResultSetMetaData;
6+
import java.sql.SQLException;
7+
8+
public class TextFormatter extends ResultFormatter {
9+
private RunnerConfig conf;
10+
11+
public TextFormatter(RunnerConfig c) {
12+
this.conf = c;
13+
}
14+
15+
@Override
16+
public void writeHeader(PrintWriter out, ResultSetMetaData rsmd) throws SQLException {
17+
int colCount = rsmd.getColumnCount();
18+
if (conf.getPrintHeader()) {
19+
StringBuffer underline = new StringBuffer();
20+
for (int i = 1; i <= colCount; i++) {
21+
out.print(rsmd.getColumnName(i));
22+
underline.append(repeatChar('=', rsmd.getColumnName(i).length()));
23+
if (i < colCount) {
24+
out.print(conf.getPrintFieldSeparator());
25+
underline.append(conf.getPrintFieldSeparator());
26+
}
27+
}
28+
out.println();
29+
out.println(underline.toString());
30+
} // header
31+
32+
}
33+
34+
@Override
35+
public void writeRow(PrintWriter out, ResultSet resultSet, int colCount) throws SQLException {
36+
for (int i = 1; i <= colCount; i++) {
37+
out.print(resultSet.getString(i));
38+
if (i < colCount)
39+
out.print(conf.getPrintFieldSeparator());
40+
} // for col
41+
out.println();
42+
}
43+
44+
@Override
45+
public void writeEndResultSet(PrintWriter out) {
46+
// nothing needed
47+
}
48+
49+
@Override
50+
public void writeBeginResultSet(PrintWriter out) {
51+
// nothing needed
52+
}
53+
54+
@Override
55+
public void writeUpdate(PrintWriter out, int updateCount) {
56+
String s;
57+
if (conf.getPrintHeader())
58+
s = String.format("==================\nUpdateCount = %d\n==================", updateCount);
59+
else
60+
s = "UpdateCount = " + updateCount;
61+
out.println(s);
62+
}
63+
64+
@Override
65+
public String getMime() {
66+
return "text/plain";
67+
}
68+
}

src/test/resources/sample.properties

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,11 @@ jdbcUser=SA
66
jdbcPass=
77

88
# mail config
9-
mailFrom=noreply@example.com
10-
mailSubject=SqlCmd subject sent
119
mailSendTo=nobody@example.com
10+
mailSubject=SqlCmd subject sent
11+
# mail server
12+
mailFrom=noreply@example.com
1213
mailHost=localhost
1314
mailPort=25
15+
16+
formatterName=html

0 commit comments

Comments
 (0)