Revision 543

View differences:

tags/org.gvsig.postgresql-2.0.109/org.gvsig.postgresql.provider/src/test/java/org/gvsig/postgresql/dal/PostgreSQLBuilderTest.java
1
package org.gvsig.postgresql.dal;
2

  
3
import junit.framework.TestCase;
4
import org.apache.commons.lang3.ArrayUtils;
5
import org.apache.commons.lang3.StringUtils;
6
import org.cresques.cts.IProjection;
7
import org.gvsig.expressionevaluator.ExpressionBuilder;
8
import org.gvsig.fmap.crs.CRSFactory;
9
import org.gvsig.fmap.dal.SQLBuilder;
10
import org.gvsig.fmap.dal.SQLBuilder.Privilege;
11
import org.gvsig.fmap.dal.feature.spi.SQLBuilderBase;
12
import org.gvsig.fmap.dal.store.jdbc2.OperationsFactory.TableReference;
13
import static org.gvsig.fmap.dal.store.jdbc2.spi.JDBCSQLBuilderBase.PROP_TABLE;
14
import org.gvsig.fmap.dal.store.jdbc2.spi.operations.OperationsFactoryBase;
15
import org.gvsig.fmap.geom.DataTypes;
16
import org.gvsig.fmap.geom.Geometry;
17
import org.gvsig.fmap.geom.GeometryLocator;
18
import org.gvsig.fmap.geom.GeometryManager;
19
import org.gvsig.fmap.geom.primitive.Polygon;
20
import org.gvsig.tools.library.impl.DefaultLibrariesInitializer;
21

  
22
public class PostgreSQLBuilderTest extends TestCase {
23
    
24
    public PostgreSQLBuilderTest(String testName) {
25
        super(testName);
26
    }
27

  
28
    @Override
29
    protected void setUp() throws Exception {
30
        super.setUp();
31
        new DefaultLibrariesInitializer().fullInitialize();
32
    }
33

  
34
    @Override
35
    protected void tearDown() throws Exception {
36
        super.tearDown();
37
    }
38

  
39
    private SQLBuilder createSQLBuilder() {
40
        return new PostgreSQLBuilder(new PostgreSQLHelper(null));
41
    }
42
    
43
    public void testCalulateEnvelopeOfColumn() throws Exception {
44
        
45
        TableReference table = new OperationsFactoryBase.DefaultTableReference("master","dbo","test1", null);
46
        String columnName = "the_geom";
47
        
48
        SQLBuilder sqlbuilder = createSQLBuilder();
49
        ExpressionBuilder expbuilder = sqlbuilder.expression();
50
        
51
        sqlbuilder.select().column().value(
52
            expbuilder.as_geometry(
53
                expbuilder.ST_ExtentAggregate(
54
                        expbuilder.column(columnName)
55
                )
56
            )
57
        );
58
        //sqlbuilder.select().group_by(expbuilder.column(columnName));
59
        sqlbuilder.select().from().table()
60
                .database(table.getDatabase())
61
                .schema(table.getSchema())
62
                .name(table.getTable());
63
        sqlbuilder.select().from().subquery(table.getSubquery());
64

  
65
        sqlbuilder.select().where().and(        
66
            expbuilder.not_is_null(expbuilder.column(columnName))
67
        );
68
        
69
        System.out.println("# Test:: testCalulateEnvelopeOfColumn");
70
        System.out.println("# SQL:: " + sqlbuilder.toString());
71
        System.out.println("# Variables:: " + ArrayUtils.toString(sqlbuilder.variables_names()));
72
        System.out.println("# Parametros:: " + ArrayUtils.toString(sqlbuilder.parameters_names()));
73
        assertEquals(
74
                "SELECT ST_AsBinary(ST_Extent(\"the_geom\")) FROM \"master\".\"dbo\".\"test1\" WHERE ( (\"the_geom\") IS NOT NULL )",
75
                sqlbuilder.toString()
76
        );
77
        assertEquals(
78
                "[the_geom]",
79
                ArrayUtils.toString(sqlbuilder.variables_names())
80
        );
81
        assertEquals(
82
                "[]",
83
                ArrayUtils.toString(sqlbuilder.parameters_names())
84
        );
85
    }
86
 
87
    public void testCalulateEnvelope() throws Exception {
88
        GeometryManager geometryManager = GeometryLocator.getGeometryManager();
89
        IProjection proj = CRSFactory.getCRS("EPSG:4326");
90
        
91
        Polygon limit = geometryManager.createPolygon(Geometry.SUBTYPES.GEOM2D);
92
        limit.addVertex(0, 0);
93
        limit.addVertex(0, 100);
94
        limit.addVertex(100, 100);
95
        limit.addVertex(100, 0);
96
        limit.addVertex(0, 0);
97
        
98
        SQLBuilder sqlbuilder = createSQLBuilder();
99
        ExpressionBuilder expbuilder = sqlbuilder.expression();
100
        
101
        sqlbuilder.select().column().value(
102
            expbuilder.as_geometry(
103
              expbuilder.ST_ExtentAggregate(
104
                expbuilder.column("the_geom")
105
              )
106
            )
107
        ).as("envelope");
108
        sqlbuilder.select().from().table().database("master").schema("dbo").name("test1");
109
        sqlbuilder.select().where().set(
110
            expbuilder.ST_Intersects(
111
                expbuilder.ST_Envelope(
112
                    expbuilder.column("the_geom")
113
                ),
114
                expbuilder.geometry(limit, proj)
115
            )
116
        );
117
        sqlbuilder.select().where().and(
118
                expbuilder.custom("x = 27")
119
        );
120
        
121
        System.out.println("# Test:: testCalulateEnvelope");
122
        System.out.println("# SQL:: " + sqlbuilder.toString());
123
        System.out.println("# Variables:: " + ArrayUtils.toString(sqlbuilder.variables_names()));
124
        System.out.println("# Parametros:: " + ArrayUtils.toString(sqlbuilder.parameters_names()));
125
        assertEquals(
126
                "SELECT ST_AsBinary(ST_Extent(\"the_geom\")) AS \"envelope\" FROM \"master\".\"dbo\".\"test1\" WHERE (ST_Intersects((ST_Envelope(\"the_geom\")), (ST_GeomFromWKB(('\\x000000000300000001000000050000000000000000000000000000000000000000000000004059000000000000405900000000000040590000000000004059000000000000000000000000000000000000000000000000000000000000'::bytea), (4326)))) AND x = 27)",
127
                sqlbuilder.toString()
128
        );
129
        assertEquals(
130
                "[the_geom]",
131
                ArrayUtils.toString(sqlbuilder.variables_names())
132
        );
133
        assertEquals(
134
                "[]",
135
                ArrayUtils.toString(sqlbuilder.parameters_names())
136
        );
137
    }
138

  
139
    public void testCount() throws Exception {
140
        SQLBuilder sqlbuilder = createSQLBuilder();
141
        ExpressionBuilder expbuilder = sqlbuilder.expression();
142
        
143
        sqlbuilder.select().column().value(sqlbuilder.count().all());
144
        sqlbuilder.select().from().table().database("master").schema("dbo").name("test1");
145
        sqlbuilder.select().from().subquery(null);
146
        sqlbuilder.select().where().set( expbuilder.custom("pp = 200"));
147

  
148
        System.out.println("# Test:: testCount");
149
        System.out.println("# SQL:: " + sqlbuilder.toString());
150
        System.out.println("# Variables:: " + ArrayUtils.toString(sqlbuilder.variables_names()));
151
        System.out.println("# Parametros:: " + ArrayUtils.toString(sqlbuilder.parameters_names()));
152

  
153
        //# Test:: testCount
154
        //# SQL:: SELECT COUNT(*) FROM "test1" WHERE pp = 200
155
        //# Variables:: []
156
        //# Parametros:: []
157

  
158
        assertEquals(
159
                "SELECT COUNT(*) FROM \"master\".\"dbo\".\"test1\" WHERE pp = 200",
160
                sqlbuilder.toString()
161
        );
162
        assertEquals(
163
                "[]",
164
                ArrayUtils.toString(sqlbuilder.variables_names())
165
        );
166
        assertEquals(
167
                "[]",
168
                ArrayUtils.toString(sqlbuilder.parameters_names())
169
        );
170
    }
171
    
172
    public void testCreateTable() throws Exception {
173
        SQLBuilder sqlbuilder = createSQLBuilder();
174
        ExpressionBuilder expbuilder = sqlbuilder.expression();
175

  
176
        sqlbuilder.create_table().table().database("master").schema("dbo").name("test1");
177
        sqlbuilder.create_table().add_column(
178
                "name",
179
                DataTypes.STRING,
180
                45,
181
                0,
182
                false,
183
                false,
184
                true,
185
                false,
186
                null
187
        );
188
        sqlbuilder.create_table().add_column(
189
                "id",
190
                DataTypes.INT,
191
                0,
192
                0,
193
                true,
194
                false,
195
                false,
196
                true,
197
                0
198
        );
199
        sqlbuilder.create_table().add_column(
200
                "geom",
201
                DataTypes.GEOMETRY,
202
                0,
203
                0,
204
                false,
205
                false,
206
                true,
207
                false,
208
                null
209
        );
210

  
211
        
212
        // CREATE TABLE "test1" ("name" VARCHAR(45) DEFAULT NULL, "id" INTEGER PRIMARY KEY AUTO_INCREMENT DEFAULT '0' NOT NULL, "geom" GEOMETRY ); ALTER TABLE "test1" ADD CONSTRAINT IF NOT EXISTS "constraint_test1_geom_dim" CHECK ST_CoordDim("geom") = 2
213
        System.out.println("# Test:: testCreateTable");
214
        System.out.println("# SQL:: " + sqlbuilder.toString());
215
        System.out.println("# Variables:: " + ArrayUtils.toString(sqlbuilder.variables_names()));
216
        System.out.println("# Parametros:: " + ArrayUtils.toString(sqlbuilder.parameters_names()));
217
        assertEquals(
218
                "CREATE TABLE \"master\".\"dbo\".\"test1\" (\"name\" VARCHAR(45) DEFAULT NULL NULL, \"id\"  SERIAL PRIMARY KEY ); SELECT AddGeometryColumn('dbo' , 'test1' , 'geom', null , 'GEOMETRY' , 2, TRUE)",
219
                sqlbuilder.toString()
220
        );
221
        assertEquals(
222
                "[]",
223
                ArrayUtils.toString(sqlbuilder.variables_names())
224
        );
225
        assertEquals(
226
                "[]",
227
                ArrayUtils.toString(sqlbuilder.parameters_names())
228
        );
229
    }
230

  
231
    public void testDropTable() throws Exception {
232
        SQLBuilder sqlbuilder = createSQLBuilder();
233
        ExpressionBuilder expbuilder = sqlbuilder.expression();
234
        
235
        sqlbuilder.drop_table().table().database("master").schema("dbo").name("test1");
236

  
237
        // DROP TABLE "test1"
238
        
239
        System.out.println("# Test:: testDropTable");
240
        System.out.println("# SQL:: " + sqlbuilder.toString());
241
        System.out.println("# Variables:: " + ArrayUtils.toString(sqlbuilder.variables_names()));
242
        System.out.println("# Parametros:: " + ArrayUtils.toString(sqlbuilder.parameters_names()));
243
        assertEquals(
244
                "DROP TABLE \"master\".\"dbo\".\"test1\"",
245
                sqlbuilder.toString()
246
        );
247
        assertEquals(
248
                "[]",
249
                ArrayUtils.toString(sqlbuilder.variables_names())
250
        );
251
        assertEquals(
252
                "[]",
253
                ArrayUtils.toString(sqlbuilder.parameters_names())
254
        );
255
    }
256
    
257
    public void testFetchFeatureProviderByReference() throws Exception {
258
        SQLBuilder sqlbuilder = new SQLBuilderBase();
259
        ExpressionBuilder expbuilder = sqlbuilder.expression();
260
        
261
        String value = "yoyo";
262
        sqlbuilder.select().column().name("name");
263
        sqlbuilder.select().column().name("id");
264
        sqlbuilder.select().column().name("geom").as_geometry();
265
        sqlbuilder.select().from().table().database("master").schema("dbo").name("test1");
266
        sqlbuilder.select().where().set(
267
            expbuilder.eq(
268
                expbuilder.column("name"),
269
                expbuilder.parameter(value).as_constant()
270
            )
271
        );
272
        sqlbuilder.select().limit(1);
273

  
274
        // SELECT "name", "id", ST_AsBinary("geom") FROM "master"."dbo"."test1" WHERE ( ("name") = (?) ) LIMIT 1
275

  
276
        System.out.println("# Test:: testFetchFeatureProviderByReference");
277
        System.out.println("# SQL:: " + sqlbuilder.toString());
278
        System.out.println("# Variables:: " + ArrayUtils.toString(sqlbuilder.variables_names()));
279
        System.out.println("# Parametros:: " + ArrayUtils.toString(sqlbuilder.parameters_names()));
280
        assertEquals(
281
                "SELECT \"name\", \"id\", ST_AsBinary(\"geom\") FROM \"master\".\"dbo\".\"test1\" WHERE ( (\"name\") = (?) ) LIMIT 1",
282
                sqlbuilder.toString()
283
        );
284
        assertEquals(
285
                "[geom, id, name]",
286
                ArrayUtils.toString(sqlbuilder.variables_names())
287
        );
288
        assertEquals(
289
                "['yoyo']",
290
                ArrayUtils.toString(sqlbuilder.parameters_names())
291
        );
292
    }
293
    
294
    public void testFetchFeatureType() throws Exception {
295
        SQLBuilder sqlbuilder = createSQLBuilder();
296
        ExpressionBuilder expbuilder = sqlbuilder.expression();
297

  
298
        sqlbuilder.select().column().all();
299
        sqlbuilder.select().from().table().database("master").schema("dbo").name("test1");
300
        sqlbuilder.select().limit(1);
301

  
302
        System.out.println("# Test:: testFetchFeatureType");
303
        System.out.println("# SQL:: " + sqlbuilder.toString());
304
        System.out.println("# Variables:: " + ArrayUtils.toString(sqlbuilder.variables_names()));
305
        System.out.println("# Parametros:: " + ArrayUtils.toString(sqlbuilder.parameters_names()));
306
        
307
        //# Test:: testFetchFeatureType
308
        //# SQL:: SELECT * FROM "test1" LIMIT 1
309
        //# Variables:: []
310
        //# Parametros:: []        
311
        
312
        assertEquals(
313
                "SELECT * FROM \"master\".\"dbo\".\"test1\" LIMIT 1",
314
                sqlbuilder.toString()
315
        );
316
        assertEquals(
317
                "[]",
318
                ArrayUtils.toString(sqlbuilder.variables_names())
319
        );
320
        assertEquals(
321
                "[]",
322
                ArrayUtils.toString(sqlbuilder.parameters_names())
323
        );
324
    }
325
        
326
    public void testPerformDeletes() throws Exception {
327
        SQLBuilder sqlbuilder = createSQLBuilder();
328
        ExpressionBuilder expbuilder = sqlbuilder.expression();
329

  
330
        sqlbuilder.delete().table().database("master").schema("dbo").name("test1");
331
        sqlbuilder.delete().where().and(
332
            expbuilder.eq( 
333
                expbuilder.column("id1"),
334
                expbuilder.parameter("id1").as_variable()
335
            )
336
        );
337
        sqlbuilder.delete().where().and(
338
            expbuilder.eq( 
339
                expbuilder.column("id2"),
340
                expbuilder.parameter("id2").as_variable()
341
            )
342
        );
343

  
344
        // DELETE FROM "test1" WHERE ( ("id1") = (?) ) AND ( ("id2") = (?) )
345

  
346
        System.out.println("# Test:: testPerformDeletes");
347
        System.out.println("# SQL:: " + sqlbuilder.toString());
348
        System.out.println("# Variables:: " + ArrayUtils.toString(sqlbuilder.variables_names()));
349
        System.out.println("# Parametros:: " + ArrayUtils.toString(sqlbuilder.parameters_names()));
350
        assertEquals(
351
                "DELETE FROM \"master\".\"dbo\".\"test1\" WHERE (( (\"id1\") = (?) ) AND ( (\"id2\") = (?) ))",
352
                sqlbuilder.toString()
353
        );
354
        assertEquals(
355
                "[id1, id2]",
356
                ArrayUtils.toString(sqlbuilder.variables_names())
357
        );
358
        assertEquals(
359
                "[\"id1\", \"id2\"]",
360
                ArrayUtils.toString(sqlbuilder.parameters_names())
361
        );
362
    }
363

  
364
    public void testPerformInserts1() throws Exception {
365
        IProjection proj = CRSFactory.getCRS("EPSG:4326");
366

  
367
        SQLBuilder sqlbuilder = createSQLBuilder();
368
        ExpressionBuilder expbuilder = sqlbuilder.expression();
369

  
370
        sqlbuilder.insert().table().database("master").schema("dbo").name("test1");
371
        sqlbuilder.insert().column().name("id").with_value(expbuilder.parameter("id"));
372
        sqlbuilder.insert().column().name("name").with_value(expbuilder.parameter("name"));
373
        sqlbuilder.insert().column().name("geom").with_value(expbuilder.parameter("geom").as_geometry_variable().srs(proj));
374
        
375
        System.out.println("# Test:: testPerformInserts1");
376
        System.out.println("# SQL:: " + sqlbuilder.toString());
377
        System.out.println("# Variables:: " + ArrayUtils.toString(sqlbuilder.variables_names()));
378
        System.out.println("# Parametros:: " + ArrayUtils.toString(sqlbuilder.parameters_names()));
379
        assertEquals(
380
                "INSERT INTO \"master\".\"dbo\".\"test1\" ( \"id\", \"name\", \"geom\" ) VALUES ( ?, ?, ST_GeomFromWKB((?), (4326)) )",
381
                sqlbuilder.toString()
382
        );
383
        assertEquals(
384
                "[geom, id, name]",
385
                ArrayUtils.toString(sqlbuilder.variables_names())
386
        );
387
        assertEquals(
388
                "[\"id\", \"name\", \"geom\"]",
389
                ArrayUtils.toString(sqlbuilder.parameters_names())
390
        );
391
    }
392

  
393
    public void testPerformInserts2() throws Exception {
394
        IProjection proj = CRSFactory.getCRS("EPSG:4326");
395

  
396
        SQLBuilder sqlbuilder = createSQLBuilder();
397
        ExpressionBuilder expbuilder = sqlbuilder.expression();
398

  
399
        sqlbuilder.insert().table().database("master").schema("dbo").name("test1");
400
        sqlbuilder.insert().column().name("id").with_value(expbuilder.parameter("id"));
401
        sqlbuilder.insert().column().name("name").with_value(expbuilder.parameter("name"));
402
        sqlbuilder.insert().column().name("geom").with_value(expbuilder.parameter("geom").as_geometry_variable().srs(proj));
403
        
404
        System.out.println("# Test:: testPerformInserts2");
405
        System.out.println("# SQL:: " + sqlbuilder.toString());
406
        System.out.println("# Variables:: " + ArrayUtils.toString(sqlbuilder.variables_names()));
407
        System.out.println("# Parametros:: " + ArrayUtils.toString(sqlbuilder.parameters_names()));
408
        assertEquals(
409
                "INSERT INTO \"master\".\"dbo\".\"test1\" ( \"id\", \"name\", \"geom\" ) VALUES ( ?, ?, ST_GeomFromWKB((?), (4326)) )",
410
                sqlbuilder.toString()
411
        );
412
        assertEquals(
413
                "[geom, id, name]",
414
                ArrayUtils.toString(sqlbuilder.variables_names())
415
        );
416
        assertEquals(
417
                "[\"id\", \"name\", \"geom\"]",
418
                ArrayUtils.toString(sqlbuilder.parameters_names())
419
        );
420
    }
421

  
422
    public void testPerformUpdates1() throws Exception {
423
        IProjection proj = CRSFactory.getCRS("EPSG:4326");
424

  
425
        SQLBuilder sqlbuilder = createSQLBuilder();
426
        ExpressionBuilder expbuilder = sqlbuilder.expression();
427

  
428
        sqlbuilder.update().table().database("master").schema("dbo").name("test1");
429
        sqlbuilder.update().where().and(
430
            expbuilder.eq(
431
                expbuilder.column("id"), 
432
                expbuilder.parameter("id").as_variable()
433
            )
434
        );
435
        sqlbuilder.update().column().name("name").with_value(expbuilder.parameter("name"));
436
        sqlbuilder.update().column().name("geom").with_value(
437
                expbuilder.parameter("geom").as_geometry_variable().srs(proj) 
438
        );
439

  
440
        System.out.println("# Test:: testPerformUpdates");
441
        System.out.println("# SQL:: " + sqlbuilder.toString());
442
        System.out.println("# Variables:: " + ArrayUtils.toString(sqlbuilder.variables_names()));
443
        System.out.println("# Parametros:: " + ArrayUtils.toString(sqlbuilder.parameters_names()));
444
        assertEquals(
445
                "UPDATE \"master\".\"dbo\".\"test1\" SET \"name\" = ?, \"geom\" = ST_GeomFromWKB((?), (4326)) WHERE ( (\"id\") = (?) )",
446
                sqlbuilder.toString()
447
        );
448
        assertEquals(
449
                "[geom, id, name]",
450
                ArrayUtils.toString(sqlbuilder.variables_names())
451
        );
452
        assertEquals(
453
                "[\"name\", \"geom\", \"id\"]",
454
                ArrayUtils.toString(sqlbuilder.parameters_names())
455
        );
456
    }
457

  
458
    public void testPerformUpdates2() throws Exception {
459
        IProjection proj = CRSFactory.getCRS("EPSG:4326");
460

  
461
        SQLBuilder sqlbuilder = createSQLBuilder();
462
        ExpressionBuilder expbuilder = sqlbuilder.expression();
463

  
464
        sqlbuilder.update().table().database("master").schema("dbo").name("test1");
465
        sqlbuilder.update().where().and(
466
            expbuilder.eq(
467
                expbuilder.column("id"), 
468
                expbuilder.parameter("id").as_variable()
469
            )
470
        );
471
        sqlbuilder.update().column().name("name").with_value(expbuilder.parameter("name"));
472
        sqlbuilder.update().column().name("geom").with_value(
473
                expbuilder.parameter("geom").as_geometry_variable()
474
                        .srs(expbuilder.parameter().value(proj)) 
475
        );
476

  
477
        System.out.println("# Test:: testPerformUpdates");
478
        System.out.println("# SQL:: " + sqlbuilder.toString());
479
        System.out.println("# Variables:: " + ArrayUtils.toString(sqlbuilder.variables_names()));
480
        System.out.println("# Parametros:: " + ArrayUtils.toString(sqlbuilder.parameters_names()));
481
        assertEquals(
482
                "UPDATE \"master\".\"dbo\".\"test1\" SET \"name\" = ?, \"geom\" = ST_GeomFromWKB((?), (?)) WHERE ( (\"id\") = (?) )",
483
                sqlbuilder.toString()
484
        );
485
        assertEquals(
486
                "[geom, id, name]",
487
                ArrayUtils.toString(sqlbuilder.variables_names())
488
        );
489
        assertEquals(
490
                "[\"name\", \"geom\", 4326, \"id\"]",
491
                ArrayUtils.toString(sqlbuilder.parameters_names())
492
        );
493
    }
494

  
495
    public void testGrant1() throws Exception {
496

  
497
        SQLBuilder sqlbuilder = createSQLBuilder();
498
        ExpressionBuilder expbuilder = sqlbuilder.expression();
499

  
500
        sqlbuilder.grant().table().database("master").schema("dbo").name("test1");
501
        sqlbuilder.grant().role("prueba").select().insert().update();
502
        sqlbuilder.grant().role("gis").all();
503
                
504
        
505
        System.out.println("# Test:: testGrant1");
506
        System.out.println("# SQL:: " + sqlbuilder.toString());
507
        System.out.println("# Variables:: " + ArrayUtils.toString(sqlbuilder.variables_names()));
508
        System.out.println("# Parametros:: " + ArrayUtils.toString(sqlbuilder.parameters_names()));
509
        assertEquals(
510
                "",
511
                sqlbuilder.toString()
512
        );
513
        assertEquals(
514
                "[]",
515
                ArrayUtils.toString(sqlbuilder.variables_names())
516
        );
517
        assertEquals(
518
                "[]",
519
                ArrayUtils.toString(sqlbuilder.parameters_names())
520
        );
521
    }
522

  
523
    public void testGrant2() throws Exception {
524

  
525
        SQLBuilder sqlbuilder = new SQLBuilderBase();
526
        ExpressionBuilder expbuilder = sqlbuilder.expression();
527

  
528
        sqlbuilder.grant().table().database("master").schema("dbo").name("test1");
529
        sqlbuilder.grant().role("prueba").privilege(Privilege.SELECT)
530
                .privilege(Privilege.INSERT)
531
                .privilege(Privilege.UPDATE);
532
        sqlbuilder.grant().role("gis").privilege(Privilege.ALL);
533
                
534
        
535
        System.out.println("# Test:: testGrant2");
536
        System.out.println("# SQL:: " + sqlbuilder.toString());
537
        System.out.println("# Variables:: " + ArrayUtils.toString(sqlbuilder.variables_names()));
538
        System.out.println("# Parametros:: " + ArrayUtils.toString(sqlbuilder.parameters_names()));
539
        assertEquals(
540
                "",
541
                sqlbuilder.toString()
542
        );
543
        assertEquals(
544
                "[]",
545
                ArrayUtils.toString(sqlbuilder.variables_names())
546
        );
547
        assertEquals(
548
                "[]",
549
                ArrayUtils.toString(sqlbuilder.parameters_names())
550
        );
551
    }
552

  
553

  
554
}
tags/org.gvsig.postgresql-2.0.109/org.gvsig.postgresql.provider/src/main/resources/org/gvsig/postgresql/dal/PostgreSQLParameters.xml
1
<?xml version="1.0"?>
2
<definitions>
3
  <version>1.0.0</version>
4
  <classes>
5
    <class name="PostgreSQLResourceParameters">
6
      <extends>
7
        <class>JDBC2ResourceParameters</class>
8
      </extends>
9
      <fields>
10
        <field name="JDBCDriverClass" type="string" mandatory="true"
11
          defaultValue="org.postgresql.Driver" group="Advanced">
12
          <description>JDBC Driver class</description>
13
        </field>
14
		<field name="port" type="integer" mandatory="false"
15
          defaultValue="5432" 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
        <field name="UseSSL" type="boolean" mandatory="false"
23
          defaultValue="false" group="Basic">
24
          <description>Use SSL connetion</description>
25
        </field>
26
        <field name="maxIdle" type="integer" mandatory="false"
27
          defaultValue="8" group="Advanced">
28
          <description>The maximum number of connections that can remail idle in the pool.</description>
29
        </field>
30
      </fields>
31
    </class>
32

  
33
    <class name="PostgreSQLStoreParameters">
34
      <extends>
35
        <class>JDBC2StoreParameters</class>
36
        <class>PostgreSQLResourceParameters</class>
37
      </extends>
38
      <fields/>
39
    </class>
40

  
41
    <class name="PostgreSQLNewStoreParameters">
42
      <extends>
43
        <class>JDBC2NewStoreParameters</class>
44
        <class>PostgreSQLResourceParameters</class>
45
      </extends>
46
      <fields/>
47
    </class>
48

  
49

  
50
    <class name="PostgreSQLServerExplorerParameters">
51
      <extends>
52
        <class>PostgreSQLResourceParameters</class>
53
        <class>JDBC2ServerExplorerParameters</class>
54
      </extends>
55
      <fields/>
56
    </class>
57

  
58

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

  
14
  </classes>
15
</definitions>  
tags/org.gvsig.postgresql-2.0.109/org.gvsig.postgresql.provider/src/main/resources/META-INF/services/org.gvsig.tools.library.Library
1
org.gvsig.postgresql.dal.PostgreSQLLibrary
tags/org.gvsig.postgresql-2.0.109/org.gvsig.postgresql.provider/src/main/java/org/gvsig/postgresql/dal/PostgreSQLHelper.java
1

  
2
package org.gvsig.postgresql.dal;
3

  
4
import java.sql.Connection;
5
import java.sql.SQLException;
6
import org.apache.commons.dbcp.BasicDataSource;
7
import org.apache.commons.lang3.BooleanUtils;
8
import org.apache.commons.lang3.StringUtils;
9
import org.gvsig.expressionevaluator.ExpressionBuilder.GeometrySupportType;
10
import org.gvsig.fmap.dal.SQLBuilder;
11
import org.gvsig.fmap.dal.resource.exception.AccessResourceException;
12
import org.gvsig.fmap.dal.store.jdbc.JDBCConnectionParameters;
13
import org.gvsig.fmap.dal.store.jdbc.JDBCNewStoreParameters;
14
import org.gvsig.fmap.dal.store.jdbc.JDBCServerExplorerParameters;
15
import org.gvsig.fmap.dal.store.jdbc.JDBCStoreParameters;
16
import org.gvsig.fmap.dal.store.jdbc.exception.JDBCDriverClassNotFoundException;
17
import org.gvsig.fmap.dal.store.jdbc2.OperationsFactory;
18
import org.gvsig.fmap.dal.store.jdbc2.spi.JDBCHelperBase;
19
import org.gvsig.fmap.dal.store.jdbc2.spi.JDBCSQLBuilderBase;
20
import org.gvsig.fmap.dal.store.jdbc2.spi.SRSSolverBase;
21
import org.gvsig.postgresql.dal.operations.PostgreSQLOperationsFactory;
22
import org.slf4j.Logger;
23
import org.slf4j.LoggerFactory;
24

  
25
public class PostgreSQLHelper extends JDBCHelperBase {
26

  
27
    static final Logger logger = LoggerFactory.getLogger(PostgreSQLHelper.class);
28

  
29
    public static final String POSTGRESQL_JDBC_DRIVER = "org.postgresql.Driver";
30
    
31
    public static String getConnectionURL(PostgreSQLConnectionParameters params) {
32
        return getConnectionURL(
33
            params.getHost(),
34
            params.getPort(),
35
            params.getDBName()
36
        );
37
    }
38
    
39
    public static String getConnectionURL(String host, Integer port, String db) {
40
        if( StringUtils.isEmpty(host) ) {
41
            throw new IllegalArgumentException("Parameter 'host' can't be null.");
42
        }
43
        String connectionURL = "jdbc:postgresql://" + host;
44
        if (port != null) {
45
            connectionURL = connectionURL + ":" + port;
46
        }
47
        connectionURL = connectionURL + "/" + db;
48
        logger.debug("connectionURL: {}", connectionURL);
49
        return connectionURL;
50
    }
51

  
52
    private static class ConnectionProvider {
53

  
54
        private static boolean needRegisterDriver = true;
55

  
56
        private BasicDataSource dataSource = null;
57

  
58
        private final PostgreSQLConnectionParameters connectionParameters;
59

  
60
        public ConnectionProvider(PostgreSQLConnectionParameters connectionParameters) {
61
            this.connectionParameters = connectionParameters;
62
        }
63

  
64
        public Connection getConnection() throws SQLException {
65
            if (this.dataSource == null) {
66
                this.dataSource = this.createDataSource();               
67
            }
68
            if( logger.isDebugEnabled() ) {
69
                logger.debug("getConnection:\n" + getStatusInformation());
70
            }
71
            Connection conn;
72
            try {
73
                conn = this.dataSource.getConnection();
74
            } catch(Throwable ex) {
75
                logger.debug("Error getting connection from pool.",ex);
76
                throw ex;
77
            }
78
            if( logger.isDebugEnabled() ) {
79
                logger.debug("Created connection: {}\n  NumActive: {}\n  NumIdle: {}",
80
                    new Object[] {
81
                        conn.hashCode(), 
82
                        this.dataSource.getNumActive(),
83
                        this.dataSource.getNumIdle()
84
                    }
85
                );
86
            }
87
            return conn;
88
        }
89
        
90
        public void closeConnection(Connection connection) {
91
            if( connection != null ) {
92
                int connectionId = connection.hashCode();
93
                try {
94
                    connection.close();
95
                } catch(Throwable ex) {
96
                    logger.warn("Can't close connection.", ex);
97
                }
98
                if( logger.isDebugEnabled() ) {
99
                    Boolean isClosed;
100
                    try {
101
                        isClosed = connection.isClosed();
102
                    } catch(Throwable th) {
103
                        isClosed = null;
104
                    }
105
                    logger.debug("Closed connection: {}\n  isClosed: {}\n  NumActive: {}\n  NumIdle: {}",
106
                        new Object[] {
107
                            connectionId, 
108
                            isClosed,
109
                            this.dataSource.getNumActive(),
110
                            this.dataSource.getNumIdle()
111
                        }
112
                    );
113
                }
114
           } else if( logger.isDebugEnabled() ) {
115
               logger.debug("Close connection: null");
116
           }
117
        }
118
        
119
        public String getStatusInformation() {
120
            StringBuilder builder = new StringBuilder();
121
            builder.append("BasicDataSource pool status:\n");
122
            builder.append("  Connection URL: '").append(this.dataSource.getUrl()).append("'\n");
123
            if( this.dataSource.getInitialSize()>0 ) {
124
                builder.append("  InitialSize: ").append(this.dataSource.getInitialSize()).append(" (The initial number of connections that are created when the pool is started)\n");
125
            }
126
            if( this.dataSource.isPoolPreparedStatements() ) {
127
                builder.append("  PoolPreparedStatements: ").append(this.dataSource.isPoolPreparedStatements()).append("\n");
128
                builder.append("  MaxOpenPreparedStatements: ").append(this.dataSource.getMaxOpenPreparedStatements()).append(" (The maximum number of open statements that can be allocated from the statement pool at the same time, or non-positive for no limit)\n");
129
            }
130
            builder.append("  MaxActive: ").append(this.dataSource.getMaxActive()).append(" (The maximum number of active connections that can be allocated from this pool at the same time)\n");
131
            builder.append("  MaxIdle: ").append(this.dataSource.getMaxIdle()).append(" (The maximum number of connections that can remain idle in the pool)\n");
132
            builder.append("  NumActive:").append(this.dataSource.getNumActive()).append(" (the current number of active connections)\n");
133
            builder.append("  NumIdle:").append(this.dataSource.getNumIdle()).append(" (the current number of idle connections)\n");
134
            return builder.toString();
135
        }
136

  
137
        private BasicDataSource createDataSource() throws SQLException {
138
            if (!this.isRegistered()) {
139
                this.registerDriver();
140
            }
141
            PostgreSQLConnectionParameters params = connectionParameters;
142

  
143
            BasicDataSource ds = new BasicDataSource();
144
            ds.setMaxIdle(params.getMaxIdle());
145
            ds.setDriverClassName(params.getJDBCDriverClassName());
146
            if( params.getUseSSL() ) {
147
                String s = BooleanUtils.toStringTrueFalse(params.getUseSSL());
148
                ds.addConnectionProperty("ssl", s );
149
            }
150
            if( !StringUtils.isEmpty(params.getUser()) ) {
151
                ds.setUsername(params.getUser());
152
            }
153
            if( !StringUtils.isEmpty(params.getPassword()) ) {
154
                ds.setPassword(params.getPassword());
155
            }
156
            ds.setUrl(params.getUrl());
157

  
158
            ds.setMaxWait(60L * 1000);
159
            return ds;
160
        }
161

  
162
        private boolean isRegistered() {
163
            return needRegisterDriver;
164
        }
165

  
166
        public void registerDriver() throws SQLException {
167
            String className = this.connectionParameters.getJDBCDriverClassName();
168
            if (className == null) {
169
                return;
170
            }
171
            try {
172
                Class theClass = Class.forName(className);
173
                if (theClass == null) {
174
                    throw new JDBCDriverClassNotFoundException(PostgreSQLLibrary.NAME, className);
175
                }
176
            } catch (Exception e) {
177
                throw new SQLException("Can't register JDBC driver '" + className + "'.", e);
178
            }
179
            needRegisterDriver = false;
180
        }
181

  
182
    }
183

  
184
    private ConnectionProvider connectionProvider = null;
185
   
186
    public PostgreSQLHelper(JDBCConnectionParameters connectionParameters) {
187
        super(connectionParameters);
188
        this.srssolver = new SRSSolverBase(this);
189
    }
190

  
191
    @Override
192
    public Connection getConnection() throws AccessResourceException {
193
        try {
194
            if (this.connectionProvider == null) {
195
                this.connectionProvider = new ConnectionProvider(this.getConnectionParameters());
196
            }
197
            return this.connectionProvider.getConnection();
198
        } catch (SQLException ex) {
199
            throw new AccessResourceException(PostgreSQLLibrary.NAME, ex);
200
        }
201
    }
202

  
203
    @Override
204
    public void closeConnection(Connection connection) {
205
         this.connectionProvider.closeConnection(connection);
206
    }
207
    
208
    @Override
209
    public PostgreSQLConnectionParameters getConnectionParameters() {
210
        return (PostgreSQLConnectionParameters) super.getConnectionParameters();
211
    }
212
    
213
    @Override
214
    public String getConnectionURL() {
215
        return getConnectionURL(this.getConnectionParameters());
216
    }
217

  
218
    @Override
219
    protected String getResourceType() {
220
        return PostgreSQLLibrary.NAME;
221
    }
222

  
223
    @Override
224
    public String getProviderName() {
225
        return PostgreSQLLibrary.NAME;
226
    }
227

  
228
    @Override
229
    public JDBCSQLBuilderBase createSQLBuilder() {
230
        return new PostgreSQLBuilder(this);
231
    }
232
    
233
    @Override
234
    public OperationsFactory getOperations() {
235
        if (this.operationsFactory == null) {
236
            this.operationsFactory = new PostgreSQLOperationsFactory(this);
237
        }
238
        return operationsFactory;
239
    }
240

  
241
    @Override
242
    public GeometrySupportType getGeometrySupportType() {
243
        return GeometrySupportType.WKB;
244
    }
245

  
246
    @Override
247
    public boolean hasSpatialFunctions() {
248
        return true;
249
    }
250

  
251
    @Override
252
    public boolean canWriteGeometry(int geometryType, int geometrySubtype) {
253
        return true;
254
    }
255

  
256
    @Override
257
    public String getQuoteForIdentifiers() {
258
        return "\"";
259
    }
260

  
261
    @Override
262
    public boolean allowAutomaticValues() {
263
        return true;
264
    }
265

  
266
    @Override
267
    public boolean supportOffsetInSelect() {
268
        return true;
269
    }
270

  
271
    @Override
272
    public String getQuoteForStrings() {
273
        return "'";
274
    }
275
    
276
    @Override
277
    public String getSourceId(JDBCStoreParameters parameters) {
278
        return parameters.getDBName() + "." + 
279
               parameters.getSchema()+ "." + 
280
               parameters.getTable();
281
    }
282

  
283
    @Override
284
    public JDBCNewStoreParameters createNewStoreParameters() {
285
        return new PostgreSQLNewStoreParameters();
286
    }
287

  
288
    @Override
289
    public JDBCStoreParameters createOpenStoreParameters() {
290
        return new PostgreSQLStoreParameters();
291
    }
292

  
293
    @Override
294
    public JDBCServerExplorerParameters createServerExplorerParameters() {
295
        return new PostgreSQLServerExplorerParameters();
296
    }
297
}
tags/org.gvsig.postgresql-2.0.109/org.gvsig.postgresql.provider/src/main/java/org/gvsig/postgresql/dal/PostgreSQLServerExplorerFactory.java
1

  
2
package org.gvsig.postgresql.dal;
3

  
4
import org.apache.commons.lang3.StringUtils;
5
import org.gvsig.fmap.dal.DataServerExplorerParameters;
6
import org.gvsig.fmap.dal.exception.InitializeException;
7
import org.gvsig.fmap.dal.spi.DataServerExplorerProviderServices;
8
import org.gvsig.fmap.dal.spi.DataStoreProviderServices;
9
import org.gvsig.fmap.dal.store.jdbc.JDBCConnectionParameters;
10
import org.gvsig.fmap.dal.store.jdbc.JDBCServerExplorerParameters;
11
import org.gvsig.fmap.dal.store.jdbc2.JDBCHelper;
12
import org.gvsig.fmap.dal.store.jdbc2.JDBCServerExplorer;
13
import org.gvsig.fmap.dal.store.jdbc2.impl.JDBCServerExplorerFactory;
14

  
15

  
16
public class PostgreSQLServerExplorerFactory extends JDBCServerExplorerFactory {
17

  
18
    private static final String NAME = PostgreSQLLibrary.NAME;
19
    
20
    public PostgreSQLServerExplorerFactory() {
21
        super(
22
            NAME,
23
            "PostgreSQL Server"
24
        );
25
    }
26

  
27
    public PostgreSQLServerExplorerFactory(String name) {
28
        // Cuando se instancia la factoria con un "name" que no es el de por
29
        // defecto, es para declarar "alias" para el ServerExplorer, normalmente
30
        // para mantener compatibilidad con versiones anteriores. 
31
        // Marcaremos la factoria como "hidden" para que no aparezca
32
        // en el interface de usuario.
33
        super(
34
            name,
35
            "PostgreSQL Server (for compatibility)",
36
            true
37
        );
38
    }
39

  
40
    @Override
41
    public JDBCServerExplorer create(
42
            DataServerExplorerParameters parameters, 
43
            DataServerExplorerProviderServices providerServices
44
        ) throws InitializeException {
45
        // Esto seria para convertir los parametros de gvSIG 2.3 a 2.4.
46
//        if( !StringUtils.equalsIgnoreCase(NAME, (CharSequence) parameters.getDynValue(DataStoreProviderServices.PROVIDER_PARAMTER_NAME)) ) {
47
//            parameters.setDynValue(DataStoreProviderServices.PROVIDER_PARAMTER_NAME, NAME);
48
//        }
49
        JDBCHelper helper = new PostgreSQLHelper((JDBCConnectionParameters) parameters);
50
        JDBCServerExplorer server = helper.createServerExplorer(
51
                (JDBCServerExplorerParameters) parameters, 
52
                providerServices
53
        );
54
        return server;
55
    }
56
        
57

  
58
    @Override
59
    public JDBCServerExplorerParameters createParameters() {
60
        JDBCServerExplorerParameters params = new PostgreSQLServerExplorerParameters();
61
        return params;    
62
    }
63
    
64
}
tags/org.gvsig.postgresql-2.0.109/org.gvsig.postgresql.provider/src/main/java/org/gvsig/postgresql/dal/PostgreSQLStoreProviderFactory.java
1

  
2
package org.gvsig.postgresql.dal;
3

  
4
import org.gvsig.fmap.dal.DataParameters;
5
import org.gvsig.fmap.dal.exception.InitializeException;
6
import org.gvsig.fmap.dal.spi.DataStoreProviderServices;
7
import org.gvsig.fmap.dal.store.jdbc.JDBCConnectionParameters;
8
import org.gvsig.fmap.dal.store.jdbc.JDBCStoreParameters;
9
import org.gvsig.fmap.dal.store.jdbc2.JDBCHelper;
10
import org.gvsig.fmap.dal.store.jdbc2.JDBCStoreProvider;
11
import org.gvsig.fmap.dal.store.jdbc2.impl.JDBCStoreProviderFactory;
12

  
13

  
14
public class PostgreSQLStoreProviderFactory extends JDBCStoreProviderFactory {
15
    
16
    public PostgreSQLStoreProviderFactory() {
17
        super(
18
                PostgreSQLLibrary.NAME, 
19
                "PostgreSQL store"
20
        );
21
    }
22

  
23
    @Override
24
    public JDBCStoreProvider createProvider(
25
            DataParameters parameters,
26
            DataStoreProviderServices providerServices
27
    ) throws InitializeException {
28
        JDBCHelper helper = new PostgreSQLHelper((JDBCConnectionParameters) parameters);
29
        JDBCStoreProvider provider = helper.createProvider(
30
                (JDBCStoreParameters) parameters, 
31
                providerServices
32
        );
33
        return provider;
34
    }
35

  
36
    @Override
37
    public JDBCStoreParameters createParameters() {
38
        JDBCStoreParameters params = new PostgreSQLStoreParameters();
39
        return params;
40
    }
41
    
42
}
tags/org.gvsig.postgresql-2.0.109/org.gvsig.postgresql.provider/src/main/java/org/gvsig/postgresql/dal/operations/PostgreSQLFetchFeatureTypeOperation.java
1

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

  
4
import java.sql.Connection;
5
import java.sql.ResultSet;
6
import java.sql.ResultSetMetaData;
7
import java.sql.SQLException;
8
import java.sql.Statement;
9
import java.util.HashMap;
10
import java.util.List;
11
import java.util.Map;
12
import org.apache.commons.lang3.StringUtils;
13
import org.cresques.cts.IProjection;
14
import org.gvsig.expressionevaluator.ExpressionBuilder;
15
import org.gvsig.fmap.dal.DataTypes;
16
import org.gvsig.fmap.dal.exception.DataException;
17
import org.gvsig.fmap.dal.feature.EditableFeatureAttributeDescriptor;
18
import org.gvsig.fmap.dal.feature.EditableFeatureType;
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.OperationsFactory.TableReference;
22
import org.gvsig.fmap.dal.store.jdbc2.spi.JDBCSQLBuilderBase;
23
import org.gvsig.fmap.dal.store.jdbc2.spi.SRSSolver;
24
import org.gvsig.fmap.dal.store.jdbc2.spi.operations.FetchFeatureTypeOperation;
25
import org.gvsig.fmap.geom.Geometry;
26
import org.gvsig.fmap.geom.GeometryLocator;
27
import org.gvsig.fmap.geom.GeometryManager;
28
import org.gvsig.fmap.geom.type.GeometryType;
29
import org.gvsig.postgresql.dal.PostgreSQLBuilder;
30

  
31
@SuppressWarnings("UseSpecificCatch")
32
public class PostgreSQLFetchFeatureTypeOperation extends FetchFeatureTypeOperation {
33

  
34
    private static Map<String,GeometryType>databaseGeometryTypes = null;
35
    
36
    public PostgreSQLFetchFeatureTypeOperation(
37
            JDBCHelper helper
38
        ) {
39
        super(helper);
40
    }
41

  
42
    private GeometryType getGT(
43
            GeometryManager manager, 
44
            int type, 
45
            int subtype
46
        ) {
47
        try {
48
            return manager.getGeometryType(type, subtype);
49
        } catch (Exception ex) {
50
            return null;
51
        }
52
    }
53
    
54
    public PostgreSQLFetchFeatureTypeOperation(
55
            JDBCHelper helper,
56
            EditableFeatureType featureType,
57
            TableReference table,
58
            List<String> primaryKeys,
59
            String defaultGeometryColumn,
60
            IProjection crs
61
        ) {
62
        super(helper, featureType, table, primaryKeys, defaultGeometryColumn, crs);
63
    }            
64

  
65
    @Override
66
    public void fetch(EditableFeatureType featureType, Connection conn, TableReference table, List<String> pks, String defaultGeometryColumn, IProjection crs) throws DataException {
67
        super.fetch(featureType, conn, table, pks, defaultGeometryColumn, crs);
68
    }
69

  
70
    @Override
71
    protected int getDataTypeFromMetadata(
72
            ResultSetMetaData rsMetadata,
73
            int colIndex
74
        ) throws SQLException {
75

  
76
        return super.getDataTypeFromMetadata(rsMetadata, colIndex);
77
    }
78
    
79
    @Override
80
    protected String getSQLToRetrievePrimaryKeysFromInformationSchema(
81
            String catalog,
82
            String schema,
83
            String table
84
        ) throws SQLException {
85
        PostgreSQLBuilder sqlbuilder = (PostgreSQLBuilder) this.createSQLBuilder();
86
        ExpressionBuilder expbuilder = sqlbuilder.expression();
87
        
88
        String column_COLUMN_NAME = "column_name";
89
        String column_CONSTRAINT_TYPE = "constraint_type";
90
        
91
        if( sqlbuilder.getDatabaseVersion().getMajor()<10 ) {
92
            column_COLUMN_NAME = "COLUMN_NAME";
93
            column_CONSTRAINT_TYPE = "CONSTRAINT_TYPE";
94
        }
95
        sqlbuilder.select().column().name(column_COLUMN_NAME);
96
        sqlbuilder.select().column().name(column_CONSTRAINT_TYPE);
97
        sqlbuilder.select().from().custom(
98
                "INFORMATION_SCHEMA.table_constraints t_cons "
99
                + "inner join INFORMATION_SCHEMA.key_column_usage c on "
100
                + "c.constraint_catalog = t_cons.constraint_catalog and "
101
                + "c.table_schema = t_cons.table_schema and "
102
                + "c.table_name = t_cons.table_name and "
103
                + "c.constraint_name = t_cons.constraint_name "
104
        );
105
        sqlbuilder.select().where().set(
106
                expbuilder.like(
107
                        expbuilder.custom("c.TABLE_NAME"), 
108
                        expbuilder.constant(table)
109
                )
110
        );
111
        if (schema != null) {
112
            sqlbuilder.select().where().and(
113
                    expbuilder.like(
114
                            expbuilder.custom("c.TABLE_SCHEMA"),
115
                            expbuilder.constant(schema)
116
                    )
117
            );
118
        }
119
        if (catalog != null) {
120
            sqlbuilder.select().where().and(
121
                    expbuilder.like(
122
                            expbuilder.custom("c.CONSTRAINT_CATALOG"),
123
                            expbuilder.constant(catalog)
124
                    )
125
            );
126
        }
127
        sqlbuilder.select().where().and(
128
                expbuilder.eq(
129
                        expbuilder.column(column_CONSTRAINT_TYPE),
130
                        expbuilder.constant("PRIMARY KEY")
131
                )
132
        );
133
        return sqlbuilder.toString();
134
    }
135
        
136
    @Override
137
    protected void fetchGeometryTypeAndSRS(
138
            EditableFeatureAttributeDescriptor attr,
139
            ResultSetMetaData rsMetadata,
140
            int colIndex
141
        ) {
142
        if( attr.getType()!=DataTypes.GEOMETRY ) {
143
            return;
144
        }
145
        try {
146
            JDBCSQLBuilderBase sqlbuilder = this.createSQLBuilder();
147
            ExpressionBuilder expbuilder = sqlbuilder.expression();
148
            
149
            sqlbuilder.select().column().name("f_table_catalog");
150
            sqlbuilder.select().column().name("f_table_schema");
151
            sqlbuilder.select().column().name("f_table_name");
152
            sqlbuilder.select().column().name("f_geometry_column");
153
            sqlbuilder.select().column().name("coord_dimension");
154
            sqlbuilder.select().column().name("srid");
155
            sqlbuilder.select().column().name("type");
156
            sqlbuilder.select().where().set(
157
                    expbuilder.eq(
158
                            expbuilder.column("f_table_name"),
159
                            expbuilder.constant(this.getTable().getTable())
160
                    )
161
            );                
162
            sqlbuilder.select().where().and(
163
                    expbuilder.eq(
164
                            expbuilder.column("f_geometry_column"),
165
                            expbuilder.constant(attr.getName())
166
                    )
167
            );         
168
            sqlbuilder.select().from().table().name("geometry_columns");
169
            Statement st = null;
170
            ResultSet rs = null;
171
            
172
            Integer srsid = null;
173
            String geometryTypeName = null;
174
            try {
175
                st = this.getConnection().createStatement();
176
                rs = JDBCUtils.executeQuery(st, sqlbuilder.toString());
177
                if (rs.next()) {
178
                    srsid = rs.getInt("srid");
179
                    geometryTypeName = rs.getString("type");
180
                }
181
            } finally {
182
                JDBCUtils.closeQuietly(rs);
183
                JDBCUtils.closeQuietly(st);
184
            }
185
            if( !StringUtils.isEmpty(geometryTypeName) ) {
186
                GeometryType gt = getGeometryTypeFromDatabaseTypeName(geometryTypeName);
187
                attr.setGeometryType(gt);
188
            }
189
            if( srsid!=null ) {
190
                SRSSolver srssolver = this.helper.getSRSSolver();
191
                attr.setSRS(srssolver.getProjection(this.getConnection(),srsid));
192
            }
193
        } catch (Exception ex) {
194
            LOGGER.debug("Can't get geometry type and srs from column '"+attr.getName()+"'.",ex);
195
        }
196
    }
197

  
198
    private GeometryType getGeometryTypeFromDatabaseTypeName(String typeName) {
199
        if( databaseGeometryTypes==null ) {
200
            GeometryManager manager = GeometryLocator.getGeometryManager();
201
            databaseGeometryTypes = new HashMap<>();
202
            databaseGeometryTypes.put("POINT", getGT(manager, Geometry.TYPES.POINT,Geometry.SUBTYPES.GEOM2D));
203
            databaseGeometryTypes.put("POINTZ", getGT(manager, Geometry.TYPES.POINT,Geometry.SUBTYPES.GEOM3D));
204
            databaseGeometryTypes.put("POINTM", getGT(manager, Geometry.TYPES.POINT,Geometry.SUBTYPES.GEOM2DM));
205
            databaseGeometryTypes.put("POINTZM", getGT(manager, Geometry.TYPES.POINT,Geometry.SUBTYPES.GEOM3DM));
206
            
207
            databaseGeometryTypes.put("LINESTRING", getGT(manager, Geometry.TYPES.LINE,Geometry.SUBTYPES.GEOM2D));
208
            databaseGeometryTypes.put("LINESTRINGZ", getGT(manager, Geometry.TYPES.LINE,Geometry.SUBTYPES.GEOM3D));
209
            databaseGeometryTypes.put("LINESTRINGM", getGT(manager, Geometry.TYPES.LINE,Geometry.SUBTYPES.GEOM2DM));
210
            databaseGeometryTypes.put("LINESTRINGZM", getGT(manager, Geometry.TYPES.LINE,Geometry.SUBTYPES.GEOM3DM));
211
            
212
            databaseGeometryTypes.put("POLYGON", getGT(manager, Geometry.TYPES.POLYGON,Geometry.SUBTYPES.GEOM2D));
213
            databaseGeometryTypes.put("POLYGONZ", getGT(manager, Geometry.TYPES.POLYGON,Geometry.SUBTYPES.GEOM3D));
214
            databaseGeometryTypes.put("POLYGONM", getGT(manager, Geometry.TYPES.POLYGON,Geometry.SUBTYPES.GEOM2DM));
215
            databaseGeometryTypes.put("POLYGONZM", getGT(manager, Geometry.TYPES.POLYGON,Geometry.SUBTYPES.GEOM3DM));
216

  
217
            databaseGeometryTypes.put("MULTIPOINT", getGT(manager, Geometry.TYPES.MULTIPOINT,Geometry.SUBTYPES.GEOM2D));
218
            databaseGeometryTypes.put("MULTIPOINTZ", getGT(manager, Geometry.TYPES.MULTIPOINT,Geometry.SUBTYPES.GEOM3D));
219
            databaseGeometryTypes.put("MULTIPOINTM", getGT(manager, Geometry.TYPES.MULTIPOINT,Geometry.SUBTYPES.GEOM2DM));
220
            databaseGeometryTypes.put("MULTIPOINTZM", getGT(manager, Geometry.TYPES.MULTIPOINT,Geometry.SUBTYPES.GEOM3DM));
221

  
222
            databaseGeometryTypes.put("MULTILINESTRING", getGT(manager, Geometry.TYPES.MULTILINE,Geometry.SUBTYPES.GEOM2D));
223
            databaseGeometryTypes.put("MULTILINESTRINGZ", getGT(manager, Geometry.TYPES.MULTILINE,Geometry.SUBTYPES.GEOM3D));
224
            databaseGeometryTypes.put("MULTILINESTRINGM", getGT(manager, Geometry.TYPES.MULTILINE,Geometry.SUBTYPES.GEOM2DM));
225
            databaseGeometryTypes.put("MULTILINESTRINGZM", getGT(manager, Geometry.TYPES.MULTILINE,Geometry.SUBTYPES.GEOM3DM));
226

  
227
            databaseGeometryTypes.put("MULTIPOLYGON", getGT(manager, Geometry.TYPES.MULTIPOLYGON,Geometry.SUBTYPES.GEOM2D));
228
            databaseGeometryTypes.put("MULTIPOLYGONZ", getGT(manager, Geometry.TYPES.MULTIPOLYGON,Geometry.SUBTYPES.GEOM3D));
229
            databaseGeometryTypes.put("MULTIPOLYGONM", getGT(manager, Geometry.TYPES.MULTIPOLYGON,Geometry.SUBTYPES.GEOM2DM));
230
            databaseGeometryTypes.put("MULTIPOLYGONZM", getGT(manager, Geometry.TYPES.MULTIPOLYGON,Geometry.SUBTYPES.GEOM3DM));
231

  
232
            databaseGeometryTypes.put("GEOMETRY", getGT(manager, Geometry.TYPES.GEOMETRY,Geometry.SUBTYPES.GEOM2D));
233
            databaseGeometryTypes.put("GEOMETRYZ", getGT(manager, Geometry.TYPES.GEOMETRY,Geometry.SUBTYPES.GEOM3D));
234
            databaseGeometryTypes.put("GEOMETRYM", getGT(manager, Geometry.TYPES.GEOMETRY,Geometry.SUBTYPES.GEOM2DM));
235
            databaseGeometryTypes.put("GEOMETRYZM", getGT(manager, Geometry.TYPES.GEOMETRY,Geometry.SUBTYPES.GEOM3DM));
236
        }
237
        return databaseGeometryTypes.get(typeName);
238
    }
239
    
240
}
tags/org.gvsig.postgresql-2.0.109/org.gvsig.postgresql.provider/src/main/java/org/gvsig/postgresql/dal/operations/PostgreSQLOperationsFactory.java
1

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

  
4
import java.util.List;
5
import org.cresques.cts.IProjection;
6
import org.gvsig.fmap.dal.feature.EditableFeatureType;
7
import org.gvsig.fmap.dal.store.jdbc2.JDBCHelper;
8
import org.gvsig.fmap.dal.store.jdbc2.spi.operations.FetchFeatureTypeOperation;
9
import org.gvsig.fmap.dal.store.jdbc2.spi.operations.OperationsFactoryBase;
10

  
11

  
12
public class PostgreSQLOperationsFactory extends OperationsFactoryBase {
13
    
14
    public PostgreSQLOperationsFactory(JDBCHelper helper) {
15
        super(helper);
16
    }
17

  
18
    @Override
19
    public FetchFeatureTypeOperation createFetchFeatureType(EditableFeatureType type, TableReference table, List<String> primaryKeys, String defaultGeometryField, IProjection crs) {
20
        return new PostgreSQLFetchFeatureTypeOperation(
21
                helper, type, table, primaryKeys, 
22
                defaultGeometryField, crs
23
        );
24
    }  
25
    
26
}
tags/org.gvsig.postgresql-2.0.109/org.gvsig.postgresql.provider/src/main/java/org/gvsig/postgresql/dal/PostgreSQLStoreParameters.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.postgresql.dal;
23

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

  
27
public class PostgreSQLStoreParameters extends JDBCStoreParameters implements PostgreSQLConnectionParameters {
28

  
29
    private final PostgreSQLConnectionParametersHelper helper;
30
    
31
    public PostgreSQLStoreParameters() {
32
        super(
33
                PostgreSQLLibrary.NAME + "StoreParameters",
34
                PostgreSQLLibrary.NAME
35
        );
36
        this.helper = new PostgreSQLConnectionParametersHelper(this);
37
    }
38

  
39
    @Override
40
    public String getUrl() {
41
        return this.helper.getUrl();
42
    }
43
    
44
    @Override
45
    public void validate() throws ValidateDataParametersException {
46
        this.helper.validate();
47
        super.validate();
48
    }
49

  
50
    @Override
51
    public boolean getUseSSL() {
52
        return this.helper.getUseSSL();
53
    }
54

  
55
    @Override
56
    public int getMaxIdle() {
57
        return this.helper.getMaxIdle();
58
    }
59

  
60
    public void setUseSSL(boolean v) {
61
        this.helper.setUseSSL(v);
62
    }
63

  
64

  
65
}
tags/org.gvsig.postgresql-2.0.109/org.gvsig.postgresql.provider/src/main/java/org/gvsig/postgresql/dal/PostgreSQLConnectionParameters.java
1

  
2
package org.gvsig.postgresql.dal;
3

  
4
import org.gvsig.fmap.dal.resource.db.DBParameters;
5
import org.gvsig.fmap.dal.store.jdbc.JDBCConnectionParameters;
6

  
7
public interface PostgreSQLConnectionParameters extends JDBCConnectionParameters, DBParameters {
8
	public static final String USESSL_PARAMTER_NAME = "UseSSL";
9
	public static final String MAXIDLE_PARAMTER_NAME = "maxIdle";
10

  
11
	public boolean getUseSSL();   
12
    
13
    public int getMaxIdle();
14
}
tags/org.gvsig.postgresql-2.0.109/org.gvsig.postgresql.provider/src/main/java/org/gvsig/postgresql/dal/PostgreSQLConnectionParametersHelper.java
1

  
2
package org.gvsig.postgresql.dal;
3

  
4
import org.apache.commons.lang3.StringUtils;
5
import org.gvsig.fmap.dal.DataParameters;
6
import org.gvsig.fmap.dal.exception.ValidateDataParametersException;
7
import org.gvsig.fmap.dal.store.jdbc.JDBCConnectionParameters;
8

  
9

  
10
public class PostgreSQLConnectionParametersHelper {
11

  
12
    private final JDBCConnectionParameters parameters;
13
    
14
    public PostgreSQLConnectionParametersHelper(JDBCConnectionParameters parameters) {
15
        this.parameters = parameters;
16
    }
17

  
18
    public String getUrl() {
19
        String url = (String) this.getDynValue(JDBCConnectionParameters.URL_PARAMTER_NAME);
20
        if( StringUtils.isEmpty(url) ) {
21
            url = PostgreSQLHelper.getConnectionURL((PostgreSQLConnectionParameters) this.parameters);
22
            this.setDynValue(JDBCConnectionParameters.URL_PARAMTER_NAME,url);
23
        }
24
        return url;
25
    }
26
    
27
    public void validate() throws ValidateDataParametersException {
28
        if (this.getDynValue(JDBCConnectionParameters.JDBC_DRIVER_CLASS_PARAMTER_NAME) == null) {
29
            this.setDynValue(
30
                JDBCConnectionParameters.JDBC_DRIVER_CLASS_PARAMTER_NAME,
31
                PostgreSQLHelper.POSTGRESQL_JDBC_DRIVER
32
            );
33
        }
34
        if( this.getDynValue(JDBCConnectionParameters.PORT_PARAMTER_NAME)==null ) {
35
            this.setDynValue(JDBCConnectionParameters.PORT_PARAMTER_NAME, 5432);
36
        }
37
		if ( StringUtils.isEmpty((CharSequence) this.getDynValue(JDBCConnectionParameters.URL_PARAMTER_NAME))) {
38
            String url = PostgreSQLHelper.getConnectionURL(
39
                parameters.getHost(),
40
                parameters.getPort(),
41
                parameters.getDBName()
42
            );
43
            this.setDynValue(JDBCConnectionParameters.URL_PARAMTER_NAME, url);
44
		}
45
    }
46

  
47
    private Object getDynValue(String name) {
48
        return ((DataParameters)this.parameters).getDynValue(name);
49
    }
50
    
51
    private void setDynValue(String name, Object value) {
52
        ((DataParameters)this.parameters).setDynValue(name,value);
53
    }
54
    
55
    public int getMaxIdle() {
56
        return (int) this.getDynValue(PostgreSQLConnectionParameters.MAXIDLE_PARAMTER_NAME);
57
    }
58

  
59
    public boolean getUseSSL() {
60
        return (boolean) this.getDynValue(PostgreSQLConnectionParameters.USESSL_PARAMTER_NAME);
61
    }
62

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

Also available in: Unified diff