1 package org.openkilda.config;
3 import org.springframework.beans.factory.annotation.Autowired;
4 import org.springframework.core.io.ResourceLoader;
5 import org.springframework.stereotype.Repository;
6 import org.springframework.transaction.annotation.Propagation;
7 import org.springframework.transaction.annotation.Transactional;
9 import com.ibatis.common.jdbc.ScriptRunner;
11 import java.io.FileNotFoundException;
12 import java.io.IOException;
13 import java.io.InputStream;
14 import java.io.InputStreamReader;
15 import java.sql.Connection;
16 import java.util.LinkedHashMap;
17 import java.util.List;
20 import javax.sql.DataSource;
22 import org.apache.log4j.Logger;
27 @Repository(
"databaseConfigurator")
30 private static final Logger LOGGER = Logger.getLogger(
FlowService.class);
32 private final static String SCRIPT_LOCATION =
"db";
33 private final static String SCRIPT_FILE_PREFIX =
"import-script_";
34 private final static String SCRIPT_FILE_SUFFIX =
".sql";
36 private ResourceLoader resourceLoader;
40 private DataSource dataSource;
43 final DataSource dataSource,
final ResourceLoader resourceLoader) {
44 this.versionRepository = versionRepository;
45 this.dataSource = dataSource;
46 this.resourceLoader = resourceLoader;
50 @Transactional(propagation = Propagation.REQUIRES_NEW, readOnly =
false)
55 private void loadInitialData() {
56 List<VersionEntity> versionEntities = versionRepository.findAll();
57 long lastestScriptNumber = getLatestScriptVersion(versionEntities);
58 Map<String, InputStream> filesByName = getScriptFiles(lastestScriptNumber);
60 for(
int i = 0;
i < filesByName.size();
i++) {
61 try (InputStream inputStream = filesByName.get(lastestScriptNumber +
i +1)) {
62 runScript(inputStream);
63 }
catch (IOException e) {
64 LOGGER.error(
"Failed to load db script", e);
69 private Long getLatestScriptVersion(
final List<VersionEntity> versionEntities) {
70 Long lastestVersion = 0l;
71 for (VersionEntity versionEntity : versionEntities) {
72 if (lastestVersion < versionEntity.getVersionNumber()) {
73 lastestVersion = versionEntity.getVersionNumber();
76 return lastestVersion;
79 @SuppressWarnings(
"resource")
80 private Map<String, InputStream> getScriptFiles(final
long scriptNumber) {
81 long lastestScriptNumber = scriptNumber;
82 Map<String, InputStream> filesByName =
new LinkedHashMap<>();
86 lastestScriptNumber++;
87 is = resourceLoader.getResource(
"classpath:" + SCRIPT_LOCATION +
"/" +
88 SCRIPT_FILE_PREFIX + lastestScriptNumber + SCRIPT_FILE_SUFFIX).getInputStream();
95 }
catch (FileNotFoundException e) {
97 }
catch (IOException e) {
98 LOGGER.error(
"Failed to load db scripts", e);
103 private void runScript(
final InputStream inputStream) {
104 try (Connection con = dataSource.getConnection()) {
105 ScriptRunner sr =
new ScriptRunner(con,
false,
false);
106 sr.runScript(
new InputStreamReader(inputStream));
107 }
catch (Exception e) {
108 LOGGER.error(
"Error while executing script.", e);
DatabaseConfigurator(@Autowired final VersionRepository versionRepository, final DataSource dataSource, final ResourceLoader resourceLoader)