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

View differences:

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