1 | |
|
2 | |
|
3 | |
|
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 | |
|
18 | |
|
19 | |
|
20 | |
|
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 | |
|
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 | |
} |