From bc7dc206b453baec970e813d1b981cbbe8374cbf Mon Sep 17 00:00:00 2001 From: Luca Frosini Date: Wed, 10 Mar 2021 17:59:25 +0100 Subject: [PATCH] Implementing library --- pom.xml | 8 +- .../persistence/PersistencePostgreSQL.java | 74 ++++++++++++++++--- 2 files changed, 69 insertions(+), 13 deletions(-) diff --git a/pom.xml b/pom.xml index 8d380e3..6427052 100644 --- a/pom.xml +++ b/pom.xml @@ -24,7 +24,7 @@ scm:git:https://code-repo.d4science.org/gCubeSystem/${project.artifactId}.git https://code-repo.d4science.org/gCubeSystem/${project.artifactId} - + @@ -46,6 +46,12 @@ org.slf4j slf4j-api + + + org.postgresql + postgresql + 42.2.19 + junit diff --git a/src/main/java/org/gcube/documentstore/persistence/PersistencePostgreSQL.java b/src/main/java/org/gcube/documentstore/persistence/PersistencePostgreSQL.java index d91d0a0..d39ea34 100644 --- a/src/main/java/org/gcube/documentstore/persistence/PersistencePostgreSQL.java +++ b/src/main/java/org/gcube/documentstore/persistence/PersistencePostgreSQL.java @@ -3,6 +3,12 @@ */ 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; @@ -14,44 +20,88 @@ 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; + } } - @Override - protected void reallyAccount(Record record) throws Exception { - logger.trace("reallyAccount()"); + 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 accountWithFallback(Record... records) throws Exception { - logger.trace("accountWithFallback()"); - } - - @Override - public void close() throws Exception { - logger.trace("close()"); + 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("closeAndClean()"); + 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 true; + return connection.isValid(300); }; }