/*
* Copyright 2010 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.jdbc.versioned;
import java.io.IOException;
import java.io.LineNumberReader;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.EncodedResource;
import org.springframework.util.StringUtils;
public class SqlDatabaseChange extends AbstractDatabaseChange {
private final String sql;
public SqlDatabaseChange(String sql) {
this.sql = sql;
}
@Override
protected Statement doCreateStatement(Connection connection) throws SQLException {
return connection.createStatement();
}
@Override
protected void doExecuteStatement(Statement statement) throws SQLException {
statement.execute(sql);
}
public static DatabaseChange inResource(Resource resource) {
try {
return new SqlDatabaseChange(readScript(resource));
} catch (IOException e) {
throw new IllegalArgumentException("Could not read sql resource: " + resource, e);
}
}
// TODO this code is duplicated from ResourceDatabasePopulator as well
private static String readScript(Resource resource) throws IOException {
EncodedResource encoded = resource instanceof EncodedResource ? (EncodedResource) resource : new EncodedResource(resource);
LineNumberReader lnr = new LineNumberReader(encoded.getReader());
String currentStatement = lnr.readLine();
StringBuilder scriptBuilder = new StringBuilder();
while (currentStatement != null) {
if (StringUtils.hasText(currentStatement) && (SQL_COMMENT_PREFIX != null && !currentStatement.startsWith(SQL_COMMENT_PREFIX))) {
if (scriptBuilder.length() > 0) {
scriptBuilder.append('\n');
}
scriptBuilder.append(currentStatement);
}
currentStatement = lnr.readLine();
}
return scriptBuilder.toString();
}
private static final String SQL_COMMENT_PREFIX = "--";
}