001package ca.uhn.fhir.jpa.migrate.taskdef;
002
003/*-
004 * #%L
005 * HAPI FHIR Server - SQL Migration
006 * %%
007 * Copyright (C) 2014 - 2023 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.i18n.Msg;
024import ca.uhn.fhir.jpa.migrate.JdbcUtils;
025import org.apache.commons.lang3.Validate;
026import org.apache.commons.lang3.builder.EqualsBuilder;
027import org.apache.commons.lang3.builder.HashCodeBuilder;
028import org.slf4j.Logger;
029import org.slf4j.LoggerFactory;
030
031import java.sql.SQLException;
032import java.util.Set;
033import java.util.stream.Collectors;
034
035import static org.apache.commons.lang3.StringUtils.isNotBlank;
036
037public class DropIdGeneratorTask extends BaseTask {
038
039        private static final Logger ourLog = LoggerFactory.getLogger(DropIdGeneratorTask.class);
040        private final String myGeneratorName;
041
042        public DropIdGeneratorTask(String theProductVersion, String theSchemaVersion, String theGeneratorName) {
043                super(theProductVersion, theSchemaVersion);
044                myGeneratorName = theGeneratorName;
045        }
046
047        @Override
048        public void validate() {
049                Validate.notBlank(myGeneratorName);
050                setDescription("Drop id generator " + myGeneratorName);
051        }
052
053        @Override
054        public void doExecute() throws SQLException {
055                Set<String> tableNames = JdbcUtils.getTableNames(getConnectionProperties());
056                String sql = null;
057
058                switch (getDriverType()) {
059                        case MARIADB_10_1:
060                        case MYSQL_5_7:
061                                // These require a separate table
062                                if (tableNames.contains(myGeneratorName)) {
063
064                                        String initSql = "delete from " + myGeneratorName;
065                                        executeSql(myGeneratorName, initSql);
066
067                                        String creationSql = "drop table " + myGeneratorName;
068                                        executeSql(myGeneratorName, creationSql);
069
070                                }
071                                break;
072                        case DERBY_EMBEDDED:
073                                sql = "drop sequence " + myGeneratorName + " restrict";
074                                break;
075                        case H2_EMBEDDED:
076                                sql = "drop sequence " + myGeneratorName;
077                                break;
078                        case POSTGRES_9_4:
079                        case COCKROACHDB_21_1:
080                                sql = "drop sequence " + myGeneratorName;
081                                break;
082                        case ORACLE_12C:
083                                sql = "drop sequence " + myGeneratorName;
084                                break;
085                        case MSSQL_2012:
086                                sql = "drop sequence " + myGeneratorName;
087                                break;
088                        default:
089                                throw new IllegalStateException(Msg.code(64));
090                }
091
092                if (isNotBlank(sql)) {
093                        Set<String> sequenceNames =
094                                JdbcUtils.getSequenceNames(getConnectionProperties())
095                                        .stream()
096                                        .map(String::toLowerCase)
097                                        .collect(Collectors.toSet());
098                        ourLog.debug("Currently have sequences: {}", sequenceNames);
099                        if (!sequenceNames.contains(myGeneratorName.toLowerCase())) {
100                                logInfo(ourLog, "Sequence {} does not exist - No action performed", myGeneratorName);
101                                return;
102                        }
103
104                        executeSql(myGeneratorName, sql);
105                }
106
107        }
108
109        @Override
110        protected void generateEquals(EqualsBuilder theBuilder, BaseTask theOtherObject) {
111                DropIdGeneratorTask otherObject = (DropIdGeneratorTask) theOtherObject;
112                theBuilder.append(myGeneratorName, otherObject.myGeneratorName);
113        }
114
115        @Override
116        protected void generateHashCode(HashCodeBuilder theBuilder) {
117                theBuilder.append(myGeneratorName);
118        }
119}