/** * */ package org.gcube.documentstore.persistence; import java.sql.Connection; import java.sql.DriverManager; import java.sql.Statement; import java.util.SortedSet; import java.util.TreeSet; import org.gcube.documentstore.records.Record; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * @author Luca Frosini (ISTI - CNR) */ public class PersistencePostgreSQL extends PersistenceBackend { private static final Logger logger = LoggerFactory.getLogger(PersistencePostgreSQL.class); public static final String URL_PROPERTY_KEY = "URL"; public static final String USERNAME_PROPERTY_KEY = "username"; public static final String PASSWORD_PROPERTY_KEY = "password"; private String url; private String username; private String password; private Connection connection; private Statement statement; @Override protected void prepareConnection(PersistenceBackendConfiguration configuration) throws Exception { logger.trace("prepareConnection()"); url = configuration.getProperty(URL_PROPERTY_KEY); username = configuration.getProperty(USERNAME_PROPERTY_KEY); password = configuration.getProperty(PASSWORD_PROPERTY_KEY); } @Override protected void openConnection() throws Exception { logger.trace("openConnection()"); try { Class.forName("org.postgresql.Driver"); connection = DriverManager.getConnection(url, username, password); logger.trace("Opened database successfully"); connection.setAutoCommit(false); statement = connection.createStatement(); } catch (Exception e) { throw e; } } protected String getSQLInsertCommand(Record record) { StringBuffer sql = new StringBuffer(); sql.append("INSERT INTO "); sql.append(record.getRecordType()); // tableNme == RecordType boolean first = true; SortedSet keys = new TreeSet<>(record.getRequiredFields()); StringBuffer values = new StringBuffer(); for(String key : keys) { if(first) { sql.append(" "); values.append(" ("); first = false; }else { sql.append(","); values.append(","); } sql.append(key); values.append(record.getResourceProperty(key)); } sql.append(") VALUES"); sql.append(values); sql.append(");"); return sql.toString(); } @Override protected void reallyAccount(Record record) throws Exception { logger.trace("reallyAccount()"); String sqlCommand = getSQLInsertCommand(record); statement.executeUpdate(sqlCommand); } @Override protected void clean() throws Exception { logger.trace("clean()"); } @Override protected void closeConnection() throws Exception { logger.trace("closeConnection()"); statement.close(); connection.commit(); connection.close(); } @Override public boolean isConnectionActive() throws Exception { return connection.isValid(300); }; }