1 package fr.ifremer.quadrige3.core.dao.technical; 2 3 /*- 4 * #%L 5 * Quadrige3 Core :: Quadrige3 Core Shared 6 * $Id:$ 7 * $HeadURL:$ 8 * %% 9 * Copyright (C) 2017 Ifremer 10 * %% 11 * This program is free software: you can redistribute it and/or modify 12 * it under the terms of the GNU Affero General Public License as published by 13 * the Free Software Foundation, either version 3 of the License, or 14 * (at your option) any later version. 15 * 16 * This program is distributed in the hope that it will be useful, 17 * but WITHOUT ANY WARRANTY; without even the implied warranty of 18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 19 * GNU General Public License for more details. 20 * 21 * You should have received a copy of the GNU Affero General Public License 22 * along with this program. If not, see <http://www.gnu.org/licenses/>. 23 * #L% 24 */ 25 26 import fr.ifremer.quadrige3.core.exception.DatabaseSchemaUpdateException; 27 import fr.ifremer.quadrige3.core.exception.VersionNotFoundException; 28 import org.nuiton.version.Version; 29 30 import java.io.File; 31 import java.io.IOException; 32 import java.util.Properties; 33 34 35 /** 36 * <p>DatabaseSchemaDao interface.</p> 37 */ 38 public interface DatabaseSchemaDao { 39 40 /** 41 * Generate a file with all SQL for database creation 42 * 43 * @param filename full path of the file to generate 44 */ 45 void generateCreateSchemaFile(String filename); 46 47 /** 48 * <p>generateCreateSchemaFile.</p> 49 * 50 * @param filename The file to generate, or null if only execution is need 51 * @param doExecute The SQL script must be execute on database ? 52 * @param withDrop generate drop statement ? 53 * @param withCreate generate create statement ? 54 */ 55 void generateCreateSchemaFile(String filename, boolean doExecute, boolean withDrop, boolean withCreate); 56 57 /** 58 * Generate a file with update SQL statement. 59 * SQL statements will NOT be executed on database 60 * 61 * @param filename a {@link java.lang.String} object. 62 */ 63 void generateUpdateSchemaFile(String filename); 64 65 /** 66 * Generate a file with update SQL statement, and/or execute it on database. 67 * 68 * @param filename The file to generate, or null if only execution on database is need 69 * @param doUpdate true if execution is need on database 70 */ 71 void generateUpdateSchemaFile(String filename, boolean doUpdate); 72 73 /** 74 * Execute all changes need on database schema 75 * 76 * @throws DatabaseSchemaUpdateException if could not update schema 77 * @since 1.0 78 */ 79 void updateSchema() throws DatabaseSchemaUpdateException; 80 81 82 /** 83 * Execute all changes need on database schema, from the given connection 84 * 85 * @param connectionProperties the connection properties. If null, will use default (see config.getConnectionProperties()) 86 * @throws DatabaseSchemaUpdateException if could not update schema 87 * @since 1.0 88 */ 89 void updateSchema(Properties connectionProperties) throws DatabaseSchemaUpdateException; 90 91 /** 92 * Execute all changes need on database schema, from the given DB directory 93 * 94 * @param dbDirectory the DB directory. If null, will use default (see config.getConnectionProperties()) 95 * @throws DatabaseSchemaUpdateException if could not update schema 96 * @since 1.0 97 */ 98 void updateSchema(File dbDirectory) throws DatabaseSchemaUpdateException; 99 100 /** 101 * Retrieve the schema version, from table SYSTEM_VERSION, 102 * 103 * @return The database version (i.e. '3.2.3' @see Version) 104 * @throws VersionNotFoundException if the version could not be found, or has a bad format 105 * @since 1.0 106 */ 107 Version getSchemaVersion() throws VersionNotFoundException; 108 109 /** 110 * Get the database schema version if updates is apply 111 * (the version that the database should have if updateSchema() was called) 112 * 113 * @return The database version (i.e. '3.2.3' @see Version) 114 * @since 1.0 115 */ 116 Version getSchemaVersionIfUpdate(); 117 118 /** 119 * Check if a update schema if need 120 * This is equivalent to : <code>getSchemaVersion().compareTo(getSchemaVersionIfUpdate()) >= 0</code> 121 * 122 * @return true if a update is need 123 * @since 1.0 124 * @throws VersionNotFoundException if any. 125 */ 126 boolean shouldUpdateSchema() throws VersionNotFoundException; 127 128 /** 129 * Check if connection could be open. 130 * If a validation query has been set in configuration, test it 131 * 132 * @return if db is loaded 133 */ 134 boolean isDbLoaded(); 135 136 /** 137 * Check if db files exists. If not a database file, return true 138 * 139 * @return if db files exists 140 */ 141 boolean isDbExists(); 142 143 /** 144 * Report into a file the liquibase status of database 145 * 146 * @param outputFile a {@link java.io.File} object. 147 * @throws java.io.IOException if any. 148 */ 149 void generateStatusReport(File outputFile) throws IOException; 150 151 /** 152 * Generate a diff of database 153 * 154 * @param typesToControl a comma separated database object to check (i.e Table, View, Column...). If null, all types are checked 155 * @param outputFile a {@link java.io.File} object. 156 */ 157 void generateDiffReport(File outputFile, String typesToControl); 158 159 /** 160 * Generate a diff change log 161 * 162 * @param typesToControl a comma separated database object to check (i.e Table, View, Column...). If null, all types are checked 163 * @param outputChangelogFile a {@link java.io.File} object. 164 */ 165 void generateDiffChangeLog(File outputChangelogFile, String typesToControl); 166 167 /** 168 * Generate a new DB directory 169 * 170 * @param dbDirectory a {@link java.io.File} object. 171 * @param replaceIfExists a boolean. 172 */ 173 void generateNewDb(File dbDirectory, boolean replaceIfExists); 174 175 /** 176 * Generate a new DB directory with the specified script and connection properties 177 * 178 * @param dbDirectory a {@link java.io.File} object. 179 * @param replaceIfExists a boolean. 180 * @param scriptFile a file with the HSQLDB script (e.g. quadrige3.script), or null for default script file 181 * @param connectionProperties a {@link java.util.Properties} object. 182 * @param isTemporaryDb is target DB is temporay DB (for synchro), some changes are done (e.g. TEMP_QUERY_PARAMETER table) 183 */ 184 void generateNewDb(File dbDirectory, boolean replaceIfExists, File scriptFile, Properties connectionProperties, boolean isTemporaryDb); 185 }