Coverage Report - net.sourceforge.addam.ddlgen.oracle.DBMSMetadataGenerator
 
Classes in this File Line Coverage Branch Coverage Complexity
DBMSMetadataGenerator
0%
0/72
0%
0/17
0
 
 1  
 //
 2  
 // Copyright (c) 2004, International Decision Systems
 3  
 // all rights reserved
 4  
 //
 5  
 package net.sourceforge.addam.ddlgen.oracle;
 6  
 
 7  
 
 8  
 import java.io.*;
 9  
 import java.sql.*;
 10  
 import java.util.List;
 11  
 import java.util.ArrayList;
 12  
 
 13  
 import net.sourceforge.addam.ddlgen.Filter;
 14  
 import net.sourceforge.addam.ddlgen.Generator;
 15  
 
 16  
 /**
 17  
  * Uses DBMS_METADATA to generate the script to recreate the object.
 18  
  *
 19  
  * @author TIM3
 20  
  * @since Oct 12, 2005
 21  
  */
 22  0
 public abstract class DBMSMetadataGenerator implements Generator {
 23  
 
 24  
     public String objectsSQL() {
 25  0
         return "select object_name from all_objects where owner=? and object_type=?";
 26  
     }
 27  
 
 28  
     public abstract String objectType();
 29  
 
 30  
     public List<String> getObjects(String catalog, String schema, Filter filter,
 31  
                                    Connection connection, DatabaseMetaData metadata) throws Exception {
 32  0
         return getObjects(catalog, schema, objectType(), filter, connection, metadata, objectsSQL(), schema, objectType());
 33  
     }
 34  
 
 35  
     protected List<String> getObjects(String catalog, String schema, String objectType, Filter filter,
 36  
                                    Connection connection, DatabaseMetaData metadata, String objectsSQL, String... args) throws Exception {
 37  
 
 38  0
         List<String> objects = new ArrayList<String>();
 39  0
         PreparedStatement statement = null;
 40  0
         ResultSet resultSet = null;
 41  
         try {
 42  0
             statement = connection.prepareStatement(objectsSQL);
 43  0
             int index=1;
 44  0
             for (String arg : args) {
 45  0
                 statement.setString(index++, arg);
 46  
             }
 47  0
             resultSet = statement.executeQuery();
 48  0
             while (resultSet.next()) {
 49  0
                 String dbObject = resultSet.getString(1);
 50  0
                 if (filter.includes(dbObject)) {
 51  0
                     objects.add(dbObject);
 52  
                 }
 53  0
             }
 54  0
         } finally {
 55  0
             if (resultSet != null) resultSet.close();
 56  0
             if (statement != null) statement.close();
 57  0
         }
 58  0
         return objects;
 59  
     }
 60  
 
 61  
     public void generate(String catalog, String schema, String object,
 62  
                          String vendor, Connection connection, DatabaseMetaData metadata, BufferedWriter writer)
 63  
             throws Exception {
 64  0
         generate(catalog, schema, objectType(), object, vendor, connection, metadata, writer);
 65  0
     }
 66  
 
 67  
     protected void generate(String catalog, String schema, String objectType, String object,
 68  
                          String vendor, Connection connection, DatabaseMetaData metadata, BufferedWriter writer)
 69  
             throws Exception {
 70  0
         if (metadata.storesUpperCaseIdentifiers()) {
 71  0
             schema = (schema == null) ? null : schema.toUpperCase();
 72  0
             object = (object == null) ? null : object.toUpperCase();
 73  0
         } else if (metadata.storesLowerCaseIdentifiers()) {
 74  0
             schema = (schema == null) ? null : schema.toLowerCase();
 75  0
             object = (object == null) ? null : object.toLowerCase();
 76  
         }
 77  
 
 78  0
         PreparedStatement statement = null;
 79  0
         ResultSet resultSet = null;
 80  
         try {
 81  0
             setTransformParam(connection,"PRETTY",true);
 82  0
             setTransformParam(connection,"SQLTERMINATOR",true);
 83  0
             statement = connection.prepareStatement("select dbms_metadata.get_ddl(?,?,?) from dual");
 84  0
             statement.setString(1,objectType);
 85  0
             statement.setString(2,object);
 86  0
             statement.setString(3,schema);
 87  0
             resultSet = statement.executeQuery();
 88  0
             while (resultSet.next()) {
 89  0
                 Clob clob = resultSet.getClob(1);
 90  0
                 Reader clobReader = clob.getCharacterStream();
 91  0
                 BufferedReader reader = new BufferedReader(clobReader);
 92  0
                 for (String line = reader.readLine(); line != null; line = reader.readLine() ) {
 93  0
                     line = line.replace("\"" + schema + "\".","");
 94  0
                     writeLine(line,writer);
 95  
                 }
 96  0
             }
 97  
             // put everything back the way it was
 98  0
             setDefaultTransformParams(connection);
 99  0
         } finally {
 100  0
             if (resultSet != null) resultSet.close();
 101  0
             if (statement != null) statement.close();
 102  0
         }
 103  0
     }
 104  
 
 105  
     protected void writeLine(String line, BufferedWriter writer) throws IOException {
 106  0
         writer.write(line);
 107  0
         writer.newLine();
 108  0
         writer.flush();
 109  0
     }
 110  
 
 111  
     protected void setTransformParam(Connection connection, String param, boolean value) throws SQLException {
 112  0
         PreparedStatement statement = null;
 113  
         try {
 114  0
             statement = connection.prepareCall("{call DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM,?,?)}");
 115  0
             statement.setString(1,param);
 116  0
             statement.setBoolean(2,value);
 117  0
             statement.execute();
 118  0
         } finally {
 119  0
             if (statement != null) statement.close();
 120  0
         }
 121  0
     }
 122  
 
 123  
     protected void setDefaultTransformParams(Connection connection) throws SQLException {
 124  0
         PreparedStatement statement = null;
 125  
         try {
 126  0
             statement = connection.prepareCall("{call DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM,'DEFAULT',true)}");
 127  0
             statement.execute();
 128  0
         } finally {
 129  0
             if (statement != null) statement.close();
 130  0
         }
 131  0
     }
 132  
 
 133  
 }