diff --git a/build.xml b/build.xml index 9b920c7..0d68d66 100644 --- a/build.xml +++ b/build.xml @@ -1,6 +1,6 @@ - + diff --git a/src/com/binarythought/jdbcjson/JDBCJSON.java b/src/com/binarythought/jdbcjson/JDBCJSON.java index c460fc1..62aff89 100644 --- a/src/com/binarythought/jdbcjson/JDBCJSON.java +++ b/src/com/binarythought/jdbcjson/JDBCJSON.java @@ -18,12 +18,20 @@ import com.google.gson.stream.JsonWriter; public class JDBCJSON { + private static final DateFormat dateformat = DateFormat.getDateInstance(DateFormat.SHORT); + private static final DateFormat timeformat = DateFormat.getTimeInstance(DateFormat.SHORT); + private static final DateFormat datetimeformat = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT); + + private boolean debug; private Properties properties; + private Set warnings; - public JDBCJSON() + public JDBCJSON(boolean debug) { - properties = new Properties(); + this.properties = new Properties(); + this.debug = debug; + this.warnings = new HashSet(); } @@ -46,15 +54,15 @@ public class JDBCJSON return jobs.toArray(new String[0]); } - - public void run(String job, Set warnings) throws Exception + + public Set getWarnings() { - DateFormat dateformat = DateFormat.getDateInstance(DateFormat.SHORT); - DateFormat timeformat = DateFormat.getTimeInstance(DateFormat.SHORT); - DateFormat datetimeformat = DateFormat.getDateTimeInstance( - DateFormat.SHORT, DateFormat.SHORT - ); + return warnings; + } + + public void run(String job) throws Exception + { String url = properties.getProperty(job + ".url"); String sql = properties.getProperty(job + ".sql"); @@ -77,101 +85,9 @@ public class JDBCJSON ); ResultSet rs = st.executeQuery(sql); - ResultSetMetaData rsmd = rs.getMetaData(); - int columns = rsmd.getColumnCount(); - writer = new JsonWriter(new FileWriter(out, false)); - writer.beginArray(); - while(rs.next()){ - writer.beginObject(); - for(int i = 1; i <= columns; i++){ - switch(rsmd.getColumnType(i)){ - case Types.CHAR: - case Types.LONGVARCHAR: - case Types.LONGNVARCHAR: - case Types.NCHAR: - case Types.NVARCHAR: - case Types.VARCHAR: - writer.name(rsmd.getColumnName(i)); - writer.value(rs.getString(i)); - break; - - case Types.NULL: - writer.name(rsmd.getColumnName(i)); - writer.nullValue(); - break; - - case Types.BIT: - case Types.BOOLEAN: - writer.name(rsmd.getColumnName(i)); - writer.value(rs.getBoolean(i)); - break; - - case Types.BIGINT: - case Types.INTEGER: - case Types.SMALLINT: - case Types.TINYINT: - writer.name(rsmd.getColumnName(i)); - writer.value(rs.getLong(i)); - break; - - case Types.REAL: - writer.name(rsmd.getColumnName(i)); - writer.value(rs.getFloat(i)); - break; - - case Types.DOUBLE: - case Types.FLOAT: - writer.name(rsmd.getColumnName(i)); - writer.value(rs.getDouble(i)); - break; - - case Types.DECIMAL: - case Types.NUMERIC: - writer.name(rsmd.getColumnName(i)); - writer.value(rs.getBigDecimal(i)); - break; - - case Types.DATE: - writer.name(rsmd.getColumnName(i)); - if(rs.getDate(i) == null){ - writer.nullValue(); - } else { - writer.value(dateformat.format(rs.getDate(i))); - } - break; - - case Types.TIME: - writer.name(rsmd.getColumnName(i)); - if(rs.getTime(i) == null){ - writer.nullValue(); - } else { - writer.value(timeformat.format(rs.getTime(i))); - } - break; - - case Types.TIMESTAMP: - writer.name(rsmd.getColumnName(i)); - if(rs.getTimestamp(i) == null){ - writer.nullValue(); - } else { - writer.value(datetimeformat.format(rs.getTimestamp(i))); - } - break; - - default: - if(warnings != null){ - warnings.add( - "Unsupported column, " + rsmd.getColumnName(i) + - ", type " + rsmd.getColumnTypeName(i) - ); - } - break; - } - } - writer.endObject(); - } - writer.endArray(); + + process(rs, writer, null); } finally { try { writer.close(); } @@ -183,6 +99,119 @@ public class JDBCJSON } + private void process(ResultSet rs, JsonWriter writer, String column) throws Exception + { + ResultSetMetaData rsmd = rs.getMetaData(); + int count = rsmd.getColumnCount(); + + writer.beginArray(); + while(rs.next()){ + if(column == null){ writer.beginObject(); } + for(int i = (column == null ? 1 : 2); i <= count; i++){ + switch(rsmd.getColumnType(i)){ + case Types.CHAR: + case Types.LONGVARCHAR: + case Types.LONGNVARCHAR: + case Types.NCHAR: + case Types.NVARCHAR: + case Types.VARCHAR: + if(column == null){ writer.name(rsmd.getColumnName(i)); } + writer.value(rs.getString(i)); + break; + + case Types.NULL: + if(column == null){ writer.name(rsmd.getColumnName(i)); } + writer.nullValue(); + break; + + case Types.BIT: + case Types.BOOLEAN: + if(column == null){ writer.name(rsmd.getColumnName(i)); } + writer.value(rs.getBoolean(i)); + break; + + case Types.BIGINT: + case Types.INTEGER: + case Types.SMALLINT: + case Types.TINYINT: + if(column == null){ writer.name(rsmd.getColumnName(i)); } + writer.value(rs.getLong(i)); + break; + + case Types.REAL: + if(column == null){ writer.name(rsmd.getColumnName(i)); } + writer.value(rs.getFloat(i)); + break; + + case Types.DOUBLE: + case Types.FLOAT: + if(column == null){ writer.name(rsmd.getColumnName(i)); } + writer.value(rs.getDouble(i)); + break; + + case Types.DECIMAL: + case Types.NUMERIC: + if(column == null){ writer.name(rsmd.getColumnName(i)); } + writer.value(rs.getBigDecimal(i)); + break; + + case Types.DATE: + if(column == null){ writer.name(rsmd.getColumnName(i)); } + if(rs.getDate(i) == null){ + writer.nullValue(); + } else { + writer.value(dateformat.format(rs.getDate(i))); + } + break; + + case Types.TIME: + if(column == null){ writer.name(rsmd.getColumnName(i)); } + if(rs.getTime(i) == null){ + writer.nullValue(); + } else { + writer.value(timeformat.format(rs.getTime(i))); + } + break; + + case Types.TIMESTAMP: + if(column == null){ writer.name(rsmd.getColumnName(i)); } + if(rs.getTimestamp(i) == null){ + writer.nullValue(); + } else { + writer.value(datetimeformat.format(rs.getTimestamp(i))); + } + break; + + case Types.ARRAY: + if(column == null){ writer.name(rsmd.getColumnName(i)); } + if(rs.getArray(i) == null){ + writer.nullValue(); + } else { + process( + rs.getArray(i).getResultSet(), + writer, + (column == null ? rsmd.getColumnName(i) : column) + ); + } + break; + + default: + if(debug){ + warnings.add( + "Unsupported column, " + + (column == null ? rsmd.getColumnName(i) : column) + + ", type " + rsmd.getColumnTypeName(i) + ); + } + break; + } + } + if(column == null){ writer.endObject(); } + } + writer.endArray(); + } + + public static void main(String[] args) { boolean debug = false; @@ -207,7 +236,7 @@ public class JDBCJSON System.exit(1); } - JDBCJSON jdbcjson = new JDBCJSON(); + JDBCJSON jdbcjson = new JDBCJSON(debug); try { jdbcjson.load(properties_path); @@ -220,23 +249,17 @@ public class JDBCJSON String[] jobs = jdbcjson.list(); for(String job : jobs){ - try { - if(debug){ - HashSet warnings = new HashSet(); - jdbcjson.run(job, warnings); - - for(String warning : warnings){ - System.out.println("Warning: " + warning); - } - } else { - jdbcjson.run(job, null); - } - } catch(Exception ex){ + try { jdbcjson.run(job); } + catch(Exception ex){ System.out.print("Error while running job " + job + ": "); System.out.println(ex.getMessage()); if(debug){ ex.printStackTrace(); } System.exit(1); } + + for(String warning : jdbcjson.getWarnings()){ + System.out.println("Warning in " + job + ": " + warning); + } } System.exit(0);