| Classes in this File | Line Coverage | Branch Coverage | Complexity | ||||
| SqlGenerator |
|
| 1.0;1 |
| 1 | package liquibase.sqlgenerator; | |
| 2 | ||
| 3 | import liquibase.database.Database; | |
| 4 | import liquibase.exception.ValidationErrors; | |
| 5 | import liquibase.exception.Warnings; | |
| 6 | import liquibase.servicelocator.PrioritizedService; | |
| 7 | import liquibase.sql.Sql; | |
| 8 | import liquibase.statement.SqlStatement; | |
| 9 | ||
| 10 | /** | |
| 11 | * SqlGenerator implementations take a database-independent SqlStatement interface and create a database-specific Sql | |
| 12 | * object. SqlGenerators are registered with the SqlGeneratorFactory, which is used to determine the correct generator | |
| 13 | * to use for a given statment/database combination. | |
| 14 | * <p> | |
| 15 | * The SqlGenerator implementations are responsible for determining whether the data contained in the SqlStatement | |
| 16 | * method is valid using the validate method. | |
| 17 | * <p> | |
| 18 | * <b>Naming Conventions:</b><br> | |
| 19 | * Default SqlGenerators for a particular SqlStatement use the same name as the SqlStatement class, replacing | |
| 20 | * "Statement" with "Generator" (e.g.: CreateTableStatement -> CreateTableGenerator). Database-specific or alternate | |
| 21 | * SqlGenerators append a descrition of what makes them different appended (e.g. CreateTableStatement -> | |
| 22 | * CreateTableGeneratorOracle) | |
| 23 | * <p> | |
| 24 | * <b>NOTE:</b> There is only one instance of each SqlGenerator implementation created, and they must be thread safe. | |
| 25 | * <p> | |
| 26 | * <b>Lifecycle:</b><br> | |
| 27 | * <ol> | |
| 28 | * <li>Instance of SqlGenerator subclass is created when registered with SqlGeneratorFactory</li> | |
| 29 | * <li>For each SqlStatement to execute, SqlGeneratorFactory calls supports() to determine if the given SqlGenerator | |
| 30 | * will work for the current SqlStatement/Database combination</li> | |
| 31 | * <li>SqlGeneratorFactory calls getPriority to determine which of all the SqlGenerators that support a given | |
| 32 | * SqlStatement/Database combination is the best to use.</li> | |
| 33 | * <li>Liquibase calls validate() on the best SqlGenerator to determine if the data contained in the SqlStatement is | |
| 34 | * correct and complete for the given Database</li> | |
| 35 | * <li>If validate returns a no-error ValidationErrors object, Liquibase will call the generateSql() method and execute | |
| 36 | * the resuling SQL against the database.</li> | |
| 37 | * </ol> | |
| 38 | * | |
| 39 | * @param <StatementType> | |
| 40 | * Used to specify which type of SqlStatement this generator supports. If it supports multiple SqlStatement | |
| 41 | * types, pass SqlStatement. The SqlGeneratorFactory will use this paramter to augment the response from the | |
| 42 | * supports() method | |
| 43 | * | |
| 44 | * @see SqlGeneratorFactory | |
| 45 | * @see liquibase.statement.SqlStatement | |
| 46 | * @see liquibase.sql.Sql | |
| 47 | */ | |
| 48 | public interface SqlGenerator<StatementType extends SqlStatement> extends PrioritizedService { | |
| 49 | ||
| 50 | public static final int PRIORITY_DEFAULT = 1; | |
| 51 | public static final int PRIORITY_DATABASE = 5; | |
| 52 | ||
| 53 | /** | |
| 54 | * Of all the SqlGenerators that "support" a given SqlStatement/Database, SqlGeneratorFactory will return the one | |
| 55 | * with the highest priority. | |
| 56 | * | |
| 57 | * @return | |
| 58 | */ | |
| 59 | public int getPriority(); | |
| 60 | ||
| 61 | /** | |
| 62 | * Does this generator support the given statement/database combination? Do not validate the statement with this | |
| 63 | * method, only return if it <i>can</i> suppot it. | |
| 64 | */ | |
| 65 | public boolean supports(StatementType statement, Database database); | |
| 66 | ||
| 67 | /** | |
| 68 | * Does this change require access to the database metadata? If true, the change cannot be used in an | |
| 69 | * updateSql-style command. | |
| 70 | */ | |
| 71 | public boolean requiresUpdatedDatabaseMetadata(Database database); | |
| 72 | ||
| 73 | /** | |
| 74 | * Validate the data contained in the SqlStatement. If there are no errors, return an empty ValidationErrors object, | |
| 75 | * not a null value. Liquibase will inspect the ValidationErrors result before attempting to call generateSql. | |
| 76 | */ | |
| 77 | public ValidationErrors validate(StatementType statement, Database database, SqlGeneratorChain sqlGeneratorChain); | |
| 78 | ||
| 79 | public Warnings warn(StatementType statementType, Database database, SqlGeneratorChain sqlGeneratorChain); | |
| 80 | ||
| 81 | /** | |
| 82 | * Generate the actual Sql for the given statement and database. | |
| 83 | */ | |
| 84 | public Sql[] generateSql(StatementType statement, Database database, SqlGeneratorChain sqlGeneratorChain); | |
| 85 | } |