added column name changer
[cdmlib.git] / cdmlib-persistence / src / main / java / eu / etaxonomy / cdm / database / update / ColumnAdder.java
1 // $Id$
2 /**
3 * Copyright (C) 2009 EDIT
4 * European Distributed Institute of Taxonomy
5 * http://www.e-taxonomy.eu
6 *
7 * The contents of this file are subject to the Mozilla Public License Version 1.1
8 * See LICENSE.TXT at the top of this package for the full license terms.
9 */
10 package eu.etaxonomy.cdm.database.update;
11
12 import java.sql.SQLException;
13
14 import org.apache.log4j.Logger;
15
16 import eu.etaxonomy.cdm.common.IProgressMonitor;
17 import eu.etaxonomy.cdm.database.DatabaseTypeEnum;
18 import eu.etaxonomy.cdm.database.ICdmDataSource;
19
20 /**
21 * @author a.mueller
22 * @date 16.09.2010
23 *
24 */
25 public class ColumnAdder extends SchemaUpdaterStepBase implements ISchemaUpdaterStep {
26 @SuppressWarnings("unused")
27 private static final Logger logger = Logger.getLogger(ColumnAdder.class);
28
29 private String tableName;
30 private String newColumnName;
31 private String columnType;
32 private boolean includeAudTable;
33 private Object defaultValue;
34
35 public static final ColumnAdder NewIntegerInstance(String stepName, String tableName, String newColumnName, boolean includeAudTable){
36 return new ColumnAdder(stepName, tableName, newColumnName, "int", includeAudTable, null);
37 }
38
39 public static final ColumnAdder NewBooleanInstance(String stepName, String tableName, String newColumnName, boolean includeAudTable, Boolean defaultValue){
40 return new ColumnAdder(stepName, tableName, newColumnName, "bit", includeAudTable, defaultValue);
41 }
42
43 public static final ColumnAdder NewStringInstance(String stepName, String tableName, String newColumnName, boolean includeAudTable){
44 return new ColumnAdder(stepName, tableName, newColumnName, "nvarchar(255)", includeAudTable, null);
45 }
46
47 protected ColumnAdder(String stepName, String tableName, String newColumnName, String columnType, boolean includeAudTable, Object defaultValue) {
48 super(stepName);
49 this.tableName = tableName;
50 this.newColumnName = newColumnName;
51 this.columnType = columnType;
52 this.includeAudTable = includeAudTable;
53 this.defaultValue = defaultValue;
54 }
55
56 /* (non-Javadoc)
57 * @see eu.etaxonomy.cdm.database.update.SchemaUpdaterStepBase#invoke(eu.etaxonomy.cdm.database.ICdmDataSource, eu.etaxonomy.cdm.common.IProgressMonitor)
58 */
59 @Override
60 public Integer invoke(ICdmDataSource datasource, IProgressMonitor monitor) throws SQLException {
61 boolean result = true;
62 String databaseColumnType = getDatabaseColumnType(datasource, columnType);
63 result &= addColumn(tableName, newColumnName, databaseColumnType, datasource, monitor);
64 if (includeAudTable){
65 String aud = "_AUD";
66 result &= addColumn(tableName + aud, newColumnName, databaseColumnType, datasource, monitor);
67 }
68 return (result == true )? 0 : null;
69 }
70
71 private String getDatabaseColumnType(ICdmDataSource datasource, String columnType) {
72 String result = columnType;
73 if (datasource.getDatabaseType().equals(DatabaseTypeEnum.PostgreSQL)){
74 result = result.replace("nvarchar", "varchar");
75 }
76 return result;
77 }
78
79 private boolean addColumn(String tableName, String newColumnName, String columnType, ICdmDataSource datasource, IProgressMonitor monitor) {
80 DatabaseTypeEnum type = datasource.getDatabaseType();
81 String updateQuery;
82 if (type.equals(DatabaseTypeEnum.SqlServer2005)){
83 //MySQL allows both syntaxes
84 updateQuery = "ALTER TABLE @tableName ADD @columnName @columnType";
85 }else if (type.equals(DatabaseTypeEnum.H2) || type.equals(DatabaseTypeEnum.PostgreSQL) || type.equals(DatabaseTypeEnum.MySQL)){
86 updateQuery = "ALTER TABLE @tableName ADD COLUMN @columnName @columnType";
87 }else{
88 updateQuery = null;
89 monitor.warning("Update step '" + this.getStepName() + "' is not supported by " + type.getName());
90 return false;
91 }
92 updateQuery = updateQuery.replace("@tableName", tableName);
93 updateQuery = updateQuery.replace("@columnName", newColumnName);
94 updateQuery = updateQuery.replace("@columnType", columnType);
95 datasource.executeUpdate(updateQuery);
96
97 if (defaultValue instanceof Boolean){
98 updateQuery = "UPDATE @tableName SET @columnName = " + (defaultValue == null ? "null" : getBoolean((Boolean) defaultValue, datasource));
99 updateQuery = updateQuery.replace("@tableName", tableName);
100 updateQuery = updateQuery.replace("@columnName", newColumnName);
101 datasource.executeUpdate(updateQuery);
102 }
103 return true;
104 }
105
106 }