Revision 226

View differences:

org.gvsig.oracle/tags/org.gvsig.oracle-2.0.28/org.gvsig.oracle.provider/src/main/resources/org/gvsig/oracle/dal/OracleMetadata.xml
1
<?xml version="1.0"?>
2
<definitions>
3
  <version>1.0.0</version>
4
  <classes>
5
    <class name="Oracle" namespace="Metadata">
6
      <extends>
7
      	<class name="JDBC2" namespace="Metadata"/>
8
      </extends>
9
      <description>Metadata of a Oracle store</description>
10
      <fields>
11
      </fields>
12
    </class>
13

  
14
  </classes>
15
</definitions>  
org.gvsig.oracle/tags/org.gvsig.oracle-2.0.28/org.gvsig.oracle.provider/src/main/resources/org/gvsig/oracle/dal/OracleParameters.xml
1
<?xml version="1.0"?>
2
<definitions>
3
  <version>1.0.0</version>
4
  <classes>
5
    <class name="OracleResourceParameters">
6
      <extends>
7
        <class>JDBC2ResourceParameters</class>
8
      </extends>
9
      <fields>
10
        <field name="JDBCDriverClass" type="string" mandatory="true"
11
          defaultValue="oracle.jdbc.driver.OracleDriver" group="Advanced">
12
          <description>JDBC Driver class</description>
13
        </field>
14
		<field name="port" type="integer" mandatory="false"
15
          defaultValue="1521" group="Connection">
16
          <description></description>
17
        </field>
18
        <field name="host" type="string" mandatory="false" 
19
            defaultValue="127.0.0.1" group="Connection">
20
          <description></description>
21
        </field>
22
      </fields>
23
    </class>
24

  
25
    <class name="OracleStoreParameters">
26
      <extends>
27
        <class>JDBC2StoreParameters</class>
28
        <class>OracleResourceParameters</class>
29
      </extends>
30
      <fields/>
31
    </class>
32

  
33
    <class name="OracleNewStoreParameters">
34
      <extends>
35
        <class>JDBC2NewStoreParameters</class>
36
        <class>OracleResourceParameters</class>
37
      </extends>
38
      <fields/>
39
    </class>
40

  
41

  
42
    <class name="OracleServerExplorerParameters">
43
      <extends>
44
        <class>OracleResourceParameters</class>
45
        <class>JDBC2ServerExplorerParameters</class>
46
      </extends>
47
      <fields/>
48
    </class>
49

  
50

  
51
  </classes>
52
</definitions>  
org.gvsig.oracle/tags/org.gvsig.oracle-2.0.28/org.gvsig.oracle.provider/src/main/resources/META-INF/services/org.gvsig.tools.library.Library
1
org.gvsig.oracle.dal.OracleLibrary
org.gvsig.oracle/tags/org.gvsig.oracle-2.0.28/org.gvsig.oracle.provider/src/main/java/org/gvsig/oracle/dal/OracleNewStoreParameters.java
1
/* gvSIG. Geographic Information System of the Valencian Government
2
 *
3
 * Copyright (C) 2007-2008 Infrastructures and Transports Department
4
 * of the Valencian Government (CIT)
5
 *
6
 * This program is free software; you can redistribute it and/or
7
 * modify it under the terms of the GNU General Public License
8
 * as published by the Free Software Foundation; either version 2
9
 * of the License, or (at your option) any later version.
10
 *
11
 * This program is distributed in the hope that it will be useful,
12
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
 * GNU General Public License for more details.
15
 *
16
 * You should have received a copy of the GNU General Public License
17
 * along with this program; if not, write to the Free Software
18
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
19
 * MA  02110-1301, USA.
20
 *
21
 */
22
package org.gvsig.oracle.dal;
23

  
24
import org.gvsig.fmap.dal.exception.ValidateDataParametersException;
25
import org.gvsig.fmap.dal.store.jdbc.JDBCNewStoreParameters;
26

  
27
public class OracleNewStoreParameters 
28
    extends 
29
        JDBCNewStoreParameters 
30
    implements 
31
        OracleConnectionParameters 
32
    {
33

  
34
    private final OracleConnectionParametersHelper helper;
35
    
36
    public OracleNewStoreParameters() {
37
        super(
38
            OracleLibrary.NAME + "NewStoreParameters", 
39
            OracleLibrary.NAME
40
        );
41
        this.helper = new OracleConnectionParametersHelper(this);
42
    }
43

  
44
    @Override
45
    public String getUrl() {
46
        return this.helper.getUrl();
47
    }
48
    
49
    @Override
50
    public void validate() throws ValidateDataParametersException {
51
        this.helper.validate();
52
    }
53

  
54
    @Override
55
    public void setTable(String table) {
56
        super.setTable(table.toUpperCase());
57
    }
58

  
59
}
org.gvsig.oracle/tags/org.gvsig.oracle-2.0.28/org.gvsig.oracle.provider/src/main/java/org/gvsig/oracle/dal/operations/OracleOperationsFactory.java
1

  
2
package org.gvsig.oracle.dal.operations;
3

  
4
import java.util.Iterator;
5
import java.util.List;
6
import org.apache.commons.lang3.tuple.Pair;
7

  
8
import org.cresques.cts.IProjection;
9
import org.gvsig.fmap.dal.SQLBuilder;
10
import org.gvsig.fmap.dal.exception.DataException;
11
import org.gvsig.fmap.dal.feature.EditableFeatureType;
12
import org.gvsig.fmap.dal.feature.FeatureType;
13
import org.gvsig.fmap.dal.store.jdbc.JDBCServerExplorerParameters;
14
import org.gvsig.fmap.dal.store.jdbc.JDBCStoreParameters;
15
import org.gvsig.fmap.dal.store.jdbc2.JDBCHelper;
16
import org.gvsig.fmap.dal.store.jdbc2.spi.operations.AppendOperation;
17
import org.gvsig.fmap.dal.store.jdbc2.spi.operations.CalculateEnvelopeOfColumnOperation;
18
import org.gvsig.fmap.dal.store.jdbc2.spi.operations.CanModifyTableOperation;
19
import org.gvsig.fmap.dal.store.jdbc2.spi.operations.CreateTableOperation;
20
import org.gvsig.fmap.dal.store.jdbc2.spi.operations.DropTableOperation;
21
import org.gvsig.fmap.dal.store.jdbc2.spi.operations.FetchFeatureTypeOperation;
22
import org.gvsig.fmap.dal.store.jdbc2.spi.operations.ListTablesOperation;
23
import org.gvsig.fmap.dal.store.jdbc2.spi.operations.OperationsFactoryBase;
24
import org.gvsig.fmap.dal.store.jdbc2.spi.operations.PerformChangesOperation;
25
import org.gvsig.fmap.geom.primitive.Envelope;
26

  
27

  
28
public class OracleOperationsFactory extends OperationsFactoryBase {
29
    
30
    public OracleOperationsFactory(JDBCHelper helper) {
31
        super(helper);
32
    }
33

  
34
    @Override
35
    public FetchFeatureTypeOperation createFetchFeatureType(EditableFeatureType type, TableReference table, List<String> primaryKeys, String defaultGeometryField, IProjection crs) {
36
        return new OracleFetchFeatureTypeOperation(
37
                helper, type, table, primaryKeys, 
38
                defaultGeometryField, crs
39
        );
40
    }
41
    
42
    @Override
43
    public CanModifyTableOperation createCanModifyTableOperation(
44
            TableReference table
45
        ) {
46
        return new OracleCanModifyTableOperation(helper, table);
47
    }
48
    
49
    @Override
50
    public ListTablesOperation createListTables(
51
            int mode,
52
            JDBCServerExplorerParameters baseParameters, 
53
            boolean informationTables
54
        ) {
55
        return new OracleListTablesOperation(
56
                helper, mode, baseParameters, informationTables );
57
    }
58
    
59
    @Override
60
    public PerformChangesOperation createPerformChanges(TableReference table, FeatureType type,
61
    		Iterator deleteds, Iterator inserteds, Iterator updateds, Iterator featureTypesChanged) {
62
    	return new OraclePerformChangesOperation(helper, table, type, 
63
                deleteds, inserteds, updateds, featureTypesChanged);
64
    }
65
    
66
    @Override
67
    public AppendOperation createAppend(TableReference table, FeatureType type) {
68
    	return new OracleAppendOperation(helper, table, type);
69
    }
70
    
71
    @Override
72
    public DropTableOperation createDropTable(TableReference table) {
73
    	return new OracleDropTableOperation(helper, table);
74
    }
75

  
76
    @Override
77
    public CreateTableOperation createTable(TableReference table, FeatureType type, List<Pair<String, SQLBuilder.Privilege>> userAndPrivileges, List<String> additionalSQLs) throws DataException {
78
        return new OracleCreateTableOperation(helper, table, type, userAndPrivileges, additionalSQLs);
79
    }
80

  
81
    @Override
82
    public CalculateEnvelopeOfColumnOperation createCalculateEnvelopeOfColumn(FeatureType featureType, TableReference table, String columnName, String baseFilter, Envelope workingArea, IProjection crs) {
83
        return new OracleCalculateEnvelopeOfColumnOperation(helper, featureType, table, columnName, baseFilter, workingArea, crs);
84
    }
85

  
86
}
org.gvsig.oracle/tags/org.gvsig.oracle-2.0.28/org.gvsig.oracle.provider/src/main/java/org/gvsig/oracle/dal/operations/OracleCreateTableOperation.java
1
/*
2
 * To change this license header, choose License Headers in Project Properties.
3
 * To change this template file, choose Tools | Templates
4
 * and open the template in the editor.
5
 */
6
package org.gvsig.oracle.dal.operations;
7

  
8
import java.sql.Connection;
9
import java.util.List;
10
import org.apache.commons.lang3.StringUtils;
11
import org.apache.commons.lang3.tuple.Pair;
12
import org.gvsig.fmap.dal.SQLBuilder;
13
import org.gvsig.fmap.dal.exception.DataException;
14
import org.gvsig.fmap.dal.feature.EditableFeatureAttributeDescriptor;
15
import org.gvsig.fmap.dal.feature.EditableFeatureType;
16
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
17
import org.gvsig.fmap.dal.feature.FeatureType;
18
import org.gvsig.fmap.dal.store.jdbc2.JDBCHelper;
19
import org.gvsig.fmap.dal.store.jdbc2.OperationsFactory;
20
import org.gvsig.fmap.dal.store.jdbc2.spi.operations.CreateTableOperation;
21

  
22
/**
23
 *
24
 * @author fdiaz
25
 */
26
public class OracleCreateTableOperation extends CreateTableOperation{
27

  
28
    public OracleCreateTableOperation(JDBCHelper helper) {
29
        super(helper);
30
    }
31
    
32
    public OracleCreateTableOperation(JDBCHelper helper, OperationsFactory.TableReference table, FeatureType type, List<Pair<String, SQLBuilder.Privilege>> userAndPrivileges, List<String> additionalSQLs) {
33
        super(helper, table, type, userAndPrivileges, additionalSQLs);
34
        EditableFeatureType editableType = this.type.getEditable();
35
        boolean changed = false;
36
        for (FeatureAttributeDescriptor attr : editableType) {
37
            if( attr.getType()==org.gvsig.fmap.dal.DataTypes.GEOMETRY ) {
38
                if(!StringUtils.isAllUpperCase(attr.getName())) {
39
                    ((EditableFeatureAttributeDescriptor)attr).setName(attr.getName().toUpperCase());
40
                    changed = true;
41
                }
42
            }
43
        }
44
        
45
        if(changed){
46
            if(this.type instanceof EditableFeatureType){
47
                this.type = editableType.getCopy();
48
            } else {
49
                this.type = editableType.getNotEditableCopy();
50
            }
51
        }
52

  
53
    }
54

  
55
    @Override
56
    public boolean performCreateTable(Connection conn) throws DataException {
57
        boolean result = super.performCreateTable(conn);
58
        if(result) {
59
            updateSpatialIndexAndMetadata();
60
        }
61
        return result;
62
    }
63

  
64

  
65
    public void updateSpatialIndexAndMetadata() {
66
    	OracleUpdateSpatialIndexAndMetadata updateIdxOperation = 
67
        		new OracleUpdateSpatialIndexAndMetadata(this.helper,
68
        				this.table.getDatabase(),
69
        				this.table.getSchema(),
70
        				this.table.getTable().toUpperCase(),
71
        				this.type
72
        		);
73
        try {
74
            updateIdxOperation.execute();
75
        } catch (Exception e) {
76
            LOGGER.warn("Error creating/updating the spatial index", e);
77
        }
78
    }
79
    
80
}
org.gvsig.oracle/tags/org.gvsig.oracle-2.0.28/org.gvsig.oracle.provider/src/main/java/org/gvsig/oracle/dal/operations/OracleUpdateSpatialIndexAndMetadata.java
1
package org.gvsig.oracle.dal.operations;
2

  
3
import java.sql.Connection;
4
import java.sql.PreparedStatement;
5
import java.sql.ResultSet;
6
import java.sql.SQLException;
7
import java.sql.Statement;
8
import java.text.MessageFormat;
9
import java.util.ArrayList;
10
import java.util.List;
11
import java.util.Locale;
12

  
13
import org.cresques.cts.IProjection;
14
import org.gvsig.fmap.dal.SQLBuilder;
15
import org.gvsig.fmap.dal.exception.DataException;
16
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
17
import org.gvsig.fmap.dal.feature.FeatureType;
18
import org.gvsig.fmap.dal.resource.exception.AccessResourceException;
19
import org.gvsig.fmap.dal.store.jdbc2.JDBCHelper;
20
import org.gvsig.fmap.dal.store.jdbc2.JDBCUtils;
21
import org.gvsig.fmap.dal.store.jdbc2.spi.operations.CalculateEnvelopeOfColumnOperation;
22
import org.gvsig.fmap.geom.Geometry;
23
import org.gvsig.fmap.geom.GeometryLocator;
24
import org.gvsig.fmap.geom.primitive.Envelope;
25
import org.gvsig.fmap.geom.primitive.Point;
26
import org.gvsig.oracle.dal.GeometryTypeUtils;
27
import org.gvsig.oracle.dal.SpatialIndexUtils;
28
import org.slf4j.Logger;
29
import org.slf4j.LoggerFactory;
30

  
31
/**
32
 * Updates the layer extent on table USER_SDO_GEOM_METADATA and rebuild the
33
 * SpatialIndex.
34
 *
35
 * The metadata record is inserted if not existing. The SpatialIndex is also
36
 * created if not existing.
37
 *
38
 * @author Cesar Martinez Izquierdo
39
 *
40
 */
41
@SuppressWarnings("UseSpecificCatch")
42
public class OracleUpdateSpatialIndexAndMetadata {
43

  
44
    private static final Logger LOGGER = LoggerFactory.getLogger(OracleUpdateSpatialIndexAndMetadata.class);
45

  
46
    protected static final double XTOLERANCE = 0.00001;
47
    protected static final double YTOLERANCE = 0.00001;
48

  
49
    protected final JDBCHelper helper;
50
    protected final String database;
51
    protected final String schema;
52
    protected final String table;
53
    protected final FeatureType featureType;
54
    private static final String[] DEFAULT_DIM_NAMES = new String[]{"x", "y", "z", "m"};
55
    private Connection connection = null;
56

  
57
    public OracleUpdateSpatialIndexAndMetadata(
58
            JDBCHelper helper,
59
            String database,
60
            String schema,
61
            String table,
62
            FeatureType featureType) {
63
        this.helper = helper;
64
        this.database = database;
65
        this.schema = schema;
66
        this.table = table;
67
        this.featureType = featureType;
68
    }
69

  
70
    public void begin() throws AccessResourceException {
71
        this.connection = this.helper.getConnectionWritable();
72
    }
73

  
74
    protected void clean() {
75
        this.helper.closeConnection(this.connection);
76
        this.connection = null;
77
    }
78

  
79
    /**
80
     * Executes the operation
81
     *
82
     * @throws DataException
83
     */
84
    public void execute() throws DataException {
85
        begin();
86
        FeatureAttributeDescriptor geomDescriptor = featureType.getDefaultGeometryAttribute();
87

  
88
        if(geomDescriptor != null){
89
            // Inserting/updating SRID, dimensions and extent on USER_SDO_GEOM_METADATA.
90
            // The layer metadata entry MUST exist before creating the spatial index.
91
            if (updateOrInsertMetadata(geomDescriptor)) {
92
                // We will only create/rebuild the index if metadata table has been changed (updated/inserted)
93
                createOrRebuildSpatialIndex(geomDescriptor);
94
            }
95
        }
96
        clean();
97
    }
98
    
99
    /**
100
     * Updates the USER_SDO_GEOM_METADATA table or inserts if an entry is not
101
     * found for the layer. The update is only performed if the new layer extent
102
     * is bigger than current one.
103
     *
104
     * @param geomDescriptor
105
     * @return true if the metadata table was changed, false otherwise
106
     */
107
    public boolean updateOrInsertMetadata(FeatureAttributeDescriptor geomDescriptor) {
108
        String geomColumnName = geomDescriptor.getName();
109
        IProjection crs = geomDescriptor.getSRS();
110

  
111
        CalculateEnvelopeOfColumnOperation envelopeOp = null;
112
        List<OracleDimensionMetadata> dimensions = fetchDimensionMetadata();
113
        
114
            envelopeOp = helper.getOperations().
115
                    createCalculateEnvelopeOfColumn(
116
                            featureType,
117
                            helper.getOperations().createTableReference(database, schema, table, null),
118
                            geomColumnName,
119
                            "",
120
                            null,
121
                            crs
122
                    );
123

  
124
        Envelope layerEnvelope = (Envelope) envelopeOp.perform();
125
        if(layerEnvelope != null){
126
            layerEnvelope.setProjectionIffNull(crs);
127
            SQLBuilder builder = helper.createSQLBuilder();
128

  
129
            int srid = (int) builder.srs_id(crs);
130

  
131
            if (schema.equalsIgnoreCase(helper.getConnectionParameters().getUser())) {
132
                if (dimensions.size() > 0) {
133
                    if (updateDimensions(dimensions, layerEnvelope)) {
134
                        return updateUserMetadata(dimensions, geomColumnName, srid);
135
                    }
136
                } else {
137
                    return insertUserMetadata(getDefaultDimensions(layerEnvelope), geomColumnName, srid);
138
                }
139
            } else {
140
                // FIXME: try inserting on global table MDSYS.SDO_GEOM_METADATA_TABLE
141
            }
142
        }
143
        return false;
144
    }
145

  
146
    /**
147
     * Updates layer metatada on USER_SDO_GEOM_METADATA table
148
     *
149
     * @param dimensions
150
     * @param geomColumnName
151
     * @param srid
152
     * @return Returns true if the layer record exists on the table and has been
153
     * correctly updated, false otherwise
154
     */
155
    public boolean updateUserMetadata(List<OracleDimensionMetadata> dimensions, String geomColumnName, int srid) {
156
        StringBuilder sdoMetadataUpdateQuery = new StringBuilder();
157
        sdoMetadataUpdateQuery.append("UPDATE USER_SDO_GEOM_METADATA SET DIMINFO = SDO_DIM_ARRAY(");
158
        for (int i = 0; i < dimensions.size(); i++) {
159
            if (i == 0) {
160
                sdoMetadataUpdateQuery.append("SDO_DIM_ELEMENT(?, ?, ?, ?)");
161
            } else {
162
                sdoMetadataUpdateQuery.append(",SDO_DIM_ELEMENT(?, ?, ?, ?)");
163
            }
164
        }
165
        sdoMetadataUpdateQuery.append("), SRID=? WHERE TABLE_NAME=? AND COLUMN_NAME=?");
166
        PreparedStatement st = null;
167
        try {
168
            String sql = sdoMetadataUpdateQuery.toString();
169
            st = connection.prepareStatement(sql);
170
            int paramCount = 1;
171
            for (OracleDimensionMetadata dim : dimensions) {
172
                st.setString(paramCount++, dim.getName());
173
                st.setDouble(paramCount++, dim.getLowerBound());
174
                st.setDouble(paramCount++, dim.getUpperBound());
175
                st.setDouble(paramCount++, dim.getTolerance());
176
            }
177
            st.setInt(paramCount++, srid);
178
            st.setString(paramCount++, table);
179
            st.setString(paramCount++, geomColumnName);
180
            int updatedRows = JDBCUtils.executeUpdate(st, sql);
181
            return (updatedRows > 0);
182
        } catch (SQLException ex) {
183
            throw new RuntimeException("Can't update layer metadata on USER_SDO_GEOM_METADATA", ex);
184
        } finally {
185
            JDBCUtils.closeQuietly(st);
186
        }
187
    }
188

  
189
    /**
190
     * Inserts layer metatada on USER_SDO_GEOM_METADATA table
191
     *
192
     * @param dimensions
193
     * @param geomColumnName
194
     * @param srid
195
     * @return Returns true if the layer record has been correctly inserted,
196
     * false otherwise
197
     */
198
    public boolean insertUserMetadata(List<OracleDimensionMetadata> dimensions, String geomColumnName, int srid) {
199
        StringBuilder sdoMetadataUpdateQuery = new StringBuilder();
200
        sdoMetadataUpdateQuery.append("INSERT INTO USER_SDO_GEOM_METADATA (TABLE_NAME, COLUMN_NAME, SRID, DIMINFO)");
201
        sdoMetadataUpdateQuery.append(" VALUES ('");
202
        sdoMetadataUpdateQuery.append(table);
203
        sdoMetadataUpdateQuery.append("', '");
204
        sdoMetadataUpdateQuery.append(geomColumnName);
205
        sdoMetadataUpdateQuery.append("', ");
206
        sdoMetadataUpdateQuery.append(srid);
207
        sdoMetadataUpdateQuery.append(", SDO_DIM_ARRAY(");
208
        for (int i = 0; i < dimensions.size(); i++) {
209
            if (i != 0) {
210
                sdoMetadataUpdateQuery.append(",");
211
            }
212

  
213
            sdoMetadataUpdateQuery.append("SDO_DIM_ELEMENT('");
214
            OracleDimensionMetadata dim = dimensions.get(i);
215
            sdoMetadataUpdateQuery.append(dim.getName());
216
            sdoMetadataUpdateQuery.append("', ");
217
            sdoMetadataUpdateQuery.append(String.format(Locale.ENGLISH, "%f", dim.getLowerBound()));
218
            sdoMetadataUpdateQuery.append(", ");
219
            sdoMetadataUpdateQuery.append(String.format(Locale.ENGLISH, "%f", dim.getUpperBound()));
220
            sdoMetadataUpdateQuery.append(", ");
221
            sdoMetadataUpdateQuery.append(String.format(Locale.ENGLISH, "%f", dim.getTolerance()));
222
            sdoMetadataUpdateQuery.append(")");
223
        }
224
        sdoMetadataUpdateQuery.append("))");
225

  
226
        Statement st = null;
227
        String sql = sdoMetadataUpdateQuery.toString();
228
        try {
229
            st = connection.createStatement();
230
            int insertedRows = JDBCUtils.executeUpdate(st, sql);
231
            return (insertedRows > 0);
232
        } catch (SQLException ex) {
233
            throw new RuntimeException("Can't insert layer metadata on USER_SDO_GEOM_METADATA", ex);
234

  
235
        } finally {
236
            JDBCUtils.closeQuietly(st);
237
        }
238
    }
239

  
240
    /**
241
     * Gets the default layer dimensions.
242
     *
243
     * @param layerEnvelope
244
     * @return
245
     */
246
    protected List<OracleDimensionMetadata> getDefaultDimensions(Envelope layerEnvelope) {
247
        List<OracleDimensionMetadata> dimensions = new ArrayList<>();
248
        if(layerEnvelope != null){
249
            for (int i = 0; i < DEFAULT_DIM_NAMES.length && i < layerEnvelope.getDimension(); i++) {
250
                dimensions.add(new OracleDimensionMetadata(DEFAULT_DIM_NAMES[i], layerEnvelope.getMinimum(i), layerEnvelope.getMaximum(i), XTOLERANCE));
251
            }
252
        }
253
        return dimensions;
254
    }
255

  
256
    protected Envelope getEnvelope(List<OracleDimensionMetadata> dimensions) {
257
        Envelope envelope;
258
        try {
259
            int subType = GeometryTypeUtils.getSubType(dimensions.size());
260
            Point lowerCorner = (Point) GeometryLocator.getGeometryManager().create(Geometry.TYPES.POINT, subType);
261
            Point upperCorner = (Point) GeometryLocator.getGeometryManager().create(Geometry.TYPES.POINT, subType);
262

  
263
            for (int i = 0; i < dimensions.size() && i < lowerCorner.getDimension(); i++) {
264
                lowerCorner.setCoordinateAt(i, dimensions.get(i).getLowerBound());
265
                upperCorner.setCoordinateAt(i, dimensions.get(i).getUpperBound());
266
            }
267

  
268
            envelope = GeometryLocator.getGeometryManager().createEnvelope(subType);
269
            envelope.setLowerCorner(lowerCorner);
270
            envelope.setUpperCorner(upperCorner);
271
            return envelope;
272
        } catch (Exception e) {
273
        }
274
        return null;
275
    }
276

  
277
    /**
278
     * Updates the dimension definition using the provided envelope. The update
279
     * is only performed if the new layer extent is bigger than the one defined
280
     * on dimension metadata.
281
     *
282
     * @param dimensions
283
     * @param newEnvelope
284
     * @return true if the definition was updated, false otherwise
285
     */
286
    protected boolean updateDimensions(
287
            List<OracleDimensionMetadata> dimensions,
288
            Envelope newEnvelope) {
289
        Envelope oldEnvelope = getEnvelope(dimensions);
290
        if (oldEnvelope == null || oldEnvelope.contains(newEnvelope)) {
291
            return false;
292
        }
293
        for (int i = 0; i < dimensions.size(); i++) {
294
            OracleDimensionMetadata dim = dimensions.get(i);
295
            dim.setLowerBound(newEnvelope.getMinimum(i));
296
            dim.setUpperBound(newEnvelope.getMaximum(i));
297
        }
298
        return true;
299
    }
300

  
301
    /**
302
     * Fetches dimensions from ALL_SDO_GEOM_METADATA table and updates the layer
303
     * envelope using the provided one
304
     *
305
     * @return
306
     */
307
    protected List<OracleDimensionMetadata> fetchDimensionMetadata() {
308
        String sdoMetadataGetTolerance = "SELECT dinfo.SDO_DIMNAME, dinfo.SDO_LB, dinfo.SDO_UB, dinfo.SDO_TOLERANCE "
309
                + "FROM MDSYS.ALL_SDO_GEOM_METADATA, TABLE(DIMINFO) dinfo "
310
                + "WHERE OWNER = ? AND TABLE_NAME = ?";
311

  
312
        ResultSet rs = null;
313
        List<OracleDimensionMetadata> dimensions = new ArrayList<>();
314
        PreparedStatement st = null;
315

  
316
        try {
317
            st = connection.prepareStatement(sdoMetadataGetTolerance);
318
            st.setString(1, schema);
319
            st.setString(2, table);
320
            rs = JDBCUtils.executeQuery(st, sdoMetadataGetTolerance);
321

  
322
            while (rs.next()) {
323
                OracleDimensionMetadata dim = new OracleDimensionMetadata(
324
                        rs.getString(1),
325
                        rs.getDouble(2),
326
                        rs.getDouble(3),
327
                        rs.getDouble(4));
328
                dimensions.add(dim);
329
            }
330
        } catch (Exception ex) {
331
            LOGGER.debug("Error getting dimensions (ALL_SDO_GEOM_METADATA).", ex);
332
        } finally {
333
            JDBCUtils.closeQuietly(rs);
334
            JDBCUtils.closeQuietly(st);
335
        }
336
        
337
        if(dimensions.isEmpty()){
338

  
339
            sdoMetadataGetTolerance = "SELECT dinfo.SDO_DIMNAME, dinfo.SDO_LB, dinfo.SDO_UB, dinfo.SDO_TOLERANCE "
340
                + "FROM MDSYS.USER_SDO_GEOM_METADATA, TABLE(DIMINFO) dinfo "
341
                + "WHERE TABLE_NAME = ?";
342

  
343
            rs = null;
344
            st = null;
345

  
346
            try {
347
                st = connection.prepareStatement(sdoMetadataGetTolerance);
348
                st.setString(1, table);
349
                rs = JDBCUtils.executeQuery(st, sdoMetadataGetTolerance);
350

  
351
                while (rs.next()) {
352
                    OracleDimensionMetadata dim = new OracleDimensionMetadata(
353
                            rs.getString(1),
354
                            rs.getDouble(2),
355
                            rs.getDouble(3),
356
                            rs.getDouble(4));
357
                    dimensions.add(dim);
358
                }
359
            } catch (Exception ex) {
360
                LOGGER.debug("Error getting dimensions (USER_SDO_GEOM_METADATA).", ex);
361
            } finally {
362
                JDBCUtils.closeQuietly(rs);
363
                JDBCUtils.closeQuietly(st);
364
            }
365
        }
366

  
367
        return dimensions;
368
    }
369
    
370
    public void createOrRebuildSpatialIndex(FeatureAttributeDescriptor geomDescriptor) {
371
        int geomType = geomDescriptor.getGeomType().getType();
372
        String oracleGeomTypeName = GeometryTypeUtils.toOracleGeometryTypeName(geomType);
373
        String geomColumn = geomDescriptor.getName();
374
        String indexName = SpatialIndexUtils.getSpatialIndex(connection, schema, table, geomColumn);
375

  
376
        Statement st = null;
377
        String sql;
378
        if (indexName == null) {
379
            indexName = SpatialIndexUtils.getSpatialIndexName(table, geomColumn);
380

  
381
            String createIndexSql = "CREATE INDEX \"{0}\" ON \"{1}\" (\"{2}\") INDEXTYPE IS MDSYS.SPATIAL_INDEX PARAMETERS (''LAYER_GTYPE={3}'')"; // SDO_LEVEL=8
382

  
383
            sql = MessageFormat.format(
384
                    createIndexSql,
385
                    indexName,
386
                    table,
387
                    geomColumn,
388
                    oracleGeomTypeName
389
            );
390

  
391
            try {
392
                st = connection.createStatement();
393
                JDBCUtils.execute(st, sql);
394
            } catch (Exception ex) {
395
                LOGGER.debug("Error creating spatial index", ex);
396
            } finally {
397
                JDBCUtils.closeQuietly(st);
398
            }
399
        } else {
400
            String rebuildIndexSql = "ALTER INDEX \"{0}\" REBUILD PARAMETERS (''LAYER_GTYPE={1}'')";
401
            try {
402
                sql = MessageFormat.format(
403
                        rebuildIndexSql,
404
                        indexName,
405
                        oracleGeomTypeName
406
                );
407

  
408
                st = connection.createStatement();
409
                JDBCUtils.executeQuery(st, sql);
410
            } catch (Exception ex) {
411
                LOGGER.warn("Error rebuilding spatial index", ex);
412
            } finally {
413
                JDBCUtils.closeQuietly(st);
414
            }
415
        }
416
    }
417

  
418
    public class OracleDimensionMetadata {
419

  
420
        private String name;
421
        private double lb;
422
        private double ub;
423
        private double tolerance;
424

  
425
        public OracleDimensionMetadata(String name, double lb, double ub, double tolerance) {
426
            this.name = name;
427
            this.lb = lb;
428
            this.ub = ub;
429
            this.tolerance = tolerance;
430
        }
431

  
432
        public String getName() {
433
            return name;
434
        }
435

  
436
        public double getLowerBound() {
437
            return lb;
438
        }
439

  
440
        public double getUpperBound() {
441
            return ub;
442
        }
443

  
444
        public double getTolerance() {
445
            return tolerance;
446
        }
447

  
448
        public void setName(String name) {
449
            this.name = name;
450
        }
451

  
452
        public void setLowerBound(double lb) {
453
            this.lb = lb;
454
        }
455

  
456
        public void setUpperBound(double ub) {
457
            this.ub = ub;
458
        }
459

  
460
        public void setTolerance(double tolerance) {
461
            this.tolerance = tolerance;
462
        }
463
    }
464
}
org.gvsig.oracle/tags/org.gvsig.oracle-2.0.28/org.gvsig.oracle.provider/src/main/java/org/gvsig/oracle/dal/operations/OracleDropTableOperation.java
1
package org.gvsig.oracle.dal.operations;
2

  
3
import java.util.List;
4

  
5
import org.gvsig.fmap.dal.store.jdbc2.JDBCHelper;
6
import org.gvsig.fmap.dal.store.jdbc2.OperationsFactory.TableReference;
7
import org.gvsig.fmap.dal.store.jdbc2.spi.JDBCSQLBuilderBase;
8
import org.gvsig.fmap.dal.store.jdbc2.spi.operations.DropTableOperation;
9

  
10
public class OracleDropTableOperation extends DropTableOperation {
11

  
12
    public OracleDropTableOperation(JDBCHelper helper) {
13
            super(helper);
14
    }
15

  
16
    public OracleDropTableOperation(JDBCHelper helper, TableReference table) {
17
            super(helper, table);
18
    }
19

  
20
    public List<String> getSQLs() {
21
        JDBCSQLBuilderBase sqlbuilder = this.createSQLBuilder();
22
        sqlbuilder.drop_table().table()
23
                .database(this.table.getDatabase())
24
                .schema(this.table.getSchema())
25
                .name(this.table.getTable());
26
        List<String> sqls = sqlbuilder.drop_table().toStrings();
27

  
28
        StringBuilder builder = new StringBuilder();
29
        builder.append("DELETE FROM MDSYS.OGIS_GEOMETRY_COLUMNS WHERE F_TABLE_SCHEMA = '");
30
        builder.append(this.table.getSchema());
31
        builder.append("' AND F_TABLE_NAME = '");
32
        builder.append(this.table.getTable());
33
        builder.append("'");
34
        
35
        sqls.add(builder.toString());
36

  
37
        return sqls;
38
    }
39
    
40
    
41

  
42
}
org.gvsig.oracle/tags/org.gvsig.oracle-2.0.28/org.gvsig.oracle.provider/src/main/java/org/gvsig/oracle/dal/operations/OracleCalculateEnvelopeOfColumnOperation.java
1
/**
2
 * gvSIG. Desktop Geographic Information System.
3
 *
4
 * Copyright (C) 2007-2020 gvSIG Association.
5
 *
6
 * This program is free software; you can redistribute it and/or
7
 * modify it under the terms of the GNU General Public License
8
 * as published by the Free Software Foundation; either version 3
9
 * of the License, or (at your option) any later version.
10
 *
11
 * This program is distributed in the hope that it will be useful,
12
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
 * GNU General Public License for more details.
15
 *
16
 * You should have received a copy of the GNU General Public License
17
 * along with this program; if not, write to the Free Software
18
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
19
 * MA  02110-1301, USA.
20
 *
21
 * For any additional information, do not hesitate to contact us
22
 * at info AT gvsig.com, or visit our website www.gvsig.com.
23
 */
24
package org.gvsig.oracle.dal.operations;
25

  
26
import org.apache.commons.lang3.StringUtils;
27
import org.cresques.cts.IProjection;
28
import org.gvsig.fmap.dal.feature.FeatureType;
29
import org.gvsig.fmap.dal.store.jdbc2.JDBCHelper;
30
import org.gvsig.fmap.dal.store.jdbc2.OperationsFactory.TableReference;
31
import org.gvsig.fmap.dal.store.jdbc2.spi.operations.CalculateEnvelopeOfColumnOperation;
32
import org.gvsig.fmap.geom.primitive.Envelope;
33
import org.gvsig.oracle.dal.SpatialIndexUtils;
34

  
35
public class OracleCalculateEnvelopeOfColumnOperation extends CalculateEnvelopeOfColumnOperation {
36

  
37
    public OracleCalculateEnvelopeOfColumnOperation(
38
            JDBCHelper helper,
39
            FeatureType featureType,
40
            TableReference table,
41
            String columnName,
42
            String baseFilter,
43
            Envelope limit,
44
            IProjection crs
45
    ) {
46
        super(helper, featureType, table, columnName, baseFilter, limit, crs);
47
    }
48

  
49
    @Override
50
    public String getSQLWithAggregate() {
51
        if (StringUtils.isEmpty(baseFilter) && limit == null) {
52
            boolean validIndex = false;
53
            String indexName = SpatialIndexUtils.getSpatialIndex(conn, table.getSchema(), table.getTable(), columnName);
54
            if(!StringUtils.isBlank(indexName)){
55
                validIndex = SpatialIndexUtils.isValidSpatialIndex(conn, table.getTable());
56
            }
57

  
58
            if (validIndex) {
59
                StringBuilder builder = new StringBuilder();
60
                builder.append("SELECT SDO_TUNE.EXTENT_OF('");
61
                builder.append(table.getTable());
62
                builder.append("', '");
63
                builder.append(columnName);
64
                builder.append("').GET_WKB() FROM DUAL");
65
                return builder.toString();
66
            }
67
        }
68
        return super.getSQLWithAggregate();
69
    }
70
    
71
}
org.gvsig.oracle/tags/org.gvsig.oracle-2.0.28/org.gvsig.oracle.provider/src/main/java/org/gvsig/oracle/dal/operations/OracleCanModifyTableOperation.java
1
package org.gvsig.oracle.dal.operations;
2

  
3
import java.sql.Connection;
4
import java.sql.DatabaseMetaData;
5
import java.sql.ResultSet;
6
import java.sql.SQLException;
7

  
8
import org.gvsig.fmap.dal.exception.DataException;
9
import org.gvsig.fmap.dal.store.jdbc2.JDBCHelper;
10
import org.gvsig.fmap.dal.store.jdbc2.OperationsFactory.TableReference;
11
import org.gvsig.fmap.dal.store.jdbc2.spi.operations.CanModifyTableOperation;
12

  
13
public class OracleCanModifyTableOperation extends CanModifyTableOperation {
14

  
15
    public OracleCanModifyTableOperation(JDBCHelper helper) {
16
        super(helper);
17
    }
18

  
19
    public OracleCanModifyTableOperation(JDBCHelper helper, TableReference table) {
20
        super(helper, table);
21
    }
22

  
23
    @Override
24
    public boolean canModifyTable(Connection conn,
25
            TableReference table
26
    ) throws DataException {
27
        try {
28
            DatabaseMetaData metadata = conn.getMetaData();
29
            String user = helper.getConnectionParameters().getUser();
30
            if (table.getSchema()==null || table.getSchema().equalsIgnoreCase(user)) {
31
                return true;
32
            }
33
            ResultSet rs = metadata.getTablePrivileges(null, table.getSchema(), table.getTable());
34
            boolean canUpdate = false, canInsert = false;
35
            String privilege;
36
            while (rs.next() && !(canInsert && canUpdate)) {
37
                if (user.equalsIgnoreCase(rs.getString("GRANTEE"))) {
38
                    privilege = rs.getString("PRIVILEGE");
39
                    if ("INSERT".equals(privilege)) {
40
                        canInsert = true;
41
                    } else if ("UPDATE".equals(privilege)) {
42
                        canUpdate = true;
43
                    }
44
                }
45
            }
46
            return (canInsert && canUpdate);
47
        } catch (SQLException ex) {
48
            LOGGER.error("Can't fetch table privileges", ex);
49
        }
50
        return false;
51
    }
52
}
org.gvsig.oracle/tags/org.gvsig.oracle-2.0.28/org.gvsig.oracle.provider/src/main/java/org/gvsig/oracle/dal/operations/OraclePerformChangesOperation.java
1
package org.gvsig.oracle.dal.operations;
2

  
3
import java.sql.Connection;
4
import java.sql.SQLException;
5
import java.util.Iterator;
6

  
7
import org.gvsig.fmap.dal.exception.DataException;
8
import org.gvsig.fmap.dal.feature.FeatureType;
9
import org.gvsig.fmap.dal.feature.FeatureType.FeatureTypeChanged;
10
import org.gvsig.fmap.dal.feature.spi.FeatureProvider;
11
import org.gvsig.fmap.dal.feature.spi.FeatureReferenceProviderServices;
12
import org.gvsig.fmap.dal.store.jdbc2.JDBCHelper;
13
import org.gvsig.fmap.dal.store.jdbc2.OperationsFactory.TableReference;
14
import org.gvsig.fmap.dal.store.jdbc2.spi.operations.PerformChangesOperation;
15

  
16
@SuppressWarnings("UseSpecificCatch")
17
public class OraclePerformChangesOperation extends PerformChangesOperation {
18

  
19
    public OraclePerformChangesOperation(JDBCHelper helper) {
20
        super(helper);
21
    }
22

  
23
    public OraclePerformChangesOperation(JDBCHelper helper, TableReference table,
24
            FeatureType featureType, Iterator<FeatureReferenceProviderServices> deleteds,
25
            Iterator<FeatureProvider> inserteds, Iterator<FeatureProvider> updateds,
26
            Iterator<FeatureTypeChanged> featureTypesChanged) {
27
        super(helper, table, featureType, deleteds, inserteds, updateds, featureTypesChanged);
28
    }
29

  
30
    @Override
31
    public Object perform(Connection conn) throws DataException {
32
        Object result = super.perform(conn);
33
        try {
34
            // we need to commit before rebuilding the index
35
            conn.commit();
36
        } catch (SQLException e) {
37
            LOGGER.warn("Error commiting perform changes operation", e);
38
        }
39
        updateSpatialIndexAndMetadata();
40
        return result;
41
    }
42

  
43
    public void updateSpatialIndexAndMetadata() {
44
        OracleUpdateSpatialIndexAndMetadata updateIdxOperation
45
                = new OracleUpdateSpatialIndexAndMetadata(this.helper,
46
                        this.table.getDatabase(),
47
                        this.table.getSchema(),
48
                        this.table.getTable(),
49
                        this.featureType
50
                );
51
        try {
52
            updateIdxOperation.execute();
53
        } catch (Exception e) {
54
            LOGGER.warn("Error creating/updating the spatial index", e);
55
        }
56
    }
57
}
org.gvsig.oracle/tags/org.gvsig.oracle-2.0.28/org.gvsig.oracle.provider/src/main/java/org/gvsig/oracle/dal/operations/OracleGetSRS.java
1
package org.gvsig.oracle.dal.operations;
2

  
3
import java.sql.Connection;
4
import java.sql.PreparedStatement;
5
import java.sql.ResultSet;
6
import java.sql.SQLException;
7
import org.gvsig.fmap.dal.exception.DataException;
8
import org.gvsig.fmap.dal.resource.exception.AccessResourceException;
9
import org.gvsig.fmap.dal.store.jdbc2.JDBCHelper;
10
import org.gvsig.fmap.dal.store.jdbc2.JDBCUtils;
11
import org.slf4j.Logger;
12
import org.slf4j.LoggerFactory;
13

  
14
/**
15
 * Updates the layer extent on table USER_SDO_GEOM_METADATA and rebuild the
16
 * SpatialIndex.
17
 *
18
 * The metadata record is inserted if not existing. The SpatialIndex is also
19
 * created if not existing.
20
 *
21
 * @author Cesar Martinez Izquierdo
22
 *
23
 */
24
@SuppressWarnings("UseSpecificCatch")
25
public class OracleGetSRS {
26

  
27
    private static final Logger LOGGER = LoggerFactory.getLogger(OracleGetSRS.class);
28

  
29
    protected final JDBCHelper helper;
30
    protected final String database;
31
    protected final String schema;
32
    protected final String table;
33
    private Connection connection = null;
34

  
35
    public OracleGetSRS(
36
            JDBCHelper helper,
37
            String database,
38
            String schema,
39
            String table) {
40
        this.helper = helper;
41
        this.database = database;
42
        this.schema = schema;
43
        this.table = table;
44
    }
45

  
46
    public void begin() throws AccessResourceException {
47
        this.connection = this.helper.getConnection(); //.getConnectionWritable();
48
    }
49

  
50
    protected void clean() {
51
        this.helper.closeConnection(this.connection);
52
        this.connection = null;
53
    }
54

  
55
    /**
56
     * Executes the operation
57
     *
58
     * @return 
59
     * @throws DataException
60
     */
61
    public String execute() throws DataException {
62
        begin();
63
        StringBuilder srsQuery = new StringBuilder();
64
        srsQuery.append("select SRID from MDSYS.ALL_SDO_GEOM_METADATA where TABLE_NAME = UPPER('?');");
65
        PreparedStatement st = null;
66
        String srs = null;
67
        try {
68
            String sql = srsQuery.toString();
69
            st = connection.prepareStatement(sql);
70
            st.setString(1, table);
71
            
72
            ResultSet rs = JDBCUtils.executeQuery(st, sql);
73
            if(rs.first()) {
74
                srs = rs.getString(0);
75
            }
76
        } catch (SQLException ex) {
77
            throw new RuntimeException("Can't get srs from table "+table, ex);
78
        } finally {
79
            JDBCUtils.closeQuietly(st);
80
        }
81

  
82
        clean();
83
        return srs;
84
    }
85

  
86
}
org.gvsig.oracle/tags/org.gvsig.oracle-2.0.28/org.gvsig.oracle.provider/src/main/java/org/gvsig/oracle/dal/operations/OracleListTablesOperation.java
1
package org.gvsig.oracle.dal.operations;
2

  
3
import java.sql.Connection;
4
import java.sql.PreparedStatement;
5
import java.sql.ResultSet;
6
import java.sql.SQLException;
7
import java.sql.Statement;
8
import java.util.ArrayList;
9
import java.util.List;
10
import org.cresques.cts.IProjection;
11
import org.gvsig.fmap.crs.CRSFactory;
12
import org.gvsig.fmap.dal.store.jdbc.JDBCServerExplorerParameters;
13

  
14
import org.gvsig.fmap.dal.store.jdbc.JDBCStoreParameters;
15
import org.gvsig.fmap.dal.store.jdbc2.JDBCHelper;
16
import org.gvsig.fmap.dal.store.jdbc2.JDBCUtils;
17
import org.gvsig.fmap.dal.store.jdbc2.spi.operations.ListTablesOperation;
18

  
19
@SuppressWarnings("UseSpecificCatch")
20
public class OracleListTablesOperation extends ListTablesOperation {
21

  
22
    private static final String METADATA_COLUMN_TABLE_OWNER = "OWNER";
23
    private static final String METADATA_COLUMN_TABLE_NAME = "TABLE_NAME";
24

  
25
    private static final String ALL_VIEWS_QUERY = "SELECT OWNER, VIEW_NAME TABLE_NAME FROM ALL_VIEWS";
26
    private static final String ALL_TABLES_QUERY = "SELECT OWNER, TABLE_NAME FROM ALL_TABLES";
27
    private static final String EXCLUDE_SYSTEM_VIEWS_FILTER = "OWNER != 'MDSYS' AND OWNER != 'CTXSYS' AND OWNER != 'EXFSYS' AND OWNER != 'OLAPSYS' AND OWNER != 'ORDDATA' AND OWNER != 'ORDSYS' AND OWNER != 'SYS' AND OWNER != 'SYSTEM' AND OWNER != 'WMSYS' AND OWNER != 'XDB' AND OWNER NOT LIKE 'APEX_%' AND VIEW_NAME NOT LIKE '%$%'";
28
    private static final String EXCLUDE_SYSTEM_TABLES_FILTER = "OWNER != 'MDSYS' AND OWNER != 'CTXSYS' AND OWNER != 'EXFSYS' AND OWNER != 'OLAPSYS' AND OWNER != 'ORDDATA' AND OWNER != 'ORDSYS' AND OWNER != 'SYS' AND OWNER != 'SYSTEM' AND OWNER != 'WMSYS' AND OWNER != 'XDB' AND OWNER NOT LIKE 'APEX_%' AND TABLE_NAME NOT LIKE '%$%'";
29
    
30

  
31
    public OracleListTablesOperation(JDBCHelper helper, int mode, JDBCServerExplorerParameters baseParameters,
32
            boolean informationTables) {
33
        super(helper, mode, baseParameters, informationTables);
34
    }
35

  
36
    @Override
37
    public List<JDBCStoreParameters> listTables(
38
            Connection conn,
39
            int mode,
40
            JDBCServerExplorerParameters serverParameters,
41
            boolean informationTables
42
    ) {
43
        try {
44
            String schema = serverParameters.getSchema();
45
            return this.getAllTablesAndViews(serverParameters, schema, informationTables);
46

  
47
        } catch (SQLException ex) {
48
            throw new RuntimeException("Can't fetch tables information", ex);
49

  
50
        }
51
    }
52

  
53
    protected List<JDBCStoreParameters> getAllTablesAndViews(
54
            JDBCServerExplorerParameters serverParameters,
55
            String schema,
56
            boolean includeSystemTbls) throws SQLException {
57
        List<JDBCStoreParameters> tables = new ArrayList<>();
58
        try {
59
            StringBuilder builder = new StringBuilder();
60
            builder.append(ALL_TABLES_QUERY);
61
            boolean where = false;
62
            if (!includeSystemTbls) {
63
                builder.append(" WHERE ");
64
                where = true;
65
                builder.append(EXCLUDE_SYSTEM_TABLES_FILTER);
66
            }
67
            if (schema != null) {
68
                if (where) {
69
                    builder.append(" AND ");
70
                } else {
71
                    builder.append(" WHERE ");
72
                }
73
                builder.append(METADATA_COLUMN_TABLE_OWNER);
74
                builder.append(" = '");
75
                builder.append(schema);
76
                builder.append("'");
77
            }
78
            builder.append(" UNION ");
79
            builder.append(ALL_VIEWS_QUERY);
80
            if (!includeSystemTbls) {
81
                builder.append(" WHERE ");
82
                where = true;
83
                builder.append(EXCLUDE_SYSTEM_VIEWS_FILTER);
84
            } else {
85
                where = false;
86
            }
87
            if (schema != null) {
88
                if (where) {
89
                    builder.append(" AND ");
90
                } else {
91
                    builder.append(" WHERE ");
92
                }
93
                builder.append(METADATA_COLUMN_TABLE_OWNER);
94
                builder.append(" = '");
95
                builder.append(schema);
96
                builder.append("'");
97
            }
98
            Statement st = null;
99
            ResultSet rs = null;
100

  
101
            try {
102
                st = this.getConnection().createStatement();
103
                rs = JDBCUtils.executeQuery(st, builder.toString());
104
                while (rs.next()) {
105
                    JDBCStoreParameters params = this.helper.createOpenStoreParameters(serverParameters);
106
                    params.setSchema(rs.getString(METADATA_COLUMN_TABLE_OWNER));
107
                    String table = rs.getString(METADATA_COLUMN_TABLE_NAME);
108
                    params.setTable(table);
109
                    IProjection projection = getProjection(table);
110
                    if (projection != null) {
111
                        params.setCRS(projection);
112
                    }
113

  
114
                    tables.add(params);
115
                }
116
            } finally {
117
                JDBCUtils.closeQuietly(rs);
118
                JDBCUtils.closeQuietly(st);
119
            }
120
        } catch (Exception ex) {
121
            LOGGER.debug("Can't get the list of tables accessible by the user.", ex);
122
            throw new SQLException(ex);
123
        }
124
        return tables;
125

  
126
    }
127

  
128
    private IProjection getProjection(String table) {
129
        StringBuilder srsQuery = new StringBuilder();
130

  
131
        srsQuery.append("select coordRef.DATA_SOURCE, meta.SRID from MDSYS.ALL_SDO_GEOM_METADATA meta left join SDO_COORD_REF_SYS coordRef ON coordRef.SRID = meta.SRID  where TABLE_NAME = UPPER(?)");
132

  
133
        PreparedStatement st = null;
134
        String authority;
135
        String srs;
136
        IProjection projection = null;
137
        try {
138
            String sql = srsQuery.toString();
139
            st = conn.prepareStatement(sql);
140
            st.setString(1, table);
141

  
142
            ResultSet rs = JDBCUtils.executeQuery(st, sql);
143
            if (rs.next()) {
144
                authority = rs.getString(1);
145
                srs = rs.getString(2);
146
                projection = CRSFactory.getCRS(authority + ":" + srs);
147

  
148
            }
149
        } catch (SQLException ex) {
150
            throw new RuntimeException("Can't get srs from table " + table, ex);
151
        } finally {
152
            JDBCUtils.closeQuietly(st);
153
        }
154
        return projection;
155

  
156
    }
157
}
org.gvsig.oracle/tags/org.gvsig.oracle-2.0.28/org.gvsig.oracle.provider/src/main/java/org/gvsig/oracle/dal/operations/OracleAppendOperation.java
1
package org.gvsig.oracle.dal.operations;
2

  
3
import org.gvsig.fmap.dal.exception.DataException;
4
import org.gvsig.fmap.dal.feature.FeatureType;
5
import org.gvsig.fmap.dal.store.jdbc2.JDBCHelper;
6
import org.gvsig.fmap.dal.store.jdbc2.OperationsFactory.TableReference;
7
import org.gvsig.fmap.dal.store.jdbc2.spi.operations.AppendOperation;
8
import org.slf4j.Logger;
9
import org.slf4j.LoggerFactory;
10

  
11
public class OracleAppendOperation extends AppendOperation {
12
	private static final Logger LOGGER = LoggerFactory.getLogger(OracleAppendOperation.class);
13
	
14
	public OracleAppendOperation(JDBCHelper helper, TableReference table, FeatureType type) {
15
		super(helper, table, type);
16
	}
17
	
18
	@Override
19
	public void end() {
20
		super.end();
21
		try {
22
			updateSpatialIndexAndMetadata();
23
		}
24
		catch (Exception ex) {
25
			LOGGER.error("Error updating spatial index and metadata", ex);
26
		}
27
	}
28
    
29
    public void updateSpatialIndexAndMetadata() {
30
        OracleUpdateSpatialIndexAndMetadata updateIdxOperation = 
31
        		new OracleUpdateSpatialIndexAndMetadata(this.helper,
32
        				this.table.getDatabase(),
33
        				this.table.getSchema(),
34
        				this.table.getTable(),
35
        				this.type
36
        		);
37
        try {
38
            updateIdxOperation.execute();
39
        } catch (DataException e) {
40
            LOGGER.warn("Error creating/updating the spatial index", e);
41
        }
42
    }
43
}
org.gvsig.oracle/tags/org.gvsig.oracle-2.0.28/org.gvsig.oracle.provider/src/main/java/org/gvsig/oracle/dal/operations/OracleFetchFeatureTypeOperation.java
1
package org.gvsig.oracle.dal.operations;
2

  
3
import java.sql.Connection;
4
import java.sql.PreparedStatement;
5
import java.sql.ResultSet;
6
import java.sql.ResultSetMetaData;
7
import java.sql.SQLException;
8
import java.util.HashSet;
9
import java.util.List;
10
import java.util.Set;
11

  
12
import org.cresques.cts.IProjection;
13
import org.gvsig.expressionevaluator.ExpressionBuilder;
14
import org.gvsig.fmap.dal.DataTypes;
15
import org.gvsig.fmap.dal.exception.DataException;
16
import org.gvsig.fmap.dal.feature.EditableFeatureAttributeDescriptor;
17
import org.gvsig.fmap.dal.feature.EditableFeatureType;
18
import org.gvsig.fmap.dal.store.jdbc2.JDBCHelper;
19
import org.gvsig.fmap.dal.store.jdbc2.JDBCUtils;
20
import org.gvsig.fmap.dal.store.jdbc2.OperationsFactory.TableReference;
21
import org.gvsig.fmap.dal.store.jdbc2.spi.JDBCSQLBuilderBase;
22
import org.gvsig.fmap.dal.store.jdbc2.spi.operations.FetchFeatureTypeOperation;
23
import org.gvsig.fmap.geom.type.GeometryType;
24
import org.gvsig.oracle.dal.GeometryTypeUtils;
25
import org.gvsig.oracle.dal.OracleSQLBuilder;
26
import org.gvsig.tools.dataTypes.DataType;
27

  
28
@SuppressWarnings("UseSpecificCatch")
29
public class OracleFetchFeatureTypeOperation extends FetchFeatureTypeOperation {
30

  
31
    private static final int ORACLE_COLUMN_BINARY_FLOAT_TYPECODE = 100;
32
    private static final int ORACLE_COLUMN_BINARY_DOUBLE_TYPECODE = 101;
33
    protected Set<String> tableTriggers;
34

  
35
    public OracleFetchFeatureTypeOperation(JDBCHelper helper) {
36
        super(helper);
37
    }
38

  
39
    public OracleFetchFeatureTypeOperation(
40
            JDBCHelper helper,
41
            EditableFeatureType featureType,
42
            TableReference table,
43
            List<String> primaryKeys,
44
            String defaultGeometryColumn,
45
            IProjection crs
46
    ) {
47
        super(helper, featureType, table, primaryKeys, defaultGeometryColumn, crs);
48
    }
49

  
50
    @Override
51
    public void fetch(Connection conn) throws DataException {
52
        super.fetch(conn);
53
    }
54

  
55
    @Override
56
    public String getSQLToRetrievePrimaryKeysFromInformationSchema() throws SQLException {
57
        JDBCSQLBuilderBase sqlbuilder = this.createSQLBuilder();
58
        ExpressionBuilder expbuilder = sqlbuilder.expression();
59

  
60
        sqlbuilder.select().column().name(
61
                sqlbuilder.quote_for_identifiers()
62
                        +"USER_TAB_COLS"
63
                        +sqlbuilder.quote_for_identifiers()
64
                        +"."
65
                        +sqlbuilder.quote_for_identifiers()
66
                        +"COLUMN_NAME"
67
                        +sqlbuilder.quote_for_identifiers()
68
        );
69
        sqlbuilder.select().column().name(
70
                sqlbuilder.quote_for_identifiers()
71
                        +"ALL_CONSTRAINTS"
72
                        +sqlbuilder.quote_for_identifiers()
73
                        +"."
74
                        +sqlbuilder.quote_for_identifiers()
75
                        +"CONSTRAINT_TYPE"
76
                        +sqlbuilder.quote_for_identifiers()
77
        );
78

  
79
        sqlbuilder.select().from().custom(
80
                "USER_TAB_COLS "
81
                + "JOIN ALL_CONS_COLUMNS on (ALL_CONS_COLUMNS.TABLE_NAME = USER_TAB_COLS.TABLE_NAME and ALL_CONS_COLUMNS.COLUMN_NAME = USER_TAB_COLS.COLUMN_NAME) "
82
                + "LEFT JOIN ALL_CONSTRAINTS on ALL_CONSTRAINTS.CONSTRAINT_NAME = ALL_CONS_COLUMNS.CONSTRAINT_NAME"
83
        );
84

  
85
        sqlbuilder.select().where().set(
86
                expbuilder.like(
87
                        expbuilder.custom(
88
                                sqlbuilder.quote_for_identifiers()
89
                                        +"USER_TAB_COLS"
90
                                        +sqlbuilder.quote_for_identifiers()
91
                                        +"."
92
                                        +sqlbuilder.quote_for_identifiers()
93
                                        +"TABLE_NAME"
94
                                        +sqlbuilder.quote_for_identifiers()),
95
                        
96
                        expbuilder.constant(table.getTable())
97
                )
98
        );
99

  
100
        sqlbuilder.select().where().and(
101
                expbuilder.eq(
102
                        expbuilder.custom(
103
                                sqlbuilder.quote_for_identifiers()
104
                                        +"ALL_CONSTRAINTS"
105
                                        +sqlbuilder.quote_for_identifiers()
106
                                        +"."
107
                                        +sqlbuilder.quote_for_identifiers()
108
                                        +"CONSTRAINT_TYPE"
109
                                        +sqlbuilder.quote_for_identifiers()),
110
                        expbuilder.constant("'P'")
111
                )
112
        );
113
        return sqlbuilder.select().toString();
114
    }
115

  
116
    @Override
117
    protected int getDataTypeFromMetadata(
118
            ResultSetMetaData rsMetadata,
119
            int colIndex
120
    ) throws SQLException {
121
        int type = rsMetadata.getColumnType(colIndex);
122
        switch (type) {
123
            case java.sql.Types.INTEGER:
124
                return DataTypes.INT;
125

  
126
            case java.sql.Types.BIGINT:
127
                return DataTypes.LONG;
128

  
129
            case java.sql.Types.REAL:
130
                return DataTypes.DOUBLE;
131

  
132
            case java.sql.Types.DOUBLE:
133
            case ORACLE_COLUMN_BINARY_DOUBLE_TYPECODE:
134
                return DataTypes.DOUBLE;
135

  
136
            case java.sql.Types.CHAR:
137
                return DataTypes.STRING;
138

  
139
            case java.sql.Types.CLOB:
140
            case java.sql.Types.VARCHAR:
141
            case java.sql.Types.LONGVARCHAR:
142
                return DataTypes.STRING;
143

  
144
            case java.sql.Types.FLOAT:
145
            case ORACLE_COLUMN_BINARY_FLOAT_TYPECODE:
146
                return DataTypes.FLOAT;
147
                
148
            case java.sql.Types.NUMERIC:
149
            case java.sql.Types.DECIMAL:
150
                if (rsMetadata.getScale(colIndex) == 0) {
151
                    if (rsMetadata.getPrecision(colIndex) == DataType.LONG_MAX_PRECISION-1) {
152
                        return DataTypes.LONG;
153
                    }
154
                    if (rsMetadata.getPrecision(colIndex) == DataType.INT_MAX_PRECISION-1) {
155
                        return DataTypes.INTEGER;
156
                    }
157
                }
158
                return DataTypes.DECIMAL;
159

  
... This diff was truncated because it exceeds the maximum size that can be displayed.

Also available in: Unified diff