h2tocsv.sh
· 3.3 KiB · Bash
Raw
///usr/bin/env jbang "$0" "$@" ; exit $?
//
// This is a JBang script. You need JBang to run this script.
//
// To learn more go to https://www.jbang.dev and install JBang.
//
// Run this script:
// ./h2tocsv.sh -d <database.mv.db> -t <table> [-f <output file>] [-u db user] [-p db password]
//
//DEPS info.picocli:picocli:4.5.0 com.h2database:h2:1.4.197
import static java.util.Optional.ofNullable;
import java.io.File;
import java.nio.charset.StandardCharsets;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.concurrent.Callable;
import org.h2.Driver;
import org.h2.tools.Csv;
import org.h2.util.JdbcUtils;
import picocli.CommandLine;
import picocli.CommandLine.Command;
import picocli.CommandLine.Option;
/**
* Converts a table in a H2 database file to CSV
*
* @author John Ahlroos / Devsoap 2021
*/
@Command(name = "h2tocsv", mixinStandardHelpOptions = true, version = "0.1", description = "H2 database to CSV converter")
class h2tocsv implements Callable<Integer> {
@Option(names = { "--database", "-d" }, required = true, description = "H2 database to import")
private File database;
@Option(names = { "--table", "-t" }, required = true, description = "The database table to export")
private String table;
@Option(names = { "--user", "-u" }, defaultValue = "sa", description = "Database user name")
private String user;
@Option(names = { "--password", "-p" }, defaultValue = "", description = "Database password")
private String password;
@Option(names = { "--file", "-f" }, description = "CSV file path to output")
private String csvFile;
public static void main(final String... args) {
Driver.load();
final int exitCode = new CommandLine(new h2tocsv()).execute(args);
System.exit(exitCode);
}
@Override
public Integer call() throws Exception {
csvFile = ofNullable(csvFile).orElse(
String.format("%s-%s.csv", database.getName().substring(0, database.getName().indexOf(".")), table));
if (!database.exists()) {
System.err.println("Database file " + database.getCanonicalPath() + " does not exist!");
return -1;
}
final String path = database.getCanonicalPath().replace(".mv.db", "");
final String url = "jdbc:h2:file:" + path + ";DB_CLOSE_DELAY=-1";
Connection conn = null;
try {
conn = DriverManager.getConnection(url, user, password);
try (Statement statement = conn.createStatement()) {
final String sql = String.format("select * from %s", table);
System.out.println(String.format("Exporting table %s...", table));
final ResultSet result = statement.executeQuery(sql);
System.out.println("Writing database table to file...");
new Csv().write(csvFile, result, StandardCharsets.UTF_8.toString());
}
} catch (SQLException e) {
System.err.println("Failed to read database, error message was: " + e.getMessage());
return e.getErrorCode();
} finally {
ofNullable(conn).ifPresent(JdbcUtils::closeSilently);
}
System.out.println("Done. CSV file exported to " + csvFile);
return 0;
}
}
1 | ///usr/bin/env jbang "$0" "$@" ; exit $? |
2 | // |
3 | // This is a JBang script. You need JBang to run this script. |
4 | // |
5 | // To learn more go to https://www.jbang.dev and install JBang. |
6 | // |
7 | // Run this script: |
8 | // ./h2tocsv.sh -d <database.mv.db> -t <table> [-f <output file>] [-u db user] [-p db password] |
9 | // |
10 | //DEPS info.picocli:picocli:4.5.0 com.h2database:h2:1.4.197 |
11 | |
12 | import static java.util.Optional.ofNullable; |
13 | |
14 | import java.io.File; |
15 | import java.nio.charset.StandardCharsets; |
16 | import java.sql.Connection; |
17 | import java.sql.DriverManager; |
18 | import java.sql.ResultSet; |
19 | import java.sql.SQLException; |
20 | import java.sql.Statement; |
21 | import java.util.concurrent.Callable; |
22 | |
23 | import org.h2.Driver; |
24 | import org.h2.tools.Csv; |
25 | import org.h2.util.JdbcUtils; |
26 | |
27 | import picocli.CommandLine; |
28 | import picocli.CommandLine.Command; |
29 | import picocli.CommandLine.Option; |
30 | |
31 | /** |
32 | * Converts a table in a H2 database file to CSV |
33 | * |
34 | * @author John Ahlroos / Devsoap 2021 |
35 | */ |
36 | @Command(name = "h2tocsv", mixinStandardHelpOptions = true, version = "0.1", description = "H2 database to CSV converter") |
37 | class h2tocsv implements Callable<Integer> { |
38 | |
39 | @Option(names = { "--database", "-d" }, required = true, description = "H2 database to import") |
40 | private File database; |
41 | |
42 | @Option(names = { "--table", "-t" }, required = true, description = "The database table to export") |
43 | private String table; |
44 | |
45 | @Option(names = { "--user", "-u" }, defaultValue = "sa", description = "Database user name") |
46 | private String user; |
47 | |
48 | @Option(names = { "--password", "-p" }, defaultValue = "", description = "Database password") |
49 | private String password; |
50 | |
51 | @Option(names = { "--file", "-f" }, description = "CSV file path to output") |
52 | private String csvFile; |
53 | |
54 | public static void main(final String... args) { |
55 | Driver.load(); |
56 | final int exitCode = new CommandLine(new h2tocsv()).execute(args); |
57 | System.exit(exitCode); |
58 | } |
59 | |
60 | @Override |
61 | public Integer call() throws Exception { |
62 | csvFile = ofNullable(csvFile).orElse( |
63 | String.format("%s-%s.csv", database.getName().substring(0, database.getName().indexOf(".")), table)); |
64 | |
65 | if (!database.exists()) { |
66 | System.err.println("Database file " + database.getCanonicalPath() + " does not exist!"); |
67 | return -1; |
68 | } |
69 | |
70 | final String path = database.getCanonicalPath().replace(".mv.db", ""); |
71 | final String url = "jdbc:h2:file:" + path + ";DB_CLOSE_DELAY=-1"; |
72 | Connection conn = null; |
73 | try { |
74 | conn = DriverManager.getConnection(url, user, password); |
75 | try (Statement statement = conn.createStatement()) { |
76 | final String sql = String.format("select * from %s", table); |
77 | |
78 | System.out.println(String.format("Exporting table %s...", table)); |
79 | final ResultSet result = statement.executeQuery(sql); |
80 | |
81 | System.out.println("Writing database table to file..."); |
82 | new Csv().write(csvFile, result, StandardCharsets.UTF_8.toString()); |
83 | } |
84 | } catch (SQLException e) { |
85 | System.err.println("Failed to read database, error message was: " + e.getMessage()); |
86 | return e.getErrorCode(); |
87 | } finally { |
88 | ofNullable(conn).ifPresent(JdbcUtils::closeSilently); |
89 | } |
90 | |
91 | System.out.println("Done. CSV file exported to " + csvFile); |
92 | return 0; |
93 | } |
94 | } |
95 |