Search in sources :

Example 1 with MariaDBDatabase

use of liquibase.database.core.MariaDBDatabase in project liquibase by liquibase.

the class ViewSnapshotGenerator method snapshotObject.

// public Boolean has(DatabaseObject example, DatabaseSnapshot snapshot, SnapshotGeneratorChain chain) throws DatabaseException {
// Database database = snapshot.getDatabase();
// if (!(example instanceof View)) {
// return chain.has(example, snapshot);
// }
// String viewName = example.getName();
// Schema schema = example.getSchema();
// try {
// ResultSet rs = getMetaDataFromCache(database).getTables(database.getJdbcCatalogName(schema), database.getJdbcSchemaName(schema), database.correctObjectName(viewName, View.class), new String[]{"VIEW"});
// try {
// return rs.next();
// } finally {
// try {
// rs.close();
// } catch (SQLException ignore) {
// }
// }
// } catch (SQLException e) {
// throw new DatabaseException(e);
// }
// }
@Override
protected DatabaseObject snapshotObject(DatabaseObject example, DatabaseSnapshot snapshot) throws DatabaseException {
    if (((View) example).getDefinition() != null) {
        return example;
    }
    Database database = snapshot.getDatabase();
    Schema schema = example.getSchema();
    List<CachedRow> viewsMetadataRs = null;
    try {
        viewsMetadataRs = ((JdbcDatabaseSnapshot) snapshot).getMetaDataFromCache().getViews(((AbstractJdbcDatabase) database).getJdbcCatalogName(schema), ((AbstractJdbcDatabase) database).getJdbcSchemaName(schema), example.getName());
        if (!viewsMetadataRs.isEmpty()) {
            CachedRow row = viewsMetadataRs.get(0);
            String rawViewName = row.getString("TABLE_NAME");
            String rawSchemaName = StringUtil.trimToNull(row.getString("TABLE_SCHEM"));
            String rawCatalogName = StringUtil.trimToNull(row.getString("TABLE_CAT"));
            String remarks = row.getString("REMARKS");
            if (remarks != null) {
                // come back escaped sometimes
                remarks = remarks.replace("''", "'");
            }
            View view = new View().setName(cleanNameFromDatabase(rawViewName, database));
            view.setRemarks(remarks);
            CatalogAndSchema schemaFromJdbcInfo = ((AbstractJdbcDatabase) database).getSchemaFromJdbcInfo(rawCatalogName, rawSchemaName);
            view.setSchema(new Schema(schemaFromJdbcInfo.getCatalogName(), schemaFromJdbcInfo.getSchemaName()));
            try {
                String definition = database.getViewDefinition(schemaFromJdbcInfo, view.getName());
                if (definition.startsWith("FULL_DEFINITION: ")) {
                    definition = definition.replaceFirst("^FULL_DEFINITION: ", "");
                    view.setContainsFullDefinition(true);
                }
                // remove strange zero-termination seen on some Oracle view definitions
                int length = definition.length();
                if (length > 0 && definition.charAt(length - 1) == 0) {
                    definition = definition.substring(0, length - 1);
                }
                if (database instanceof InformixDatabase) {
                    // Cleanup
                    definition = definition.trim();
                    definition = definition.replaceAll("\\s*,\\s*", ", ");
                    definition = definition.replaceAll("\\s*;", "");
                    // Strip the schema definition because it can optionally be included in the tag attribute
                    definition = definition.replaceAll("(?i)\"" + view.getSchema().getName() + "\"\\.", "");
                }
                definition = StringUtil.trimToNull(definition);
                if (definition == null) {
                    definition = "[CANNOT READ VIEW DEFINITION]";
                    String warningMessage = null;
                    if (database instanceof MariaDBDatabase) {
                        warningMessage = "\nThe current MariaDB user does not have permissions to access view definitions needed for this Liquibase command.\n" + "Please search the changelog for '[CANNOT READ VIEW DEFINITION]' to locate inaccessible objects. " + "Learn more about altering permissions with suggested MariaDB GRANTs at https://docs.liquibase.com/workflows/liquibase-pro/mariadbgrants.html\n";
                    } else if (database instanceof MySQLDatabase) {
                        warningMessage = "\nThe current MySQL user does not have permissions to access view definitions needed for this Liquibase command.\n" + "Please search the changelog for '[CANNOT READ VIEW DEFINITION]' to locate inaccessible objects. This is\n" + "potentially due to a known MySQL bug https://bugs.mysql.com/bug.php?id=22763. Learn more about altering\n" + "permissions with suggested MySQL GRANTs at https://docs.liquibase.com/workflows/liquibase-pro/mysqlgrants.html\n";
                    }
                    if (warningMessage != null) {
                        Scope.getCurrentScope().getUI().sendMessage("WARNING: " + warningMessage);
                        Scope.getCurrentScope().getLog(getClass()).warning(warningMessage);
                    }
                }
                view.setDefinition(definition);
            } catch (DatabaseException e) {
                throw new DatabaseException("Error getting " + database.getConnection().getURL() + " view with " + new GetViewDefinitionStatement(view.getSchema().getCatalogName(), view.getSchema().getName(), rawViewName), e);
            }
            return view;
        } else {
            return null;
        }
    } catch (SQLException e) {
        throw new DatabaseException(e);
    }
}
Also used : MariaDBDatabase(liquibase.database.core.MariaDBDatabase) CachedRow(liquibase.snapshot.CachedRow) SQLException(java.sql.SQLException) Schema(liquibase.structure.core.Schema) CatalogAndSchema(liquibase.CatalogAndSchema) MySQLDatabase(liquibase.database.core.MySQLDatabase) CatalogAndSchema(liquibase.CatalogAndSchema) AbstractJdbcDatabase(liquibase.database.AbstractJdbcDatabase) View(liquibase.structure.core.View) GetViewDefinitionStatement(liquibase.statement.core.GetViewDefinitionStatement) InformixDatabase(liquibase.database.core.InformixDatabase) OracleDatabase(liquibase.database.core.OracleDatabase) InformixDatabase(liquibase.database.core.InformixDatabase) Database(liquibase.database.Database) MariaDBDatabase(liquibase.database.core.MariaDBDatabase) MySQLDatabase(liquibase.database.core.MySQLDatabase) AbstractJdbcDatabase(liquibase.database.AbstractJdbcDatabase) JdbcDatabaseSnapshot(liquibase.snapshot.JdbcDatabaseSnapshot) DatabaseException(liquibase.exception.DatabaseException)

Aggregations

SQLException (java.sql.SQLException)1 CatalogAndSchema (liquibase.CatalogAndSchema)1 AbstractJdbcDatabase (liquibase.database.AbstractJdbcDatabase)1 Database (liquibase.database.Database)1 InformixDatabase (liquibase.database.core.InformixDatabase)1 MariaDBDatabase (liquibase.database.core.MariaDBDatabase)1 MySQLDatabase (liquibase.database.core.MySQLDatabase)1 OracleDatabase (liquibase.database.core.OracleDatabase)1 DatabaseException (liquibase.exception.DatabaseException)1 CachedRow (liquibase.snapshot.CachedRow)1 JdbcDatabaseSnapshot (liquibase.snapshot.JdbcDatabaseSnapshot)1 GetViewDefinitionStatement (liquibase.statement.core.GetViewDefinitionStatement)1 Schema (liquibase.structure.core.Schema)1 View (liquibase.structure.core.View)1