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}