root / trunk / libraries / libDataSourceDBBaseDrivers / src / org / gvsig / data / datastores / vectorial / driver / jdbc / h2 / H2DriverUtils.java @ 19626
History | View | Annotate | Download (11.7 KB)
1 |
package org.gvsig.data.datastores.vectorial.driver.jdbc.h2; |
---|---|
2 |
|
3 |
import java.sql.Connection; |
4 |
import java.sql.DriverManager; |
5 |
import java.sql.ResultSet; |
6 |
import java.sql.ResultSetMetaData; |
7 |
import java.sql.Statement; |
8 |
import java.util.Iterator; |
9 |
|
10 |
import org.gvsig.data.datastores.vectorial.driver.jdbc.DBFeatureType; |
11 |
import org.gvsig.data.datastores.vectorial.driver.jdbc.exception.JDBCDriverNotFoundException; |
12 |
import org.gvsig.data.datastores.vectorial.driver.jdbc.exception.SQLException; |
13 |
import org.gvsig.data.exception.InitializeException; |
14 |
import org.gvsig.data.exception.ReadException; |
15 |
import org.gvsig.data.vectorial.DefaultAttributeDescriptor; |
16 |
import org.gvsig.data.vectorial.IFeature; |
17 |
import org.gvsig.data.vectorial.IFeatureAttributeDescriptor; |
18 |
|
19 |
import com.iver.cit.gvsig.fmap.core.FShape; |
20 |
import com.iver.cit.gvsig.fmap.core.IGeometry; |
21 |
import com.iver.cit.gvsig.fmap.drivers.WKBParser2; |
22 |
|
23 |
public class H2DriverUtils { |
24 |
private static WKBParser2 wkbParser = new WKBParser2(); |
25 |
|
26 |
static DBFeatureType getFeatureType(Connection conn,H2DriverParameters params) throws ReadException{ |
27 |
String sql=""; |
28 |
String columns=params.getFields();
|
29 |
|
30 |
if (columns == null || columns == ""){ |
31 |
columns = "*";
|
32 |
} |
33 |
|
34 |
|
35 |
try {
|
36 |
sql = "Select "+columns+" from " + params.tableID() + " limit 1;"; |
37 |
Statement stAux = conn.createStatement();
|
38 |
Statement stAux1 = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY); |
39 |
ResultSet rs = stAux.executeQuery(sql);
|
40 |
ResultSetMetaData rsMetadata = rs.getMetaData();
|
41 |
String schemaFilter=""; |
42 |
if (params.getSchema() != null && params.getSchema() != ""){ |
43 |
schemaFilter = " TABLE_SCHEMA='" + params.getSchema() +"' AND "; |
44 |
} |
45 |
String sqlAllMeta = "SELECT * FROM INFORMATION_SCHEMA.COLUMNS where " |
46 |
+ schemaFilter |
47 |
+ "TABLE_NAME='"+ params.getTableName() +"'"; |
48 |
|
49 |
ResultSet rsAllMeta = stAux1.executeQuery(sqlAllMeta);
|
50 |
|
51 |
// ResultSet rsAllMeta = conn.getMetaData().getAttributes(null, null, tableName, "*");
|
52 |
|
53 |
String colName;
|
54 |
int i;
|
55 |
DBFeatureType featureType = new DBFeatureType();
|
56 |
featureType.setTableID(params.tableID()); |
57 |
DefaultAttributeDescriptor attr; |
58 |
for (i=1;i<=rsMetadata.getColumnCount();i++){ |
59 |
colName= rsMetadata.getColumnName(i); |
60 |
rsAllMeta.first(); |
61 |
|
62 |
while (true){ |
63 |
if (rsAllMeta.isAfterLast()){
|
64 |
attr = getAttributeFromJDBC(conn,rsMetadata,i); |
65 |
featureType.add(attr); |
66 |
attr.setOrdinal(i-1);
|
67 |
break;
|
68 |
} else if(rsAllMeta.getString("COLUMN_NAME").equals(colName)){ |
69 |
attr = getAttributeFromJDBC(conn,rsAllMeta); |
70 |
featureType.add(attr); |
71 |
attr.setOrdinal(i-1);
|
72 |
break;
|
73 |
} |
74 |
rsAllMeta.next(); |
75 |
} |
76 |
if (attr.getName().equals(params.getGeometryField())){
|
77 |
if (attr.getDataType().equals(IFeatureAttributeDescriptor.TYPE_OBJECT)){
|
78 |
attr.setType(IFeatureAttributeDescriptor.TYPE_GEOMETRY); |
79 |
}else{
|
80 |
throw new InitializeException( |
81 |
"H2DriverUtils.getFeatureType",
|
82 |
new Exception("Geometry Field '" |
83 |
+ params.getGeometryField() |
84 |
+ "' is a "
|
85 |
+ attr.getDataType() |
86 |
+ " but sould be "
|
87 |
+ IFeatureAttributeDescriptor.TYPE_OBJECT)); |
88 |
} |
89 |
|
90 |
} |
91 |
} |
92 |
|
93 |
rs.close(); |
94 |
rsAllMeta.close(); |
95 |
|
96 |
return featureType;
|
97 |
} catch (java.sql.SQLException e) {
|
98 |
// TODO Auto-generated catch block
|
99 |
throw new SQLException(sql,"getFeatureType",e); |
100 |
} |
101 |
|
102 |
} |
103 |
|
104 |
private static DefaultAttributeDescriptor getAttributeFromJDBC(Connection conn,ResultSetMetaData rsMetadata,int colIndex) throws SQLException{ |
105 |
DefaultAttributeDescriptor column= new DefaultAttributeDescriptor();
|
106 |
try {
|
107 |
column.setName(rsMetadata.getColumnName(colIndex)); |
108 |
switch (rsMetadata.getColumnType(colIndex)) {
|
109 |
case java.sql.Types.INTEGER:
|
110 |
column.setType(IFeatureAttributeDescriptor.TYPE_INT); |
111 |
break;
|
112 |
case java.sql.Types.BIGINT:
|
113 |
column.setType(IFeatureAttributeDescriptor.TYPE_LONG); |
114 |
break;
|
115 |
case java.sql.Types.REAL:
|
116 |
column.setType(IFeatureAttributeDescriptor.TYPE_DOUBLE); |
117 |
// column.setPrecision(rsMetadata.getInt("DECIMAL_DIGITS"));
|
118 |
break;
|
119 |
case java.sql.Types.DOUBLE:
|
120 |
column.setType(IFeatureAttributeDescriptor.TYPE_DOUBLE); |
121 |
// column.setPrecision(rsMetadata.getInt("DECIMAL_DIGITS"));
|
122 |
break;
|
123 |
case java.sql.Types.CHAR:
|
124 |
column.setType(IFeatureAttributeDescriptor.TYPE_STRING); |
125 |
column.setSize(rsMetadata.getColumnDisplaySize(colIndex)); |
126 |
break;
|
127 |
case java.sql.Types.VARCHAR:
|
128 |
column.setType(IFeatureAttributeDescriptor.TYPE_STRING); |
129 |
column.setSize(rsMetadata.getColumnDisplaySize(colIndex)); |
130 |
break;
|
131 |
case java.sql.Types.FLOAT:
|
132 |
column.setType(IFeatureAttributeDescriptor.TYPE_FLOAT); |
133 |
column.setSize(rsMetadata.getColumnDisplaySize(colIndex)); |
134 |
break;
|
135 |
case java.sql.Types.DECIMAL:
|
136 |
column.setType(IFeatureAttributeDescriptor.TYPE_FLOAT); |
137 |
column.setSize(rsMetadata.getColumnDisplaySize(colIndex)); |
138 |
// column.setPrecision(rsMetadata.getInt("DECIMAL_DIGITS"));
|
139 |
break;
|
140 |
case java.sql.Types.DATE:
|
141 |
column.setType(IFeatureAttributeDescriptor.TYPE_DATE); |
142 |
break;
|
143 |
case java.sql.Types.BOOLEAN:
|
144 |
column.setType(IFeatureAttributeDescriptor.TYPE_BOOLEAN); |
145 |
break;
|
146 |
default:
|
147 |
column.setType(IFeatureAttributeDescriptor.TYPE_OBJECT); |
148 |
break;
|
149 |
} |
150 |
} catch (java.sql.SQLException e){
|
151 |
throw new SQLException("","load attribute definition",e); |
152 |
} |
153 |
|
154 |
return column;
|
155 |
|
156 |
} |
157 |
|
158 |
private static DefaultAttributeDescriptor getAttributeFromJDBC(Connection conn, ResultSet rsMetadata) throws SQLException{ |
159 |
DefaultAttributeDescriptor column= new DefaultAttributeDescriptor();
|
160 |
try {
|
161 |
column.setName(rsMetadata.getString("COLUMN_NAME"));
|
162 |
switch (rsMetadata.getInt("DATA_TYPE")) { |
163 |
case java.sql.Types.INTEGER:
|
164 |
column.setType(IFeatureAttributeDescriptor.TYPE_INT); |
165 |
break;
|
166 |
case java.sql.Types.BIGINT:
|
167 |
column.setType(IFeatureAttributeDescriptor.TYPE_LONG); |
168 |
break;
|
169 |
case java.sql.Types.REAL:
|
170 |
column.setType(IFeatureAttributeDescriptor.TYPE_DOUBLE); |
171 |
// column.setPrecision(rsMetadata.getInt("DECIMAL_DIGITS"));
|
172 |
column.setPrecision(rsMetadata.getInt("NUMERIC_PRECISION"));
|
173 |
break;
|
174 |
case java.sql.Types.DOUBLE:
|
175 |
column.setType(IFeatureAttributeDescriptor.TYPE_DOUBLE); |
176 |
// column.setPrecision(rsMetadata.getInt("DECIMAL_DIGITS"));
|
177 |
column.setPrecision(rsMetadata.getInt("NUMERIC_PRECISION"));
|
178 |
break;
|
179 |
case java.sql.Types.CHAR:
|
180 |
column.setType(IFeatureAttributeDescriptor.TYPE_STRING); |
181 |
// column.setSize(rsMetadata.getInt("COLUMN_SIZE"));
|
182 |
column.setSize(rsMetadata.getInt("CHARACTER_MAXIMUM_LENGTH"));
|
183 |
break;
|
184 |
case java.sql.Types.VARCHAR:
|
185 |
column.setType(IFeatureAttributeDescriptor.TYPE_STRING); |
186 |
// column.setSize(rsMetadata.getInt("COLUMN_SIZE"));
|
187 |
column.setSize(rsMetadata.getInt("CHARACTER_MAXIMUM_LENGTH"));
|
188 |
|
189 |
break;
|
190 |
case java.sql.Types.FLOAT:
|
191 |
column.setType(IFeatureAttributeDescriptor.TYPE_FLOAT); |
192 |
// column.setSize(rsMetadata.getInt("COLUMN_SIZE"));
|
193 |
column.setSize(rsMetadata.getInt("CHARACTER_MAXIMUM_LENGTH"));
|
194 |
break;
|
195 |
case java.sql.Types.DECIMAL:
|
196 |
column.setType(IFeatureAttributeDescriptor.TYPE_FLOAT); |
197 |
// column.setSize(rsMetadata.getInt("COLUMN_SIZE"));
|
198 |
column.setSize(rsMetadata.getInt("CHARACTER_MAXIMUM_LENGTH"));
|
199 |
// column.setPrecision(rsMetadata.getInt("DECIMAL_DIGITS"));
|
200 |
column.setPrecision(rsMetadata.getInt("NUMERIC_PRECISION"));
|
201 |
break;
|
202 |
case java.sql.Types.DATE:
|
203 |
column.setType(IFeatureAttributeDescriptor.TYPE_DATE); |
204 |
break;
|
205 |
case java.sql.Types.BOOLEAN:
|
206 |
column.setType(IFeatureAttributeDescriptor.TYPE_BOOLEAN); |
207 |
break;
|
208 |
default:
|
209 |
//FIXME: Falta comprobar si es geometrica!!!
|
210 |
column.setType(IFeatureAttributeDescriptor.TYPE_OBJECT); |
211 |
break;
|
212 |
} |
213 |
column.setDefaultValue(rsMetadata.getObject("COLUMN_DEFAULT"));
|
214 |
column.setAllowNull(rsMetadata.getBoolean("IS_NULLABLE"));
|
215 |
} catch (java.sql.SQLException e){
|
216 |
throw new SQLException("","load attribute definition",e); |
217 |
} |
218 |
|
219 |
return column;
|
220 |
|
221 |
} |
222 |
|
223 |
|
224 |
|
225 |
static void initializeTableEPSG_and_shapeType(Connection conn,String tableID, DBFeatureType dbld) throws ReadException { |
226 |
try {
|
227 |
Statement stAux = conn.createStatement();
|
228 |
|
229 |
// String sql = "SELECT * FROM GEOMETRY_COLUMNS WHERE F_TABLE_NAME = '"
|
230 |
// + getTableName() + "' AND F_GEOMETRY_COLUMN = '" + getLyrDef().getFieldGeometry() + "'";
|
231 |
String sql= "SELECT SRID("+dbld.getDefaultGeometry()+"), GeometryType("+dbld.getDefaultGeometry()+") FROM "+tableID +" WHERE "+dbld.getDefaultGeometry()+" is not null LIMIT 1"; |
232 |
|
233 |
ResultSet rs = stAux.executeQuery(sql);
|
234 |
if(!rs.next()){
|
235 |
dbld.setDefaultSRS("");
|
236 |
dbld.setGeometryTypes(new int[]{FShape.MULTI}); |
237 |
return;
|
238 |
} |
239 |
dbld.setDefaultSRS("EPSG:"+rs.getInt(1)); |
240 |
|
241 |
String geometryType = rs.getString(2); |
242 |
int shapeType = FShape.MULTI;
|
243 |
if (geometryType.compareToIgnoreCase("Point") == 0) |
244 |
shapeType = FShape.POINT; |
245 |
else if (geometryType.compareToIgnoreCase("LineString") == 0) |
246 |
shapeType = FShape.LINE; |
247 |
else if (geometryType.compareToIgnoreCase("Polygon") == 0) |
248 |
shapeType = FShape.POLYGON; |
249 |
else if (geometryType.compareToIgnoreCase("MultiPoint") == 0) |
250 |
shapeType = FShape.POINT; |
251 |
else if (geometryType.compareToIgnoreCase("MultiLineString") == 0) |
252 |
shapeType = FShape.LINE; |
253 |
else if (geometryType.compareToIgnoreCase("MultiPolygon") == 0) |
254 |
shapeType = FShape.POLYGON; |
255 |
|
256 |
dbld.setGeometryTypes(new int[]{shapeType}); |
257 |
rs.close(); |
258 |
|
259 |
} catch (java.sql.SQLException e) {
|
260 |
dbld.setDefaultSRS("");
|
261 |
dbld.setGeometryTypes(new int[]{FShape.MULTI}); |
262 |
throw new ReadException("H2DriverUtils.getTableEPSG_and_shapeType",e); |
263 |
} |
264 |
|
265 |
} |
266 |
|
267 |
static String getConnectionResourceID(String dbUrl,String dbUser){ |
268 |
return H2Driver.DRIVER_NAME+";"+dbUrl+";"+dbUser; |
269 |
|
270 |
} |
271 |
|
272 |
|
273 |
static String getJDBCUrl(String host,String db){ |
274 |
String url;
|
275 |
url = "jdbc:h2:tcp://"+host;
|
276 |
if (db == null || db == ""){ |
277 |
url=url+"/default";
|
278 |
}else {
|
279 |
url=url+"/"+db;
|
280 |
} |
281 |
|
282 |
return url;
|
283 |
} |
284 |
|
285 |
static Connection getConnection(String dbUrl,String dbUser, String dbPass) throws InitializeException{ |
286 |
//TODO: Aqu? habria que implementar la llamada
|
287 |
// al Resource Manager para comprobar si ya hay
|
288 |
// una connexion a la BD
|
289 |
String connID = getConnectionResourceID(dbUrl, dbUser);
|
290 |
|
291 |
Connection conn = null; |
292 |
// IResource res = ResourceManager.getResourceManager().getResource(connID);
|
293 |
|
294 |
|
295 |
|
296 |
try {
|
297 |
Class.forName("org.h2.Driver"); |
298 |
} catch (ClassNotFoundException e) { |
299 |
throw new JDBCDriverNotFoundException("org.h2.Driver",e); |
300 |
} |
301 |
try {
|
302 |
conn = DriverManager.getConnection(dbUrl, dbUser, dbPass);
|
303 |
conn.setAutoCommit(false);
|
304 |
|
305 |
} catch (java.sql.SQLException e1) {
|
306 |
throw new InitializeException("H2Driver",e1); |
307 |
} |
308 |
//TODO: Registrar en el Resource manager
|
309 |
// ResourceManager.getResourceManager().addResource(res);
|
310 |
|
311 |
return conn;
|
312 |
} |
313 |
|
314 |
static IFeature createFeature(H2Driver driver,ResultSet rs,DBFeatureType featureType) throws ReadException{ |
315 |
|
316 |
H2Feature feature=null;
|
317 |
|
318 |
|
319 |
String pk;
|
320 |
try {
|
321 |
pk = rs.getString(featureType.getFieldId()); |
322 |
|
323 |
feature=new H2Feature(featureType,driver,pk);
|
324 |
|
325 |
Iterator iter = featureType.iterator();
|
326 |
|
327 |
while (iter.hasNext()) {
|
328 |
IFeatureAttributeDescriptor fad=(IFeatureAttributeDescriptor)iter.next(); |
329 |
if (fad.getDataType().equals(IFeatureAttributeDescriptor.TYPE_GEOMETRY)) {
|
330 |
byte[] data = rs.getBytes(fad.getName()); |
331 |
IGeometry geom = wkbParser.parse(data); |
332 |
feature.setDefaultGeometry(geom); |
333 |
feature.set(fad.getName(),geom); |
334 |
} else {
|
335 |
feature.set(fad.getName(), rs.getObject(fad.getName())); |
336 |
} |
337 |
|
338 |
} |
339 |
return feature;
|
340 |
} catch (java.sql.SQLException e) {
|
341 |
throw new ReadException("CreateFeature",e); |
342 |
} |
343 |
} |
344 |
|
345 |
static String objectToSqlString(Object obj){ |
346 |
if (obj instanceof String){ |
347 |
return "'"+ scapeString((String)obj) +"'"; |
348 |
} else if (obj == null){ |
349 |
return "null"; |
350 |
}else{
|
351 |
// OJO con otros tipos!!
|
352 |
return obj.toString();
|
353 |
} |
354 |
|
355 |
} |
356 |
|
357 |
static String scapeString(String str){ |
358 |
return str.replace("'", "''"); |
359 |
} |
360 |
} |