Revision 47606 trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.db/org.gvsig.fmap.dal.db.jdbc/src/main/java/org/gvsig/fmap/dal/store/jdbc2/spi/operations/PerformChangesOperation.java

View differences:

PerformChangesOperation.java
27 27
import java.sql.SQLException;
28 28
import java.sql.Statement;
29 29
import java.util.Arrays;
30
import java.util.HashMap;
30 31
import java.util.Iterator;
31 32
import java.util.List;
33
import java.util.Map;
32 34
import java.util.Objects;
33 35
import org.apache.commons.collections.CollectionUtils;
34 36
import org.apache.commons.lang3.StringUtils;
......
392 394
                    params.getGeometryType(),
393 395
                    params.getGeometrySubtype()
394 396
                );
395
            fetchFeatureType.perform();
397
            fetchFeatureType.perform(this.getConnection());
396 398
            return type;
397 399
        } catch(Throwable t){
398 400
            LOGGER.warn("Can't get current feature type from database of table = "+Objects.toString(this.table), t);
......
402 404

  
403 405
    public List<String> getUpdateTableSQLs() {
404 406
        FeatureType currentFeatureTypeDB = getCurrentFeatureTypeDB();
407
        Map<String, Bitmask> changes = getUpdateTableChanges(currentFeatureTypeDB);
408
        List<String> sqls = getUpdateTableSQLs(currentFeatureTypeDB, changes);
409
        return sqls;
410
    }
411
    
412
    public List<String> getUpdateTableSQLs(FeatureType currentFeatureTypeDB, Map<String, Bitmask> changes) {
405 413
        
406 414
        JDBCSQLBuilderBase sqlbuilder = createSQLBuilder();
407
        sqlbuilder.alter_table().table()
415
        SQLBuilder.AlterTableBuilder alter_table = sqlbuilder.alter_table();
416
        alter_table.setProperty(PROP_FEATURE_TYPE, featureTypeTarget);
417
        alter_table.table()
408 418
                .database(this.table.getDatabase())
409 419
                .schema(this.table.getSchema())
410 420
                .name(this.table.getTable());
......
426 436
//        }
427 437

  
428 438
        // Comprobamos si hay que eliminar o modificar alguna columna existente
429
        for (FeatureAttributeDescriptor attrOrgiginal : currentFeatureTypeDB) {
430
            if( attrOrgiginal.isComputed() ) {
439
        for (FeatureAttributeDescriptor attrOriginal : currentFeatureTypeDB) {
440
            if( attrOriginal.isComputed() ) {
431 441
                continue;
432 442
            }
433 443
            FeatureAttributeDescriptor attrTarget = featureTypeTarget.getAttributeDescriptor(
434
                    attrOrgiginal.getName()
444
                    attrOriginal.getName()
435 445
            );
436 446
            if (attrTarget == null) {
437
                sqlbuilder.alter_table().drop_column(attrOrgiginal.getName());
447
                sqlbuilder.alter_table().drop_column(attrOriginal.getName());
438 448
            } else {
439
                Bitmask changes = this.getAlterTableChanges(attrOrgiginal, attrTarget);
440
                if( !changes.isEmpty() ) {
449
                Bitmask changesAttr = changes.get(attrOriginal.getName());
450
                if( !changesAttr.isEmpty() ) {
441 451
                    if( attrTarget.getType()==DataTypes.GEOMETRY ) {
442 452
                        sqlbuilder.alter_table().alter_geometry_column(
443
                                changes,
453
                                changesAttr,
444 454
                                attrTarget.getName(),
445 455
                                attrTarget.getGeomType().getType(),
446 456
                                attrTarget.getGeomType().getSubType(),
......
456 466
                            }
457 467
                        }
458 468
                        sqlbuilder.alter_table().alter_column(    
459
                                changes,
469
                                changesAttr,
460 470
                                attrTarget.getName(),
461 471
                                attrTarget.getType(),
462 472
                                attrTarget.getSize(),
......
479 489
            if( attrTarget.isComputed() ) {
480 490
                continue;
481 491
            }
482
            FeatureAttributeDescriptor attrOrgiginal = currentFeatureTypeDB.getAttributeDescriptor(
492
            FeatureAttributeDescriptor attrOriginal = currentFeatureTypeDB.getAttributeDescriptor(
483 493
                    attrTarget.getName()
484 494
            );
485
            if (attrOrgiginal == null) {
495
            if (attrOriginal == null) {
486 496
                if( attrTarget.getType()==DataTypes.GEOMETRY ) {
487 497
                    sqlbuilder.alter_table().add_geometry_column(
488 498
                            attrTarget.getName(),
......
525 535
        return sqls;
526 536
    }
527 537
    
538
    public Map<String, Bitmask> getUpdateTableChanges(FeatureType currentFeatureTypeDB) {
539
        Map<String, Bitmask> changes = new HashMap<>();
540
        // Comprobamos si hay que eliminar o modificar alguna columna existente
541
        for (FeatureAttributeDescriptor attrOriginal : currentFeatureTypeDB) {
542
            if( attrOriginal.isComputed() ) {
543
                continue;
544
            }
545
            FeatureAttributeDescriptor attrTarget = featureTypeTarget.getAttributeDescriptor(
546
                    attrOriginal.getName()
547
            );
548
            if (attrTarget == null) {
549
                Bitmask changesAttr = Bitmask.createBitmask(0);
550
                changesAttr.setBit(SQLBuilder.AlterTableBuilder.ALTER_COLUMN_DROP_COLUMN);
551
                changes.put(attrOriginal.getName(), changesAttr);
552
            } else {
553
                Bitmask changesAttr = this.getAlterTableChanges(attrOriginal, attrTarget);
554
                changes.put(attrOriginal.getName(), changesAttr);
555
            }
556
        }
557
        
558
        // Por ultimo comprobamos si hay que anadir alguna columna nueva.
559
        for (FeatureAttributeDescriptor attrTarget : featureTypeTarget) {
560
            if( attrTarget.isComputed() ) {
561
                continue;
562
            }
563
            FeatureAttributeDescriptor attrOriginal = currentFeatureTypeDB.getAttributeDescriptor(
564
                    attrTarget.getName()
565
            );
566
            if (attrOriginal == null) {
567
                Bitmask changesAttr = Bitmask.createBitmask(0);
568
                changesAttr.setBit(SQLBuilder.AlterTableBuilder.ALTER_COLUMN_ADD_COLUMN);
569
                changes.put(attrTarget.getName(), changesAttr);
570
            }
571
        }
572
        return changes;
573
    }
574
    
528 575
    protected Bitmask getAlterTableChanges(FeatureAttributeDescriptor src, FeatureAttributeDescriptor target) {
529 576
        Bitmask changes = Bitmask.createBitmask(0);
530 577
        

Also available in: Unified diff