001package ca.uhn.fhir.jpa.migrate.taskdef;
002
003/*-
004 * #%L
005 * HAPI FHIR Server - SQL Migration
006 * %%
007 * Copyright (C) 2014 - 2022 Smile CDR, Inc.
008 * %%
009 * Licensed under the Apache License, Version 2.0 (the "License");
010 * you may not use this file except in compliance with the License.
011 * You may obtain a copy of the License at
012 *
013 *      http://www.apache.org/licenses/LICENSE-2.0
014 *
015 * Unless required by applicable law or agreed to in writing, software
016 * distributed under the License is distributed on an "AS IS" BASIS,
017 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
018 * See the License for the specific language governing permissions and
019 * limitations under the License.
020 * #L%
021 */
022
023import ca.uhn.fhir.jpa.migrate.JdbcUtils;
024import org.apache.commons.lang3.Validate;
025import org.apache.commons.lang3.builder.EqualsBuilder;
026import org.apache.commons.lang3.builder.HashCodeBuilder;
027import org.slf4j.Logger;
028import org.slf4j.LoggerFactory;
029
030import java.sql.SQLException;
031import java.util.ArrayList;
032import java.util.List;
033
034public class AddTableByColumnTask extends BaseTableTask {
035
036        private static final Logger ourLog = LoggerFactory.getLogger(AddTableByColumnTask.class);
037
038        private List<AddColumnTask> myAddColumnTasks = new ArrayList<>();
039        private List<String> myPkColumns;
040
041        public AddTableByColumnTask(String theProductVersion, String theSchemaVersion) {
042                super(theProductVersion, theSchemaVersion);
043        }
044
045        @Override
046        public void validate() {
047                super.validate();
048                setDescription("Add table " + getTableName());
049        }
050
051        public void addAddColumnTask(AddColumnTask theTask) {
052                Validate.notNull(theTask);
053                myAddColumnTasks.add(theTask);
054        }
055
056        public void setPkColumns(List<String> thePkColumns) {
057                myPkColumns = thePkColumns;
058        }
059
060        @Override
061        public void doExecute() throws SQLException {
062
063                if (JdbcUtils.getTableNames(getConnectionProperties()).contains(getTableName())) {
064                        logInfo(ourLog, "Already have table named {} - No action performed", getTableName());
065                        return;
066                }
067
068                StringBuilder sb = new StringBuilder();
069                sb.append("CREATE TABLE ");
070                sb.append(getTableName());
071                sb.append(" ( ");
072
073                for (AddColumnTask next : myAddColumnTasks) {
074                        next.setDriverType(getDriverType());
075                        next.setTableName(getTableName());
076                        next.validate();
077
078                        sb.append(next.getColumnName());
079                        sb.append(" ");
080                        sb.append(next.getTypeStatement());
081                        sb.append(", ");
082                }
083
084                sb.append(" PRIMARY KEY (");
085                for (int i = 0; i < myPkColumns.size(); i++) {
086                        if (i > 0) {
087                                sb.append(", ");
088                        }
089                        sb.append(myPkColumns.get(i));
090                }
091                sb.append(")");
092
093                sb.append(" ) ");
094
095                switch (getDriverType()) {
096                        case MARIADB_10_1:
097                        case MYSQL_5_7:
098                                sb.append("engine=InnoDB");
099                                break;
100                        case DERBY_EMBEDDED:
101                        case POSTGRES_9_4:
102                        case ORACLE_12C:
103                        case MSSQL_2012:
104                        case H2_EMBEDDED:
105                                break;
106                }
107
108                executeSql(getTableName(), sb.toString());
109
110        }
111
112        @Override
113        protected void generateEquals(EqualsBuilder theBuilder, BaseTask theOtherObject) {
114                super.generateEquals(theBuilder, theOtherObject);
115                AddTableByColumnTask otherObject = (AddTableByColumnTask) theOtherObject;
116                theBuilder.append(myAddColumnTasks, otherObject.myAddColumnTasks);
117                theBuilder.append(myPkColumns, otherObject.myPkColumns);
118        }
119
120        @Override
121        protected void generateHashCode(HashCodeBuilder theBuilder) {
122                super.generateHashCode(theBuilder);
123                theBuilder.append(myAddColumnTasks);
124                theBuilder.append(myPkColumns);
125        }
126}