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.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 sql = "drop sequence " + myGeneratorName; 080 break; 081 case ORACLE_12C: 082 sql = "drop sequence " + myGeneratorName; 083 break; 084 case MSSQL_2012: 085 sql = "drop sequence " + myGeneratorName; 086 break; 087 default: 088 throw new IllegalStateException(Msg.code(64)); 089 } 090 091 if (isNotBlank(sql)) { 092 Set<String> sequenceNames = 093 JdbcUtils.getSequenceNames(getConnectionProperties()) 094 .stream() 095 .map(String::toLowerCase) 096 .collect(Collectors.toSet()); 097 ourLog.debug("Currently have sequences: {}", sequenceNames); 098 if (!sequenceNames.contains(myGeneratorName.toLowerCase())) { 099 logInfo(ourLog, "Sequence {} does not exist - No action performed", myGeneratorName); 100 return; 101 } 102 103 executeSql(myGeneratorName, sql); 104 } 105 106 } 107 108 @Override 109 protected void generateEquals(EqualsBuilder theBuilder, BaseTask theOtherObject) { 110 DropIdGeneratorTask otherObject = (DropIdGeneratorTask) theOtherObject; 111 theBuilder.append(myGeneratorName, otherObject.myGeneratorName); 112 } 113 114 @Override 115 protected void generateHashCode(HashCodeBuilder theBuilder) { 116 theBuilder.append(myGeneratorName); 117 } 118}