Revision 44951 trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.db/org.gvsig.fmap.dal.db.mdb/src/main/java/org/gvsig/fmap/dal/store/mdb/operations/MDBFetchFeatureTypeOperation.java
MDBFetchFeatureTypeOperation.java | ||
---|---|---|
2 | 2 |
package org.gvsig.fmap.dal.store.mdb.operations; |
3 | 3 |
|
4 | 4 |
import java.sql.Connection; |
5 |
import java.sql.DatabaseMetaData; |
|
5 | 6 |
import java.sql.ResultSet; |
6 | 7 |
import java.sql.ResultSetMetaData; |
7 | 8 |
import java.sql.SQLException; |
8 | 9 |
import java.sql.Statement; |
10 |
import java.util.ArrayList; |
|
9 | 11 |
import java.util.HashMap; |
10 | 12 |
import java.util.List; |
11 | 13 |
import java.util.Map; |
... | ... | |
168 | 170 |
solver.getProjection(getConnection(), column_info.srid) |
169 | 171 |
); |
170 | 172 |
} |
171 |
GeometryType gt = getGeometryTypeFromMDBSpatialType(type);
|
|
173 |
GeometryType gt = getGeometryTypeFromMDBType(type); |
|
172 | 174 |
if( gt != null ) { |
173 | 175 |
attr.setGeometryType(gt); |
174 | 176 |
} |
... | ... | |
178 | 180 |
} |
179 | 181 |
} |
180 | 182 |
|
181 |
private GeometryType getGeometryTypeFromMDBSpatialType(String typeName) {
|
|
183 |
private GeometryType getGeometryTypeFromMDBType(String typeName) { |
|
182 | 184 |
if( mdbGeometryTypes==null ) { |
183 | 185 |
// |
184 | 186 |
// https://github.com/orbisgis/h2gis/wiki/1.-Spatial-data#geometry-columns-view |
... | ... | |
211 | 213 |
} |
212 | 214 |
return mdbGeometryTypes.get(typeName); |
213 | 215 |
} |
216 |
|
|
217 |
@Override |
|
218 |
protected List<String> getPrimaryKeysFromInformationSchema(Connection conn) throws SQLException { |
|
214 | 219 |
|
220 |
// String sql = getSQLToRetrievePrimaryKeysFromInformationSchema(conn.getMetaData()); |
|
221 |
DatabaseMetaData metadata = conn.getMetaData(); |
|
222 |
|
|
223 |
String tableName = table.getTable(); |
|
224 |
|
|
225 |
ResultSet rs = metadata.getPrimaryKeys(null, null, tableName); |
|
226 |
List<String> pks = new ArrayList(); |
|
227 |
|
|
228 |
try { |
|
229 |
while (rs.next()) { |
|
230 |
pks.add(rs.getString(1)); |
|
231 |
} |
|
232 |
if (pks.isEmpty()) { |
|
233 |
return null; |
|
234 |
} |
|
235 |
return pks; |
|
236 |
|
|
237 |
} catch (Exception ex) { |
|
238 |
return pks; |
|
239 |
|
|
240 |
} finally { |
|
241 |
JDBCUtils.closeQuietly(rs); |
|
242 |
} |
|
243 |
} |
|
244 |
|
|
215 | 245 |
@Override |
216 | 246 |
public String getSQLToRetrievePrimaryKeysFromInformationSchema() throws SQLException { |
217 | 247 |
JDBCSQLBuilderBase sqlbuilder = this.createSQLBuilder(); |
218 |
ExpressionBuilder expbuilder = sqlbuilder.expression(); |
|
219 |
|
|
220 |
sqlbuilder.select().column().name("COLUMN_LIST"); |
|
221 |
sqlbuilder.select().column().name("CONSTRAINT_TYPE"); |
|
222 |
sqlbuilder.select().from().table().schema("INFORMATION_SCHEMA").name("CONSTRAINTS"); |
|
223 |
sqlbuilder.select().where().set( |
|
224 |
expbuilder.like( |
|
225 |
expbuilder.column("TABLE_NAME"), |
|
226 |
expbuilder.constant(table.getTable()) |
|
227 |
) |
|
228 |
); |
|
229 |
if( table.hasSchema() ) { |
|
230 |
sqlbuilder.select().where().and( |
|
231 |
expbuilder.like( |
|
232 |
expbuilder.column("TABLE_SCHEMA"), |
|
233 |
expbuilder.constant(table.getSchema()) |
|
234 |
) |
|
235 |
); |
|
236 |
} |
|
237 |
// if (catalog != null) { |
|
248 |
// ExpressionBuilder expbuilder = sqlbuilder.expression(); |
|
249 |
// |
|
250 |
// sqlbuilder.select().column().name("COLUMN_LIST"); |
|
251 |
// sqlbuilder.select().column().name("CONSTRAINT_TYPE"); |
|
252 |
// sqlbuilder.select().from().table().schema("INFORMATION_SCHEMA").name("CONSTRAINTS"); |
|
253 |
// sqlbuilder.select().where().set( |
|
254 |
// expbuilder.like( |
|
255 |
// expbuilder.column("TABLE_NAME"), |
|
256 |
// expbuilder.constant(table.getTable()) |
|
257 |
// ) |
|
258 |
// ); |
|
259 |
// if( table.hasSchema() ) { |
|
238 | 260 |
// sqlbuilder.select().where().and( |
239 | 261 |
// expbuilder.like( |
240 |
// expbuilder.column("CONSTRAINT_CATALOG"),
|
|
241 |
// expbuilder.constant(catalog)
|
|
262 |
// expbuilder.column("TABLE_SCHEMA"),
|
|
263 |
// expbuilder.constant(table.getSchema())
|
|
242 | 264 |
// ) |
243 | 265 |
// ); |
244 | 266 |
// } |
245 |
sqlbuilder.select().where().and( |
|
246 |
expbuilder.eq( |
|
247 |
expbuilder.column("CONSTRAINT_TYPE"), |
|
248 |
expbuilder.constant("PRIMARY KEY") |
|
249 |
) |
|
250 |
); |
|
267 |
//// if (catalog != null) { |
|
268 |
//// sqlbuilder.select().where().and( |
|
269 |
//// expbuilder.like( |
|
270 |
//// expbuilder.column("CONSTRAINT_CATALOG"), |
|
271 |
//// expbuilder.constant(catalog) |
|
272 |
//// ) |
|
273 |
//// ); |
|
274 |
//// } |
|
275 |
// sqlbuilder.select().where().and( |
|
276 |
// expbuilder.eq( |
|
277 |
// expbuilder.column("CONSTRAINT_TYPE"), |
|
278 |
// expbuilder.constant("PRIMARY KEY") |
|
279 |
// ) |
|
280 |
// ); |
|
251 | 281 |
return sqlbuilder.toString(); |
252 | 282 |
} |
253 | 283 |
|
284 |
protected EditableFeatureAttributeDescriptor getAttributeFromMetadata( |
|
285 |
EditableFeatureType type, |
|
286 |
Connection conn, |
|
287 |
ResultSetMetaData rsMetadata, |
|
288 |
int colIndex |
|
289 |
) throws SQLException { |
|
290 |
int dataType = this.getDataTypeFromMetadata(rsMetadata, colIndex); |
|
291 |
if (dataType == DataTypes.DECIMAL && |
|
292 |
rsMetadata.getPrecision(colIndex)==19 && |
|
293 |
rsMetadata.getScale(colIndex)== 0) { |
|
294 |
dataType = DataTypes.LONG; |
|
295 |
} |
|
296 |
|
|
297 |
EditableFeatureAttributeDescriptor attr = type.add( |
|
298 |
rsMetadata.getColumnName(colIndex), |
|
299 |
dataType |
|
300 |
); |
|
301 |
attr.setAllowNull( |
|
302 |
rsMetadata.isNullable(colIndex) == ResultSetMetaData.columnNullable |
|
303 |
); |
|
304 |
attr.setIsAutomatic(rsMetadata.isAutoIncrement(colIndex)); |
|
305 |
attr.setIsReadOnly(rsMetadata.isReadOnly(colIndex)); |
|
306 |
switch(attr.getType()) { |
|
307 |
case DataTypes.BOOLEAN: |
|
308 |
attr.setAllowNull(false); |
|
309 |
break; |
|
310 |
case DataTypes.STRING: |
|
311 |
attr.setSize(rsMetadata.getPrecision(colIndex)); |
|
312 |
attr.setPrecision(DataType.PRECISION_NONE); |
|
313 |
attr.setScale(DataType.SCALE_NONE); |
|
314 |
break; |
|
315 |
case DataTypes.BYTE: |
|
316 |
attr.setRequiredBytes(rsMetadata.getColumnDisplaySize(colIndex)); |
|
317 |
attr.setPrecision(DataType.BYTE_DEFAULT_PRECISION); |
|
318 |
attr.setScale(DataType.SCALE_NONE); |
|
319 |
break; |
|
320 |
case DataTypes.INT: |
|
321 |
attr.setRequiredBytes(rsMetadata.getColumnDisplaySize(colIndex)); |
|
322 |
attr.setPrecision(DataType.INT_DEFAULT_PRECISION); |
|
323 |
attr.setScale(DataType.SCALE_NONE); |
|
324 |
break; |
|
325 |
case DataTypes.LONG: |
|
326 |
attr.setRequiredBytes(rsMetadata.getColumnDisplaySize(colIndex)); |
|
327 |
attr.setPrecision(DataType.LONG_DEFAULT_PRECISION); |
|
328 |
attr.setScale(DataType.SCALE_NONE); |
|
329 |
break; |
|
330 |
case DataTypes.FLOAT: |
|
331 |
attr.setRequiredBytes(rsMetadata.getColumnDisplaySize(colIndex)); |
|
332 |
attr.setPrecision(DataType.FLOAT_DEFAULT_PRECISION); |
|
333 |
attr.setScale(DataType.SCALE_NONE); |
|
334 |
break; |
|
335 |
case DataTypes.DOUBLE: |
|
336 |
attr.setRequiredBytes(rsMetadata.getColumnDisplaySize(colIndex)); |
|
337 |
attr.setPrecision(DataType.DOUBLE_DEFAULT_PRECISION); |
|
338 |
attr.setScale(DataType.SCALE_NONE); |
|
339 |
break; |
|
340 |
case DataTypes.DECIMAL: |
|
341 |
attr.setRequiredBytes(rsMetadata.getColumnDisplaySize(colIndex)); |
|
342 |
attr.setScale(rsMetadata.getScale(colIndex)); |
|
343 |
attr.setPrecision(rsMetadata.getPrecision(colIndex)); |
|
344 |
break; |
|
345 |
case DataTypes.OBJECT: |
|
346 |
attr.setAdditionalInfo( |
|
347 |
"SQLType", |
|
348 |
rsMetadata.getColumnType(colIndex) |
|
349 |
); |
|
350 |
attr.setAdditionalInfo( |
|
351 |
"SQLTypeName", |
|
352 |
rsMetadata.getColumnTypeName(colIndex) |
|
353 |
); |
|
354 |
break; |
|
355 |
case DataTypes.GEOMETRY: |
|
356 |
this.fetchGeometryTypeAndSRS(attr, rsMetadata, colIndex); |
|
357 |
break; |
|
358 |
} |
|
359 |
return attr; |
|
360 |
} |
|
254 | 361 |
|
362 |
@Override |
|
363 |
protected int getDataTypeFromMetadata( |
|
364 |
ResultSetMetaData rsMetadata, |
|
365 |
int colIndex |
|
366 |
) throws SQLException { |
|
367 |
|
|
368 |
switch (rsMetadata.getColumnType(colIndex)) { |
|
369 |
|
|
370 |
case java.sql.Types.NUMERIC: |
|
371 |
case java.sql.Types.DECIMAL: |
|
372 |
if (rsMetadata.getPrecision(colIndex)==19 && rsMetadata.getScale(colIndex)== 0) { |
|
373 |
return DataTypes.LONG; |
|
374 |
} |
|
375 |
return DataTypes.DECIMAL; |
|
376 |
} |
|
377 |
return super.getDataTypeFromMetadata(rsMetadata, colIndex); |
|
378 |
} |
|
255 | 379 |
} |
Also available in: Unified diff