Statistics
| Revision:

gvsig-mssqlserver / trunk / org.gvsig.mssqlserver / org.gvsig.mssqlserver.provider / src / main / java / org / gvsig / mssqlserver / dal / operations / MSSQLServerFetchFeatureTypeOperation.java @ 76

History | View | Annotate | Download (4.09 KB)

1
package org.gvsig.mssqlserver.dal.operations;
2

    
3
import java.sql.Connection;
4
import java.sql.ResultSet;
5
import java.sql.ResultSetMetaData;
6
import java.sql.Statement;
7
import java.util.List;
8
import org.cresques.cts.IProjection;
9
import org.gvsig.fmap.dal.exception.DataException;
10
import org.gvsig.fmap.dal.feature.EditableFeatureAttributeDescriptor;
11
import org.gvsig.fmap.dal.feature.EditableFeatureType;
12
import org.gvsig.fmap.dal.store.jdbc2.JDBCHelper;
13
import org.gvsig.fmap.dal.store.jdbc2.JDBCUtils;
14
import org.gvsig.fmap.dal.store.jdbc2.spi.JDBCSQLBuilderBase;
15
import org.gvsig.fmap.dal.store.jdbc2.spi.operations.FetchFeatureTypeOperation;
16
import org.gvsig.fmap.geom.Geometry;
17
import org.gvsig.fmap.geom.GeometryLocator;
18
import org.gvsig.fmap.geom.type.GeometryType;
19
import org.gvsig.mssqlserver.dal.MSSQLServerHelper;
20

    
21
public class MSSQLServerFetchFeatureTypeOperation extends FetchFeatureTypeOperation {
22

    
23
    public MSSQLServerFetchFeatureTypeOperation(
24
            JDBCHelper helper
25
    ) {
26
        super(helper);
27
    }
28

    
29
    public MSSQLServerFetchFeatureTypeOperation(
30
            JDBCHelper helper,
31
            EditableFeatureType featureType,
32
            String dbname,
33
            String schema,
34
            String table,
35
            List<String> primaryKeys,
36
            String defaultGeometryColumn,
37
            IProjection crs
38
    ) {
39
        super(helper, featureType, dbname, schema, table, primaryKeys, defaultGeometryColumn, crs);
40
    }
41

    
42
    @Override
43
    public void fetch(EditableFeatureType featureType, Connection conn, String dbname, String schema, String table, List<String> pks, String defaultGeometryColumn, IProjection crs) throws DataException {
44
        super.fetch(featureType, conn, dbname, schema, table, pks, defaultGeometryColumn, crs);
45
        ((MSSQLServerHelper) this.helper).setLastUsedFeatureType(featureType);
46
    }
47

    
48
    @Override
49
    protected void fetchGeometryTypeAndSRS(
50
            EditableFeatureAttributeDescriptor attr,
51
            ResultSetMetaData rsMetadata,
52
            int colIndex
53
    ) {
54
        try {
55
            GeometryType geomType = GeometryLocator.getGeometryManager().getGeometryType(
56
                    Geometry.TYPES.GEOMETRY,
57
                    Geometry.SUBTYPES.GEOM2D
58
            );
59
            attr.setGeometryType(geomType);
60

    
61
            String typeName = rsMetadata.getColumnTypeName(colIndex);
62
            attr.setAdditionalInfo("SQLServer_type_name", typeName);
63
            attr.setSRS(getProjectionOfColumn(attr.getName()));
64
        } catch (Exception ex) {
65
            logger.warn("Can't get default geometry type.", ex);
66
        }
67
    }
68
    
69
    private IProjection getProjectionOfColumn(String columnName) {
70
       
71
        JDBCSQLBuilderBase sqlbuilder = this.createSQLBuilder();
72
        sqlbuilder.select().limit(1);
73
        sqlbuilder.select().column().value(
74
                sqlbuilder.ST_SRID(sqlbuilder.column(columnName))
75
        );
76
        sqlbuilder.select().where().set(
77
                sqlbuilder.and(
78
                        sqlbuilder.notIsNull(sqlbuilder.column(columnName)),
79
                        sqlbuilder.notIsNull(sqlbuilder.ST_SRID(sqlbuilder.column(columnName)))
80
                )
81
        );
82
        sqlbuilder.select().from().table().schema(this.getSchema()).name(this.getTablename());
83
        Statement st = null;
84
        ResultSet rs = null;
85
        try {
86
            st = this.getConnection().createStatement();
87
            rs = JDBCUtils.executeQuery(st, sqlbuilder.toString());
88
            if (rs.next()) {
89
                int code = rs.getInt(1);
90
                try {
91
                    IProjection proj = this.helper.getProjectionFromDatabaseCode(String.valueOf(code));
92
                    return proj;
93
                } catch (Exception ex) {
94
                    logger.warn("Can't create projection from code '" + code + "'.", ex);
95
                }
96
            }
97
        } catch (Exception ex) {
98
            // Do nothing, return null
99
        } finally {
100
            JDBCUtils.closeQuietly(rs);
101
            JDBCUtils.closeQuietly(st);
102
        }
103
        return null;
104

    
105
    }
106
}