Statistics
| Revision:

svn-gvsig-desktop / trunk / libraries / libDataSourceDBBaseDrivers / src / org / gvsig / data / datastores / vectorial / db / jdbc / h2 / H2Utils.java @ 20058

History | View | Annotate | Download (13.3 KB)

1
package org.gvsig.data.datastores.vectorial.db.jdbc.h2;
2

    
3
import java.sql.Connection;
4
import java.sql.DriverManager;
5
import java.sql.PreparedStatement;
6
import java.sql.ResultSet;
7
import java.sql.ResultSetMetaData;
8
import java.sql.Statement;
9
import java.util.Iterator;
10

    
11
import org.gvsig.data.datastores.vectorial.db.DBFeatureType;
12
import org.gvsig.data.datastores.vectorial.db.jdbc.JDBCAttributeDescriptor;
13
import org.gvsig.data.datastores.vectorial.db.jdbc.JDBCFeature;
14
import org.gvsig.data.datastores.vectorial.db.jdbc.JDBCStore;
15
import org.gvsig.data.datastores.vectorial.db.jdbc.exception.JDBCDriverNotFoundException;
16
import org.gvsig.data.datastores.vectorial.db.jdbc.exception.SQLException;
17
import org.gvsig.data.exception.InitializeException;
18
import org.gvsig.data.exception.ReadException;
19
import org.gvsig.data.vectorial.DefaultAttributeDescriptor;
20
import org.gvsig.data.vectorial.IFeature;
21
import org.gvsig.data.vectorial.IFeatureAttributeDescriptor;
22
import org.gvsig.data.vectorial.IFeatureType;
23

    
24
import com.iver.cit.gvsig.fmap.core.FShape;
25
import com.iver.cit.gvsig.fmap.core.IGeometry;
26
import com.iver.cit.gvsig.fmap.drivers.WKBParser2;
27
import com.vividsolutions.jts.io.WKBWriter;
28

    
29
public class H2Utils {
30

    
31

    
32

    
33
        static String getDefaultSchema(Connection conn, String catalog) throws InitializeException {
34
                String sql= "SELECT * FROM INFORMATION_SCHEMA.SCHEMATA WHERE IS_DEFAULT = TRUE";
35
                if (catalog == null || catalog ==""){
36
                        sql= sql+ " AND CATALOG_NAME = '"+catalog+"'";
37
                }
38

    
39
                String schema = null;
40
                Statement st = null;
41
                ResultSet rs= null;
42
                try{
43
                        st = conn.createStatement(ResultSet.FETCH_FORWARD, ResultSet.CONCUR_READ_ONLY);
44
                        rs = st.executeQuery(sql);
45
                        if (!rs.next()){
46
                                throw new InitializeException("getDefaulSchema",new Exception("Can't find default schema."));
47
                        }
48
                        schema = rs.getString("SCHEMA_NAME");
49
                        if (rs.next()){
50
                                throw new InitializeException("getDefaulSchema",new Exception("Checks catalog parm."));
51
                        }
52

    
53

    
54
                } catch (java.sql.SQLException e) {
55
                        // TODO Auto-generated catch block
56
                        throw new SQLException(sql,"getDefaultSchema",e);
57
                } finally{
58
                        try{
59
                                if (rs != null){
60
                                        rs.close();
61
                                } else if (st != null){
62
                                        st.close();
63
                                }
64
                        } catch (java.sql.SQLException e1){
65
                                //Ignore ??
66
                        }
67

    
68
                }
69
                return schema;
70
        }
71

    
72
        private static void loadFieldsToFeatureType(Connection conn,H2StoreParameters params,DBFeatureType featureType) throws ReadException{
73
                String sql="";
74
                String columns=params.getFieldsString();
75

    
76
                if (params.getSqlSoure() != null){
77
                        sql = params.getSqlSoure();
78
                } else {
79
                        sql = "Select "+columns+" from " + params.tableID() + " limit 1;";
80
                }
81

    
82
                try {
83

    
84
                        Statement stAux = conn.createStatement();
85
                        Statement stAux1 = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
86
                        ResultSet rs = stAux.executeQuery(sql);
87
                        ResultSetMetaData rsMetadata = rs.getMetaData();
88
                        String schemaFilter="";
89
                        if (params.getSchema() != null && params.getSchema() != ""){
90
                                schemaFilter = " TABLE_SCHEMA='" + params.getSchema() +"' AND ";
91
                        }
92
                        String sqlAllMeta = "SELECT * FROM INFORMATION_SCHEMA.COLUMNS where "
93
                                + schemaFilter
94
                                + "TABLE_NAME='"+ params.getTableName() +"'";
95

    
96
                        ResultSet rsAllMeta = stAux1.executeQuery(sqlAllMeta);
97

    
98
//                        ResultSet rsAllMeta = conn.getMetaData().getAttributes(null, null, tableName, "*");
99

    
100
                        String colName;
101
                        int i;
102

    
103
                        featureType.setTableID(params.tableID());
104
                        DefaultAttributeDescriptor attr;
105
                        for (i=1;i<=rsMetadata.getColumnCount();i++){
106
                                colName= rsMetadata.getColumnName(i);
107
                                rsAllMeta.first();
108

    
109
                                while (true){
110
                                        if  (rsAllMeta.isAfterLast()){
111
                                                attr = getAttributeFromJDBC(conn,rsMetadata,i);
112
                                                featureType.add(attr);
113
                                                attr.setOrdinal(i-1);
114
                                                break;
115
                                        } else if(rsAllMeta.getString("COLUMN_NAME").equals(colName)){
116
                                                attr = getAttributeFromJDBC(conn,rsAllMeta);
117
                                                featureType.add(attr);
118
                                                attr.setOrdinal(i-1);
119
                                                break;
120
                                        }
121
                                        rsAllMeta.next();
122
                                }
123
                                if (attr.getName().equals(params.getGeometryField())){
124
                                        if (attr.getDataType().equals(IFeatureAttributeDescriptor.TYPE_OBJECT)){
125
                                                attr.setType(IFeatureAttributeDescriptor.TYPE_GEOMETRY);
126
                                        }else{
127
                                                throw new InitializeException(
128
                                                        "H2Utils.getFeatureType",
129
                                                        new Exception("Geometry Field '"
130
                                                                + params.getGeometryField()
131
                                                                + "' is a "
132
                                                                + attr.getDataType()
133
                                                                + " but sould be "
134
                                                                + IFeatureAttributeDescriptor.TYPE_OBJECT));
135
                                        }
136

    
137
                                }
138
                        }
139

    
140
                        rs.close();
141
                        rsAllMeta.close();
142
                } catch (java.sql.SQLException e) {
143
                        // TODO Auto-generated catch block
144
                        throw new SQLException(sql,"getFeatureType",e);
145
                }
146

    
147
        }
148

    
149
        static DBFeatureType getFeatureType(Connection conn,H2StoreParameters params) throws ReadException{
150
                DBFeatureType featureType = new DBFeatureType();
151

    
152

    
153
                loadFieldsToFeatureType(conn, params, featureType);
154

    
155

    
156
                featureType.setFieldsId(params.getFieldsId());
157

    
158
                if (params.getGeometryField() != null && params.getGeometryField() != ""){
159
                        if (featureType.getFieldIndex(params.getGeometryField())< 0){
160
                                // FIXME: crear una nueva excepcion??
161
                                throw new InitializeException(
162
                                                H2Store.DATASTORE_NAME,
163
                                                new Exception("Geometry Field '"+ params.getGeometryField() +"' not Found"));
164

    
165
                        }
166

    
167
                        featureType.setDefaultGeometry(params.getGeometryField());
168
                }
169

    
170
                return featureType;
171

    
172
        }
173

    
174
        private static DefaultAttributeDescriptor getAttributeFromJDBC(Connection conn,ResultSetMetaData rsMetadata,int colIndex) throws SQLException{
175
                JDBCAttributeDescriptor column= new JDBCAttributeDescriptor();
176
                try {
177
                        column.setName(rsMetadata.getColumnName(colIndex));
178
                        column.setCaseSensitive(rsMetadata.isCaseSensitive(colIndex));
179
                        column.setSqlType(rsMetadata.getColumnType(colIndex));
180
                        column.setAllowNull(rsMetadata.isNullable(colIndex) == ResultSetMetaData.columnNullable);
181
                        column.setAutoIncrement(rsMetadata.isAutoIncrement(colIndex));
182
                        column.setReadOnly(rsMetadata.isReadOnly(colIndex));
183
                        column.setWritable(rsMetadata.isWritable(colIndex));
184
                        column.setClassName(rsMetadata.getColumnClassName(colIndex));
185
                        column.setCatalogName(rsMetadata.getCatalogName(colIndex));
186
                        column.setDefinitelyWritable(rsMetadata.isDefinitelyWritable(colIndex));
187
                        column.setLabel(rsMetadata.getColumnLabel(colIndex));
188
                        column.setSchemaName(rsMetadata.getSchemaName(colIndex));
189
                        column.setTableName(rsMetadata.getTableName(colIndex));
190
                        column.setCatalogName(rsMetadata.getCatalogName(colIndex));
191
                        column.setSqlTypeName(rsMetadata.getColumnTypeName(colIndex));
192
                        column.setSearchable(rsMetadata.isSearchable(colIndex));
193
                        column.setSigned(rsMetadata.isSigned(colIndex));
194
                        column.setCurrency(rsMetadata.isCurrency(colIndex));
195
                        column.setPrecision(rsMetadata.getPrecision(colIndex));
196
                        column.setSize(rsMetadata.getColumnDisplaySize(colIndex));                        switch (rsMetadata.getColumnType(colIndex)) {
197
                        case java.sql.Types.INTEGER:
198
                                column.setType(IFeatureAttributeDescriptor.TYPE_INT);
199
                                break;
200
                        case java.sql.Types.BIGINT:
201
                                column.setType(IFeatureAttributeDescriptor.TYPE_LONG);
202
                                break;
203
                        case java.sql.Types.REAL:
204
                                column.setType(IFeatureAttributeDescriptor.TYPE_DOUBLE);
205
                                break;
206
                        case java.sql.Types.DOUBLE:
207
                                column.setType(IFeatureAttributeDescriptor.TYPE_DOUBLE);
208
                                break;
209
                        case java.sql.Types.CHAR:
210
                                column.setType(IFeatureAttributeDescriptor.TYPE_STRING);
211
                                break;
212
                        case java.sql.Types.VARCHAR:
213
                                column.setType(IFeatureAttributeDescriptor.TYPE_STRING);
214
                                break;
215
                        case java.sql.Types.FLOAT:
216
                                column.setType(IFeatureAttributeDescriptor.TYPE_FLOAT);
217
                                break;
218
                        case java.sql.Types.DECIMAL:
219
                                column.setType(IFeatureAttributeDescriptor.TYPE_FLOAT);
220
                                break;
221
                        case java.sql.Types.DATE:
222
                                column.setType(IFeatureAttributeDescriptor.TYPE_DATE);
223
                                break;
224
                        case java.sql.Types.BOOLEAN:
225
                                column.setType(IFeatureAttributeDescriptor.TYPE_BOOLEAN);
226
                                break;
227
                        default:
228
                                column.setType(IFeatureAttributeDescriptor.TYPE_OBJECT);
229
                                break;
230
                        }
231
                } catch (java.sql.SQLException e){
232
                        throw new SQLException("","load attribute definition",e);
233
                }
234

    
235
                return column;
236

    
237
        }
238

    
239
        private static DefaultAttributeDescriptor getAttributeFromJDBC(Connection conn, ResultSet rsMetadata) throws SQLException{
240
                JDBCAttributeDescriptor column= new JDBCAttributeDescriptor();
241
                try {
242
                        column.setName(rsMetadata.getString("COLUMN_NAME"));
243
                        column.setSqlType(rsMetadata.getInt("DATA_TYPE"));
244
                        switch (rsMetadata.getInt("DATA_TYPE")) {
245
                        case java.sql.Types.INTEGER:
246
                                column.setType(IFeatureAttributeDescriptor.TYPE_INT);
247
                                break;
248
                        case java.sql.Types.BIGINT:
249
                                column.setType(IFeatureAttributeDescriptor.TYPE_LONG);
250
                                break;
251
                        case java.sql.Types.REAL:
252
                                column.setType(IFeatureAttributeDescriptor.TYPE_DOUBLE);
253
//                                column.setPrecision(rsMetadata.getInt("DECIMAL_DIGITS"));
254
                                column.setPrecision(rsMetadata.getInt("NUMERIC_PRECISION"));
255
                                break;
256
                        case java.sql.Types.DOUBLE:
257
                                column.setType(IFeatureAttributeDescriptor.TYPE_DOUBLE);
258
//                                column.setPrecision(rsMetadata.getInt("DECIMAL_DIGITS"));
259
                                column.setPrecision(rsMetadata.getInt("NUMERIC_PRECISION"));
260
                                break;
261
                        case java.sql.Types.CHAR:
262
                                column.setType(IFeatureAttributeDescriptor.TYPE_STRING);
263
//                                column.setSize(rsMetadata.getInt("COLUMN_SIZE"));
264
                                column.setSize(rsMetadata.getInt("CHARACTER_MAXIMUM_LENGTH"));
265
                                break;
266
                        case java.sql.Types.VARCHAR:
267
                                column.setType(IFeatureAttributeDescriptor.TYPE_STRING);
268
//                                column.setSize(rsMetadata.getInt("COLUMN_SIZE"));
269
                                column.setSize(rsMetadata.getInt("CHARACTER_MAXIMUM_LENGTH"));
270

    
271
                                break;
272
                        case java.sql.Types.FLOAT:
273
                                column.setType(IFeatureAttributeDescriptor.TYPE_FLOAT);
274
//                                column.setSize(rsMetadata.getInt("COLUMN_SIZE"));
275
                                column.setSize(rsMetadata.getInt("CHARACTER_MAXIMUM_LENGTH"));
276
                                break;
277
                        case java.sql.Types.DECIMAL:
278
                                column.setType(IFeatureAttributeDescriptor.TYPE_FLOAT);
279
//                                column.setSize(rsMetadata.getInt("COLUMN_SIZE"));
280
                                column.setSize(rsMetadata.getInt("CHARACTER_MAXIMUM_LENGTH"));
281
//                                column.setPrecision(rsMetadata.getInt("DECIMAL_DIGITS"));
282
                                column.setPrecision(rsMetadata.getInt("NUMERIC_PRECISION"));
283
                                break;
284
                        case java.sql.Types.DATE:
285
                                column.setType(IFeatureAttributeDescriptor.TYPE_DATE);
286
                                break;
287
                        case java.sql.Types.BOOLEAN:
288
                                column.setType(IFeatureAttributeDescriptor.TYPE_BOOLEAN);
289
                                break;
290
                        default:
291
                                //FIXME: Falta comprobar si es geometrica!!!
292
                                column.setType(IFeatureAttributeDescriptor.TYPE_OBJECT);
293
                                break;
294
                        }
295

    
296
                        column.setDefaultValue(rsMetadata.getObject("COLUMN_DEFAULT"));
297
                        column.setAllowNull(rsMetadata.getBoolean("IS_NULLABLE"));
298
                } catch (java.sql.SQLException e){
299
                        throw new SQLException("","load attribute definition",e);
300
                }
301

    
302
                return column;
303

    
304
        }
305

    
306

    
307

    
308
        static void initializeTableEPSG_and_shapeType(Connection conn,String tableID, DBFeatureType dbld) throws ReadException {
309
                try {
310
                        Statement stAux = conn.createStatement();
311

    
312
//                        String sql = "SELECT * FROM GEOMETRY_COLUMNS WHERE F_TABLE_NAME = '"
313
//                                        + getTableName() + "' AND F_GEOMETRY_COLUMN = '" + getLyrDef().getFieldGeometry() + "'";
314
                        String sql= "SELECT SRID("+dbld.getDefaultGeometry()+"), GeometryType("+dbld.getDefaultGeometry()+") FROM "+tableID +" WHERE "+dbld.getDefaultGeometry()+" is not null LIMIT 1";
315

    
316
                        ResultSet rs = stAux.executeQuery(sql);
317
                        if(!rs.next()){
318
                                dbld.setDefaultSRS("");
319
                                dbld.setGeometryTypes(new int[]{FShape.MULTI});
320
                                return;
321
                        }
322
                        dbld.setDefaultSRS("EPSG:"+rs.getInt(1));
323

    
324
                        String geometryType = rs.getString(2);
325
                        int shapeType = FShape.MULTI;
326
                        if (geometryType.compareToIgnoreCase("Point") == 0)
327
                                shapeType = FShape.POINT;
328
                        else if (geometryType.compareToIgnoreCase("LineString") == 0)
329
                                shapeType = FShape.LINE;
330
                        else if (geometryType.compareToIgnoreCase("Polygon") == 0)
331
                                shapeType = FShape.POLYGON;
332
                        else if (geometryType.compareToIgnoreCase("MultiPoint") == 0)
333
                                shapeType = FShape.POINT;
334
                        else if (geometryType.compareToIgnoreCase("MultiLineString") == 0)
335
                                shapeType = FShape.LINE;
336
                        else if (geometryType.compareToIgnoreCase("MultiPolygon") == 0)
337
                                shapeType = FShape.POLYGON;
338

    
339
                        dbld.setGeometryTypes(new int[]{shapeType});
340
                        rs.close();
341

    
342
                } catch (java.sql.SQLException e) {
343
                        dbld.setDefaultSRS("");
344
                        dbld.setGeometryTypes(new int[]{FShape.MULTI});
345
                        throw new ReadException("H2Utils.getTableEPSG_and_shapeType",e);
346
                }
347

    
348
        }
349

    
350
        static String getConnectionResourceID(String dbUrl,String dbUser){
351
                return H2Store.CONNECTION_STRING+";"+dbUrl+";"+dbUser;
352

    
353
        }
354

    
355

    
356
        static String getJDBCUrl(String host,String db){
357
                String url;
358
                url = "jdbc:h2:tcp://"+host;
359
                if (db == null || db == ""){
360
                        url=url+"/default";
361
                }else {
362
                        url=url+"/"+db;
363
                }
364

    
365
                return url;
366
        }
367

    
368
        static Connection getConnection(String dbUrl,String dbUser, String dbPass) throws InitializeException{
369
                //TODO: Aqu? habria que implementar la llamada
370
                //      al Resource Manager para comprobar si ya hay
371
                //                una connexion a la BD
372
                String connID = getConnectionResourceID(dbUrl, dbUser);
373

    
374
                Connection conn = null;
375
//                IResource res = ResourceManager.getResourceManager().getResource(connID);
376

    
377

    
378

    
379
                try {
380
                        Class.forName("org.h2.Driver");
381
                } catch (ClassNotFoundException e) {
382
                        throw new JDBCDriverNotFoundException("org.h2.Driver",e);
383
                }
384
                try {
385
                        conn = DriverManager.getConnection(dbUrl, dbUser, dbPass);
386
                        conn.setAutoCommit(false);
387

    
388
                } catch (java.sql.SQLException e1) {
389
                        throw new InitializeException("H2",e1);
390
                }
391
                //TODO: Registrar en el Resource manager
392
                // ResourceManager.getResourceManager().addResource(res);
393

    
394
                return conn;
395
        }
396

    
397

    
398
}