a utility for generating JSON from SQL queries using JDBC
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

237 lines
5.5 KiB

12 years ago
  1. package com.binarythought.jdbcjson;
  2. import java.io.FileInputStream;
  3. import java.io.FileWriter;
  4. import java.sql.Connection;
  5. import java.sql.DriverManager;
  6. import java.sql.ResultSet;
  7. import java.sql.ResultSetMetaData;
  8. import java.sql.Statement;
  9. import java.sql.Types;
  10. import java.text.DateFormat;
  11. import java.util.HashSet;
  12. import java.util.Properties;
  13. import java.util.Set;
  14. import com.google.gson.stream.JsonWriter;
  15. public class JDBCJSON
  16. {
  17. private Properties properties;
  18. public JDBCJSON()
  19. {
  20. properties = new Properties();
  21. }
  22. public void load(String path) throws Exception
  23. {
  24. FileInputStream stream = new FileInputStream(path);
  25. properties.load(stream);
  26. stream.close();
  27. }
  28. public String[] list()
  29. {
  30. HashSet<String> jobs = new HashSet<String>();
  31. for(String name : properties.stringPropertyNames()){
  32. int dot = name.lastIndexOf('.');
  33. if(dot > 0){ jobs.add(name.substring(0, dot)); }
  34. }
  35. return jobs.toArray(new String[0]);
  36. }
  37. public void run(String job, Set<String> warnings) throws Exception
  38. {
  39. DateFormat dateformat = DateFormat.getDateInstance(DateFormat.SHORT);
  40. DateFormat timeformat = DateFormat.getTimeInstance(DateFormat.SHORT);
  41. DateFormat datetimeformat = DateFormat.getDateTimeInstance(
  42. DateFormat.SHORT, DateFormat.SHORT
  43. );
  44. String url = properties.getProperty(job + ".url");
  45. String sql = properties.getProperty(job + ".sql");
  46. if(sql == null){ sql = "SELECT * FROM " + job; }
  47. String out = properties.getProperty(job + ".out");
  48. if(out == null){ out = job + ".json"; }
  49. Connection conn = null;
  50. JsonWriter writer = null;
  51. try {
  52. writer = new JsonWriter(new FileWriter(out, false));
  53. conn = DriverManager.getConnection(url);
  54. Statement st = conn.createStatement(
  55. ResultSet.TYPE_FORWARD_ONLY,
  56. ResultSet.CONCUR_READ_ONLY
  57. );
  58. ResultSet rs = st.executeQuery(sql);
  59. ResultSetMetaData rsmd = rs.getMetaData();
  60. int columns = rsmd.getColumnCount();
  61. writer.beginArray();
  62. while(rs.next()){
  63. writer.beginObject();
  64. for(int i = 1; i <= columns; i++){
  65. switch(rsmd.getColumnType(i)){
  66. case Types.CHAR:
  67. case Types.LONGVARCHAR:
  68. case Types.LONGNVARCHAR:
  69. case Types.NCHAR:
  70. case Types.NVARCHAR:
  71. case Types.VARCHAR:
  72. writer.name(rsmd.getColumnName(i));
  73. writer.value(rs.getString(i));
  74. break;
  75. case Types.NULL:
  76. writer.name(rsmd.getColumnName(i));
  77. writer.nullValue();
  78. break;
  79. case Types.BIT:
  80. case Types.BOOLEAN:
  81. writer.name(rsmd.getColumnName(i));
  82. writer.value(rs.getBoolean(i));
  83. break;
  84. case Types.BIGINT:
  85. case Types.INTEGER:
  86. case Types.SMALLINT:
  87. case Types.TINYINT:
  88. writer.name(rsmd.getColumnName(i));
  89. writer.value(rs.getLong(i));
  90. break;
  91. case Types.DOUBLE:
  92. case Types.FLOAT:
  93. writer.name(rsmd.getColumnName(i));
  94. writer.value(rs.getDouble(i));
  95. break;
  96. case Types.DECIMAL:
  97. case Types.NUMERIC:
  98. writer.name(rsmd.getColumnName(i));
  99. writer.value(rs.getBigDecimal(i));
  100. break;
  101. case Types.DATE:
  102. writer.name(rsmd.getColumnName(i));
  103. if(rs.getDate(i) == null){
  104. writer.nullValue();
  105. } else {
  106. writer.value(dateformat.format(rs.getDate(i)));
  107. }
  108. break;
  109. case Types.TIME:
  110. writer.name(rsmd.getColumnName(i));
  111. if(rs.getTime(i) == null){
  112. writer.nullValue();
  113. } else {
  114. writer.value(timeformat.format(rs.getTime(i)));
  115. }
  116. break;
  117. case Types.TIMESTAMP:
  118. writer.name(rsmd.getColumnName(i));
  119. if(rs.getTimestamp(i) == null){
  120. writer.nullValue();
  121. } else {
  122. writer.value(datetimeformat.format(rs.getTimestamp(i)));
  123. }
  124. break;
  125. default:
  126. if(warnings != null){
  127. warnings.add(
  128. "Unsupported column, " + rsmd.getColumnName(i) +
  129. ", type " + rsmd.getColumnTypeName(i)
  130. );
  131. }
  132. break;
  133. }
  134. }
  135. writer.endObject();
  136. }
  137. writer.endArray();
  138. } finally {
  139. try { writer.close(); }
  140. catch(Exception ex){ }
  141. try { conn.close(); }
  142. catch(Exception ex){ }
  143. }
  144. }
  145. public static void main(String[] args)
  146. {
  147. boolean debug = false;
  148. String properties_path = null;
  149. for(int i = 0; i < args.length; i++){
  150. if("-d".equals(args[i])){
  151. debug = true;
  152. } else if(i == (args.length - 1)){
  153. properties_path = args[i];
  154. } else {
  155. System.out.println("Unrecognized option: " + args[i]);
  156. break;
  157. }
  158. }
  159. if(properties_path == null){
  160. System.out.println("Usage:");
  161. System.out.println("\tjava -jar jdbcjson.jar [-d] myfile.properties");
  162. System.out.println("Options:");
  163. System.out.println("\t-d\tDebug mode. Prints warnings and more error detail.");
  164. System.exit(1);
  165. }
  166. JDBCJSON jdbcjson = new JDBCJSON();
  167. try {
  168. jdbcjson.load(properties_path);
  169. } catch(Exception ex){
  170. System.out.print("Error while loading " + args[0] + ": ");
  171. System.out.println(ex.getMessage());
  172. if(debug){ ex.printStackTrace(); }
  173. System.exit(1);
  174. }
  175. String[] jobs = jdbcjson.list();
  176. for(String job : jobs){
  177. try {
  178. if(debug){
  179. HashSet<String> warnings = new HashSet<String>();
  180. jdbcjson.run(job, warnings);
  181. for(String warning : warnings){
  182. System.out.println("Warning: " + warning);
  183. }
  184. } else {
  185. jdbcjson.run(job, null);
  186. }
  187. } catch(Exception ex){
  188. System.out.print("Error while running job " + job + ": ");
  189. System.out.println(ex.getMessage());
  190. if(debug){ ex.printStackTrace(); }
  191. System.exit(1);
  192. }
  193. }
  194. System.exit(0);
  195. }
  196. }