Statistics
| Revision:

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
}