Statistics
| Revision:

svn-gvsig-desktop / trunk / org.gvsig.desktop / org.gvsig.desktop.compat.cdc / org.gvsig.fmap.dal / org.gvsig.fmap.dal.db / org.gvsig.fmap.dal.db.mdb / src / main / java / org / gvsig / fmap / dal / store / mdb / MDBSQLBuilder.java @ 44951

History | View | Annotate | Download (30.9 KB)

1
package org.gvsig.fmap.dal.store.mdb;
2

    
3
import java.sql.PreparedStatement;
4
import java.sql.SQLException;
5
import java.sql.Timestamp;
6
import java.text.MessageFormat;
7
import java.util.ArrayList;
8
import java.util.Date;
9
import java.util.List;
10
import java.util.Objects;
11
import org.apache.commons.lang3.tuple.Pair;
12
import org.gvsig.expressionevaluator.ExpressionBuilder;
13
import static org.gvsig.expressionevaluator.ExpressionBuilder.PARAMETER_TYPE_CONSTANT;
14
import static org.gvsig.expressionevaluator.ExpressionBuilder.PARAMETER_TYPE_VARIABLE;
15
import org.gvsig.expressionevaluator.ExpressionBuilder.Parameter;
16
import org.gvsig.expressionevaluator.Formatter;
17
import org.gvsig.expressionevaluator.GeometryExpressionBuilderHelper;
18
import static org.gvsig.expressionevaluator.GeometryExpressionBuilderHelper.PARAMETER_TYPE_GEOMETRY;
19
import org.gvsig.fmap.dal.DataTypes;
20
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
21
import org.gvsig.fmap.dal.feature.FeatureReference;
22
import org.gvsig.fmap.dal.feature.FeatureType;
23
import org.gvsig.fmap.dal.feature.spi.FeatureProvider;
24
import org.gvsig.fmap.dal.store.mdb.expressionbuilderformatter.MDBFormatter;
25
import org.gvsig.fmap.dal.store.jdbc2.spi.JDBCSQLBuilderBase;
26
import org.gvsig.fmap.dal.store.mdb.MDBHelper;
27
import org.gvsig.fmap.geom.Geometry;
28
import org.gvsig.fmap.geom.exception.CreateGeometryException;
29
import org.gvsig.tools.dispose.Disposable;
30

    
31
public class MDBSQLBuilder extends JDBCSQLBuilderBase {
32

    
33
    protected Formatter formatter = null;
34
    
35
    public MDBSQLBuilder(MDBHelper helper) {
36
        super(helper);
37
        
38
        this.defaultSchema = "";
39
        this.supportSchemas = false;
40
        this.allowAutomaticValues = true;
41
        this.geometrySupportType = this.helper.getGeometrySupportType();
42
        this.hasSpatialFunctions = this.helper.hasSpatialFunctions();
43

    
44
        this.STMT_DELETE_GEOMETRY_COLUMN_FROM_TABLE_schema_table = null;
45
        this.STMT_DELETE_GEOMETRY_COLUMN_FROM_TABLE_table = null;
46
         
47
        this.STMT_UPDATE_TABLE_STATISTICS_table = "ANALYZE SAMPLE_SIZE 0";
48

    
49
        this.type_boolean = "BOOLEAN";
50
        this.type_byte = "TINYINT";
51
        this.type_bytearray = "BLOB";
52
        this.type_geometry = "GEOMETRY";
53
        this.type_char = "CHAR";
54
        this.type_date = "DATETIME";
55
        this.type_double = "FLOAT"; 
56
        this.type_decimal_ps = "DECIMAL({0,Number,##########},{1,Number,##########})";
57
        this.type_decimal_p = "DECIMAL({0,Number,##########})";
58
        this.type_float = "REAL";
59
        this.type_int = "INTEGER";
60
        this.type_long = "DECIMAL(19,0)";
61
        this.type_string = "VARCHAR";
62
        this.type_string_p = "VARCHAR({0,Number,##########})";
63
        this.type_time = "DATETIME";
64
        this.type_timestamp = "DATETIME";
65
        this.type_version = "VARCHAR";
66
        this.type_URI = "VARCHAR";
67
        this.type_URL = "VARCHAR";
68
        this.type_FILE = "VARCHAR";
69
        this.type_FOLDER = "VARCHAR";        
70
    }
71

    
72
    @Override
73
    protected Formatter formatter() {
74
        if( this.formatter==null ) {
75
            this.formatter = new MDBFormatter(this);
76
        }
77
        return this.formatter;
78
    }
79

    
80
    public class MDBTableNameBuilderBase extends TableNameBuilderBase {
81

    
82
        @Override
83
        public boolean has_database() {
84
            return false;
85
        }
86
        
87
    }
88

    
89
    public class MDBCreateIndexBuilder extends CreateIndexBuilderBase {
90
    
91
        @Override
92
        public List<String> toStrings(Formatter formatter) {
93
            StringBuilder builder = new StringBuilder();
94
            builder.append("CREATE ");
95
            if( this.isUnique ) {
96
                builder.append("UNIQUE ");
97
            }
98
            if( this.isSpatial ) {
99
                builder.append("SPATIAL ");
100
            }
101
            builder.append("INDEX ");
102
            if( this.ifNotExist ) {
103
                builder.append("IF NOT EXISTS ");
104
            }
105
            builder.append(as_identifier(this.indexName));
106
            builder.append(" ON ");
107
            builder.append(this.table.toString(formatter));
108
            builder.append(" ( ");
109
            boolean is_first_column = true;
110
            for( String column : this.columns) {
111
                if( is_first_column ) {
112
                    is_first_column = false;
113
                } else {
114
                    builder.append(", ");
115
                }
116
                builder.append(as_identifier(column));
117
            }
118
            builder.append(" )");
119
            
120
            List<String> sqls = new ArrayList<>();
121
            sqls.add(builder.toString());
122
            return sqls;
123
        }
124

    
125
    }
126
        
127
    protected class MDBAlterTableBuilderBase extends AlterTableBuilderBase {
128
        @Override
129
        public List<String> toStrings(Formatter formatter) {
130
            List<String> sqls = new ArrayList<>();
131
            if( this.isEmpty() ) {
132
                return sqls;
133
            }
134
            for (String column : drops) {
135
                StringBuilder builder = new StringBuilder();
136
                builder.append("ALTER TABLE ");
137
                builder.append(this.table.toString(formatter));
138
                builder.append(" DROP COLUMN IF EXISTS ");
139
                builder.append(as_identifier(column)); 
140
                sqls.add(builder.toString());
141
            }
142
            for (ColumnDescriptor column : adds) {
143
                StringBuilder builder = new StringBuilder();
144
                builder.append("ALTER TABLE ");
145
                builder.append(this.table.toString(formatter));
146
                builder.append(" ADD COLUMN ");
147
                builder.append(as_identifier(column.getName())); 
148
                builder.append(" ");
149
                if( column.getType() == DataTypes.INT && column.isAutomatic() ) {
150
                    builder.append(" SERIAL");
151
                } else {
152
                    builder.append(
153
                        sqltype(
154
                            column.getType(), 
155
                            column.getSize(),
156
                            column.getPrecision(), 
157
                            column.getScale(), 
158
                            column.getGeometryType(), 
159
                            column.getGeometrySubtype()
160
                        )
161
                    );
162
                }
163
                if (column.getDefaultValue() == null) {
164
                    if (column.allowNulls()) {
165
                        builder.append(" DEFAULT NULL");
166
                    }
167
                } else {
168
                    builder.append(" DEFAULT '");
169
                    builder.append(Objects.toString(column.getDefaultValue(),""));
170
                    builder.append("'");
171
                }
172
                if (column.allowNulls()) {
173
                    builder.append(" NULL");
174
                } else {
175
                    builder.append(" NOT NULL");
176
                }
177
                if (column.isPrimaryKey()) {
178
                    builder.append(" PRIMARY KEY");
179
                }
180
                sqls.add(builder.toString());
181
                
182
//                if( column.isGeometry() ) {
183
//                    String constraint_name = "constraint_" + this.table().getName() + "_" + column.getName()+"_geom";
184
//                    String sql;
185
//                    if( column.getGeometrySRSId()==null ) {
186
//                      sql = MessageFormat.format(
187
//                            "ALTER TABLE \"{0}\".\"{1}\" ADD CONSTRAINT IF NOT EXISTS \"{2}\" CHECK NVL2(\"{3}\", ST_GeometryTypeCode(\"{3}\") = {4,number,###} AND ST_CoordDim(\"{3}\") = {5,number,###}, TRUE)",
188
//                            this.table().getSchema(),
189
//                            this.table().getName(),
190
//                            constraint_name,
191
//                            column.getName(),
192
//                            sqlgeometrytype(column.getGeometryType(),column.getGeometrySubtype()),
193
//                            sqlgeometrynumdimension(column.getGeometryType(),column.getGeometrySubtype()),
194
//                            column.getGeometrySRSId() 
195
//                      );
196
//                    } else {
197
//                      sql = MessageFormat.format(
198
//                            "ALTER TABLE \"{0}\".\"{1}\" ADD CONSTRAINT IF NOT EXISTS \"{2}\" CHECK NVL2(\"{3}\", ST_GeometryTypeCode(\"{3}\") = {4,number,###} AND ST_CoordDim(\"{3}\") = {5,number,###} AND ST_SRID(\"{3}\") = {6,number,#####}, TRUE)",
199
//                            this.table().getSchema(),
200
//                            this.table().getName(),
201
//                            constraint_name,
202
//                            column.getName(),
203
//                            sqlgeometrytype(column.getGeometryType(),column.getGeometrySubtype()),
204
//                            sqlgeometrynumdimension(column.getGeometryType(),column.getGeometrySubtype()),
205
//                            column.getGeometrySRSId() 
206
//                      );
207
//                    }
208
//                    sqls.add(sql);
209
//                }
210
            }
211
            for (ColumnDescriptor column : alters) {
212
                StringBuilder builder = new StringBuilder();
213
                builder.append("ALTER TABLE ");
214
                builder.append(this.table.toString(formatter));
215
                builder.append(" ALTER COLUMN ");
216
                builder.append(as_identifier(column.getName())); 
217
                builder.append(" ");
218
                builder.append(
219
                    sqltype(
220
                        column.getType(), 
221
                        column.getSize(),
222
                        column.getPrecision(), 
223
                        column.getScale(), 
224
                        column.getGeometryType(), 
225
                        column.getGeometrySubtype()
226
                    )
227
                );
228
                if (column.getDefaultValue() == null) {
229
                    if (column.allowNulls()) {
230
                        builder.append(" DEFAULT NULL");
231
                    }
232
                } else {
233
                    builder.append(" DEFAULT '");
234
                    builder.append(column.getDefaultValue().toString());
235
                    builder.append("'");
236
                }
237
                if( column.isAutomatic() ) {
238
                    builder.append(" AUTO_INCREMENT");
239
                }
240
                sqls.add(builder.toString());
241
//                if( column.isGeometry() ) {
242
//                    String sql;
243
//                    String constraint_name = "constraint_" + this.table().getName() + "_" + column.getName()+"_dim";
244
//                    sql = MessageFormat.format(
245
//                        "ALTER TABLE \"{0}\".\"{1}\" ADD CONSTRAINT IF NOT EXISTS \"{2}\" CHECK ST_CoordDim(\"{3}\") = {4}",
246
//                        this.table().getSchema(),
247
//                        this.table().getName(),
248
//                        constraint_name,
249
//                        column.getName(),
250
//                        sqlgeometrynumdimension(column.getGeometryType(),column.getGeometrySubtype())
251
//                    );
252
//                    sqls.add(sql);
253
//                }
254
            }
255
            for (Pair<String,String> pair : renames) {
256
                StringBuilder builder = new StringBuilder();
257
                builder.append("ALTER TABLE ");
258
                builder.append(this.table.toString(formatter));
259
                builder.append(" RENAME COLUMN ");
260
                builder.append(as_identifier(pair.getLeft())); 
261
                builder.append(" TO ");
262
                builder.append(as_identifier(pair.getRight())); 
263
                sqls.add(builder.toString());
264
            }
265
            return sqls;
266
        }
267

    
268
    }
269

    
270
    protected class MDBCreateTableBuilder extends CreateTableBuilderBase {
271

    
272
        @Override
273
        public List<String> toStrings(Formatter formatter) {
274

    
275
            List<String> sqls = new ArrayList<>();
276
            StringBuilder builder = new StringBuilder();
277

    
278
            builder.append("CREATE TABLE ");
279
            builder.append(this.table.toString(formatter));
280
            builder.append(" (");
281
            boolean first = true;
282
            for (ColumnDescriptor column : columns) {
283
                if( column.isGeometry() ) {
284
                    continue;
285
                }
286

    
287
                if (first) {
288
                    first = false;
289
                } else {
290
                    builder.append(", ");
291
                }
292
                builder.append(as_identifier(column.getName()));
293
                builder.append(" ");
294
                builder.append(
295
                    sqltype(
296
                        column.getType(), 
297
                        column.getSize(),
298
                        column.getPrecision(), 
299
                        column.getScale(), 
300
                        column.getGeometryType(), 
301
                        column.getGeometrySubtype()
302
                    )
303
                );
304
                if( column.isGeometry() ) {
305
//                    //
306
//                    // https://github.com/orbisgis/h2gis/wiki/1.-Spatial-data#geometry-columns-view
307
//                    // https://github.com/orbisgis/h2gis/blob/master/h2gis-functions/src/main/java/org/h2gis/functions/spatial/type/GeometryTypeFromConstraint.java
308
//                    //
309
//                    if( column.getGeometrySRSId()==null ) {
310
//                      builder.append( 
311
//                          MessageFormat.format(
312
//                            " CHECK NVL2(\"{0}\", ST_GeometryTypeCode(\"{0}\") = {1} AND ST_CoordDim(\"{0}\") = {2}, TRUE)",
313
//                            column.getName(),
314
//                            sqlgeometrytype(column.getGeometryType(),column.getGeometrySubtype()),
315
//                            sqlgeometrynumdimension(column.getGeometryType(),column.getGeometrySubtype())                        )
316
//                      );
317
//                    } else {
318
//                      builder.append( 
319
//                          MessageFormat.format(
320
//                            " CHECK NVL2(\"{0}\", ST_GeometryTypeCode(\"{0}\") = {1,number,###} AND ST_CoordDim(\"{0}\") = {2,number,###} AND ST_SRID(\"{0}\") = {3,number,#####}, TRUE)",
321
//                            column.getName(),
322
//                            sqlgeometrytype(column.getGeometryType(),column.getGeometrySubtype()),
323
//                            sqlgeometrynumdimension(column.getGeometryType(),column.getGeometrySubtype()),
324
//                            column.getGeometrySRSId() 
325
//                        )
326
//                      );
327
//                    }
328

    
329
                } else {
330
                    if (column.isPrimaryKey()) {
331
                        builder.append(" PRIMARY KEY");
332
                        if( column.isAutomatic() ) {
333
                            builder.append(" AUTO_INCREMENT");
334
                        }
335
                    } else {
336
                        if( column.isAutomatic() ) {
337
                            builder.append(" AUTO_INCREMENT");
338
                        }
339
                        if (column.getDefaultValue() == null) {
340
                            if (column.allowNulls()) {
341
                                builder.append(" DEFAULT NULL");
342
                            }
343
                        } else {
344
                            if( column.getType() == DataTypes.DATE ) {
345
                                builder.append(" DEFAULT ( TIMESTAMP '");
346
                                Date d = (Date) column.getDefaultValue();
347
                                builder.append(MessageFormat.format( "{0,date,yyyy-MM-dd HH:mm:ss.S}",d));
348
                                builder.append("' )");
349
                            } else {
350
                                builder.append(" DEFAULT '");
351
                                builder.append(Objects.toString(column.getDefaultValue(),""));
352
                                builder.append("'");
353
                            }
354
                        }
355
                    }
356
                }
357
                if (!column.allowNulls()) {
358
                    builder.append(" NOT NULL");
359
                }
360
            }
361
            builder.append(" )");
362
            sqls.add(builder.toString());
363
            return sqls;
364
        }
365
    }
366
    
367
    public class MDBInsertColumnBuilderBase extends InsertColumnBuilderBase {
368
        @Override
369
       public String toString(Formatter<ExpressionBuilder.Value> formatter) {
370
            if( formatter!=null && formatter.canApply(this) ) {
371
                return formatter.format(this);
372
            }
373
            return this.value.toString(formatter);
374
        }
375
    }
376
    
377
    public class MDBInsertBuilderBase extends InsertBuilderBase {
378
        @Override
379
        public String toString(Formatter formatter) {
380
            return super.toString(formatter);
381
        }
382
    }
383
    
384
    public class MDBSelectBuilderBase extends SelectBuilderBase {
385
        
386
        @Override
387
        public String toString(Formatter formatter) {
388
            StringBuilder builder = new StringBuilder();
389
            if( !isValid(builder) ) {
390
                throw new IllegalStateException(builder.toString());
391
            }
392
            builder.append("SELECT ");
393
            if( this.distinct ) {
394
                builder.append("DISTINCT ");
395
            }
396
            boolean first = true;
397
            for (SelectColumnBuilder column : columns) {
398
                if (first) {
399
                    first = false;
400
                } else {
401
                    builder.append(", ");
402
                }
403
                builder.append(column.toString(formatter));
404
            }
405

    
406
            if ( this.has_from() ) {
407
                builder.append(" FROM ");
408
                builder.append(this.from.toString(formatter));
409
            }
410
            if ( this.has_where() ) {
411
                builder.append(" WHERE ");
412
                builder.append(this.where.toString(formatter));
413
            }
414
            if( this.has_group_by() ) {
415
                builder.append(" GROUP BY ");
416
                builder.append(this.groupColumn.get(0).toString(formatter));
417
                for (int i = 1; i < groupColumn.size(); i++) {
418
                    builder.append(", ");
419
                    builder.append(this.groupColumn.get(i).toString(formatter));
420
                }
421
            }
422
            if( this.has_order_by() ) {
423
                builder.append(" ORDER BY ");
424
                first = true;
425
                for (OrderByBuilder item : this.order_by) {
426
                    if (first) {
427
                        first = false;
428
                    } else {
429
                        builder.append(", ");
430
                    }
431
                    builder.append(item.toString(formatter));                    
432
                }   
433
            }
434
            
435
            if ( this.has_limit() && this.has_offset() ) {
436
                builder.append(" LIMIT ");
437
                builder.append(this.limit);
438
                builder.append(" OFFSET ");
439
                builder.append(this.offset);
440
                
441
            } else if ( this.has_limit()) {
442
                builder.append(" LIMIT ");
443
                builder.append(this.limit);
444

    
445
            } else if ( this.has_offset() ) {
446
                builder.append(" LIMIT -1 OFFSET ");
447
                builder.append(this.offset);    
448
            }
449
            return builder.toString();
450

    
451
        }
452
    }
453

    
454
    @Override
455
    public Object sqlgeometrydimension(int type, int subtype) {
456
        //'XY' or 2: 2D points, identified by X and Y coordinates
457
        //'XYM': 2D points, identified by X and Y coordinates. Each point stores an M-value (measure) as well
458
        //'XYZ' or 3: 3D points, identified by X, Y and Z coordinates
459
        //'XYZM' or 4: 3D points, identified by X, Y and Z coordinates. Each point stores an M-value (measure) as well
460
        switch(subtype) {
461
            case Geometry.SUBTYPES.GEOM2D:
462
            default:
463
                return "XY";
464
            case Geometry.SUBTYPES.GEOM2DM:
465
                return "XYM";
466
            case Geometry.SUBTYPES.GEOM3D:
467
                return "XYZ";
468
            case Geometry.SUBTYPES.GEOM3DM:
469
                return "XYZM";
470
        }
471
    }
472

    
473
    @Override
474
    public String sqltype(int type, int size, int precision, int scale, int geomtype, int geomSubtype) {
475
        if( type!=DataTypes.GEOMETRY ) {
476
            return super.sqltype(type, size, precision, scale, geomtype, geomSubtype);
477
        }
478
        return "GEOMETRY(1)";
479
    }
480
    
481
    @Override
482
    public Object sqlgeometrytype(int geomtype, int geomsubtype) {
483
        //
484
        // https://github.com/orbisgis/h2gis/wiki/1.-Spatial-data#geometry-columns-view
485
        //
486
        switch(geomtype) {
487
        case Geometry.TYPES.POINT:
488
            return 1; 
489
        case Geometry.TYPES.MULTIPOINT:
490
            return 4; 
491
        case Geometry.TYPES.LINE:
492
            return 2; 
493
        case Geometry.TYPES.MULTILINE:
494
            return 5; 
495
        case Geometry.TYPES.POLYGON:
496
            return 3; 
497
        case Geometry.TYPES.MULTIPOLYGON:
498
            return 6;
499
        case Geometry.TYPES.GEOMETRY:
500
        default:
501
            return 0; // "GEOMETRY";
502
        }
503
    }
504
    
505
    public Object sqlgeometrynumdimension(int type, int subtype) {
506
        int dimensions=2;
507
        switch(subtype) {
508
        case Geometry.SUBTYPES.GEOM3D:
509
            dimensions = 3;
510
            break;
511
        case Geometry.SUBTYPES.GEOM2D:
512
            dimensions = 2;
513
            break;
514
        case Geometry.SUBTYPES.GEOM2DM:
515
            dimensions = 2; // ??????
516
            break;
517
        case Geometry.SUBTYPES.GEOM3DM:
518
            dimensions = 3; // ??????
519
            break;
520
        }
521
        return dimensions;
522
    }
523
    
524
    @Override
525
    public MDBHelper getHelper() {
526
        return (MDBHelper) this.helper;
527
    }
528
   
529
    @Override
530
    public Disposable setParameters(PreparedStatement st, FeatureProvider feature) {
531
        try {
532
            FeatureType featureType = feature.getType();
533
            List<Object> values = new ArrayList<>();
534
            for (Parameter parameter : this.parameters()) {
535
                if (parameter.is_constant()) {
536
                    values.add(parameter.value());
537
                } else {
538
                    String name = parameter.name();
539
                    FeatureAttributeDescriptor descriptor = featureType.getAttributeDescriptor(name);
540
                    switch( descriptor.getType() ) {
541
                    case DataTypes.DATE:
542
                        Date value = (Date)(feature.get(name));
543
                        if( value == null ) {
544
                            values.add(null);
545
                        } else {
546
                            values.add(new java.sql.Date(value.getTime()));
547
                        }
548
                        break;
549
                    case DataTypes.GEOMETRY:
550
                        Geometry geom = this.forceGeometryType(
551
                            descriptor.getGeomType(),
552
                            (Geometry)(feature.get(name))
553
                        );
554
                        values.add(geom);
555
                        break;
556
                    default:
557
                        values.add(feature.get(name));
558
                        break;
559
                    }
560
                }
561
            }
562
            return this.setStatementParameters(st, values, this.geometry_support_type());
563
        } catch (SQLException | CreateGeometryException ex) {
564
            String f = "unknow";
565
            try {
566
                f = feature.toString();
567
            } catch (Exception ex2) {
568
                // Do nothing
569
            }
570
            throw new RuntimeException("Can't set parameters to prepared statement from the feature (" + f + ")", ex);
571
        }
572
    }
573

    
574
    @Override
575
    public InsertColumnBuilderBase createInsertColumnBuilder() {
576
        return new MDBInsertColumnBuilderBase();
577
    }
578
        
579
    @Override
580
    public InsertBuilderBase createInsertBuilder() {
581
        return new MDBInsertBuilderBase();
582
    }
583

    
584
    @Override
585
    public AlterTableBuilder createAlterTableBuilder() {
586
        return new MDBAlterTableBuilderBase();
587
    }
588
            
589
    @Override
590
    public TableNameBuilder createTableNameBuilder() {
591
        return new MDBTableNameBuilderBase();
592
    }
593
    
594
    @Override
595
    protected CreateTableBuilder createCreateTableBuilder() {
596
        return new MDBCreateTableBuilder();
597
    }
598

    
599
    @Override
600
    protected SelectBuilder createSelectBuilder() {
601
        return new MDBSelectBuilderBase();
602
    }
603

    
604
    @Override
605
    protected CreateIndexBuilder createCreateIndexBuilder() {
606
        return new MDBCreateIndexBuilder();
607
    }
608
    
609
    @Override
610
    public String as_identifier(String id) {
611
        if (id.startsWith("[")) {
612
            return id;
613
        }
614
        return "["+id+"]";
615
    }
616
    
617
    @Override
618
    public Disposable setStatementParameters(
619
            PreparedStatement st,
620
            List values,
621
            GeometryExpressionBuilderHelper.GeometrySupportType geometrySupportType) throws SQLException {
622

    
623
        if (values == null) {
624
            return new Disposable() {
625
                @Override
626
                public void dispose() {
627
                }
628
            };
629
        }
630
        if (true || LOGGER.isDebugEnabled()) {
631
            StringBuilder debug = new StringBuilder();
632
            debug.append("st.set(");
633
            try {
634
                byte[] bytes;
635
                int columnIndex = 1;
636
                for (Object value : values) {
637
                    if (value instanceof Geometry) {
638
                        switch (geometrySupportType) {
639
                            case WKT:
640
                                value = ((Geometry) value).convertToWKT();
641
                                debug.append("/*");
642
                                debug.append(columnIndex);
643
                                debug.append("*/ ");
644
                                debug.append(as_string(value));
645
                                debug.append(", ");
646
                                break;
647
                            case NATIVE:
648
                            case WKB:
649
                                bytes = ((Geometry) value).convertToWKB();
650
                                debug.append("/*");
651
                                debug.append(columnIndex);
652
                                debug.append("*/ ");
653
                                debug.append(as_string(bytes));
654
                                debug.append(", ");
655
                                break;
656
                            case EWKB:
657
                                bytes = ((Geometry) value).convertToEWKB();
658
                                debug.append("/*");
659
                                debug.append(columnIndex);
660
                                debug.append("*/ ");
661
                                debug.append(as_string(bytes));
662
                                debug.append(", ");
663
                                break;
664
                        }
665
                    } else {
666
                        debug.append("/*");
667
                        debug.append(columnIndex);
668
                        debug.append("*/ ");
669
                        if (value instanceof String) {
670
                            debug.append(as_string(value));
671
                        } else if (value instanceof Boolean) {
672
                            debug.append(((Boolean) value) ? constant_true : constant_false);
673
                        } else {
674
                            debug.append(value);
675
                        }
676
                        debug.append(", ");
677
                    }
678
                    columnIndex++;
679
                }
680
                debug.append(")");
681
                LOGGER.debug(debug.toString());
682
            } catch (Exception ex) {
683
            }
684
        }
685
        byte[] bytes;
686
        int columnIndex = 1;
687
        Object theValue;
688
        try {
689
            for (Object value : values) {
690
                theValue = value;
691

    
692
                if (value instanceof Geometry) {
693
                    switch (geometrySupportType) {
694
                        case WKT:
695
                            value = ((Geometry) value).convertToWKT();
696
                            st.setObject(columnIndex, value);
697
                            break;
698
                        case NATIVE:
699
                        case WKB:
700
                            bytes = ((Geometry) value).convertToWKB();
701
                            st.setBytes(columnIndex, bytes);
702
                            break;
703
                        case EWKB:
704
                            bytes = ((Geometry) value).convertToEWKB();
705
                            st.setBytes(columnIndex, bytes);
706
                            break;
707
                    }
708
                } else if (value instanceof Date) {
709
                    // Access solo soporta timestamp
710
                    value = new Timestamp(((Date) value).getTime());
711
                    st.setObject(columnIndex, value);
712
                } else {
713
                    if (value == null) {
714
                        st.setNull(columnIndex, java.sql.Types.BIT);
715
                    } else {
716
                        st.setObject(columnIndex, value);
717
                    }
718
                }
719
                columnIndex++;
720
            }
721
            return new Disposable() {
722
                @Override
723
                public void dispose() {
724
                }
725
            };
726
        } catch (Exception ex) {
727
            throw new SQLException("Can't set values for the prepared statement.", ex);
728
        }
729
    }
730

    
731
    @Override
732
    public List<Object> getParameters(FeatureProvider feature) {
733
        try {
734
            FeatureType type = feature.getType();
735
            List<Object> values = new ArrayList<>();
736
            Object value;
737
            for (Parameter parameter : this.parameters()) {
738
                if (parameter.is_constant()) {
739
                    value = parameter.value();
740
                    values.add(value);
741
                } else {
742
                    String name = parameter.name();
743
                    value = feature.get(name);
744
                    FeatureAttributeDescriptor attrDesc = type.getAttributeDescriptor(name);
745
                    switch (attrDesc.getType()) {
746
                        case org.gvsig.fmap.dal.DataTypes.BOOLEAN:
747
                            if (value == null) {
748
                                value = false;
749
                            }
750
                            values.add(value);
751
                            break;
752
                        case org.gvsig.fmap.dal.DataTypes.DATE:
753
                            if (value == null) {
754
                                values.add(null);
755
                            } else {
756
                                values.add(new java.sql.Date(((Date) value).getTime()));
757
                            }
758
                            break;
759
                        case org.gvsig.fmap.dal.DataTypes.GEOMETRY:
760
                            Geometry geom = this.forceGeometryType(
761
                                    attrDesc.getGeomType(),
762
                                    (Geometry) value
763
                            );
764
                            values.add(geom);
765
                            break;
766
                        default:
767
                            values.add(value);
768
                            break;
769
                    }
770
                }
771
            }
772
            return values;
773
        } catch (Exception ex) {
774
            String f = "unknow";
775
            try {
776
                f = feature.toString();
777
            } catch (Exception ex2) {
778
                // Do nothing
779
            }
780
            throw new RuntimeException("Can't get parameters to prepared statement from the feature (" + f + ")", ex);
781
        }
782
    }
783

    
784

    
785
    
786
    
787
    
788

    
789
}