package codeine.db.mysql.connectors;
import codeine.db.ProjectsConfigurationConnector;
import codeine.db.mysql.DbUtils;
import codeine.jsons.global.ExperimentalConfJsonStore;
import codeine.jsons.project.ProjectJson;
import com.google.common.base.Function;
import com.google.common.collect.Maps;
import com.google.gson.Gson;
import org.apache.log4j.Logger;
import javax.inject.Inject;
import java.sql.ResultSet;
import java.util.Map;
public class ProjectsConfigurationMysqlConnector implements ProjectsConfigurationConnector{
private static final Logger log = Logger.getLogger(ProjectsConfigurationMysqlConnector.class);
@Inject
private DbUtils dbUtils;
@Inject
private Gson gson;
@Inject private ExperimentalConfJsonStore webConfJsonStore;
private static final String TABLE_NAME = "ProjectsConfiguration";
public ProjectsConfigurationMysqlConnector() {
super();
}
public ProjectsConfigurationMysqlConnector(DbUtils dbUtils, Gson gson, ExperimentalConfJsonStore webConfJsonStore) {
super();
this.dbUtils = dbUtils;
this.gson = gson;
this.webConfJsonStore = webConfJsonStore;
}
public void createTables() {
if (webConfJsonStore.get().readonly_web_server()) {
log.info("read only mode");
return;
}
String colsDefinition = "project_name CHAR(100) NOT NULL PRIMARY KEY, data MEDIUMTEXT";
dbUtils.executeUpdate("create table if not exists " + TABLE_NAME + " (" + colsDefinition + ")");
}
@Override
public Map<String, ProjectJson> getAllProjects() {
final Map<String, ProjectJson> $ = Maps.newHashMap();
Function<ResultSet, Void> function = new Function<ResultSet, Void>() {
@Override
public Void apply(ResultSet input) {
String json = null;
String project = null;
try {
project = input.getString("project_name");
json = input.getString("data");
$.put(project, gson.fromJson(json, ProjectJson.class));
} catch (Exception e) {
log.error("json is " + json);
log.error("failed to read project from database " + project, e);
}
return null;
}
};
dbUtils.executeQuery("select * from " + TABLE_NAME, function);
return $;
}
@Override
public void updateProject(ProjectJson project){
log.info("updating project in database " + project.name() + " " + dbUtils);
if (webConfJsonStore.get().readonly_web_server()) {
log.info("read only mode");
return;
}
int executeUpdate = dbUtils.executeUpdate("REPLACE INTO "+TABLE_NAME+" (project_name, data) VALUES (?, ?)", project.name(), gson.toJson(project));
if (executeUpdate == 0) {
throw new RuntimeException("failed to update project " + project.name());
}
}
@Override
public void deleteProject(ProjectJson project) {
log.info("deleting project from database " + project.name());
if (webConfJsonStore.get().readonly_web_server()) {
log.info("read only mode");
return;
}
int deleted = dbUtils.executeUpdate("DELETE FROM "+TABLE_NAME+" WHERE project_name = '" + project.name() + "'");
if (deleted == 0) {
throw new RuntimeException("failed to delete project " + project.name());
}
}
@Override
public String getKey() {
return dbUtils.server();
}
}