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
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