diff --git a/CHANGELOG.md b/CHANGELOG.md index 6eab689c030..f2c8984e23d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -22,6 +22,7 @@ We refer to [GitHub issues](https://github.com/JabRef/jabref/issues) by using `# ### Fixed - We fixed an issue where JabRef would not terminated after asking to collect anonymous statistics [#2955 comment](https://github.com/JabRef/jabref/issues/2955#issuecomment-334591123) - We fixed an issue where JabRef would not shut down when started with the '-n' (No GUI) option. + - We improved the way metadata is updated in remote databases. [#3235](https://github.com/JabRef/jabref/issues/3235) ### Removed diff --git a/src/main/java/org/jabref/shared/DBMSProcessor.java b/src/main/java/org/jabref/shared/DBMSProcessor.java index 9d10436e824..ea726fd7ea5 100644 --- a/src/main/java/org/jabref/shared/DBMSProcessor.java +++ b/src/main/java/org/jabref/shared/DBMSProcessor.java @@ -527,11 +527,17 @@ public Map getSharedMetaData() { * @param data JabRef meta data as map */ public void setSharedMetaData(Map data) throws SQLException { - connection.createStatement().executeUpdate("TRUNCATE TABLE " + escape("METADATA")); // delete data all data from table - - for (Map.Entry metaEntry : data.entrySet()) { - - StringBuilder query = new StringBuilder() + StringBuilder updateQuery = new StringBuilder() + .append("UPDATE ") + .append(escape("METADATA")) + .append(" SET ") + .append(escape("VALUE")) + .append(" = ? ") + .append(" WHERE ") + .append(escape("KEY")) + .append(" = ?"); + + StringBuilder insertQuery = new StringBuilder() .append("INSERT INTO ") .append(escape("METADATA")) .append("(") @@ -539,11 +545,21 @@ public void setSharedMetaData(Map data) throws SQLException { .append(", ") .append(escape("VALUE")) .append(") VALUES(?, ?)"); - - try (PreparedStatement preparedStatement = connection.prepareStatement(query.toString())) { - preparedStatement.setString(1, metaEntry.getKey()); - preparedStatement.setString(2, metaEntry.getValue()); - preparedStatement.executeUpdate(); + + for (Map.Entry metaEntry : data.entrySet()) { + try (PreparedStatement updateStatement = connection.prepareStatement(updateQuery.toString())) { + updateStatement.setString(2, metaEntry.getKey()); + updateStatement.setString(1, metaEntry.getValue()); + if (updateStatement.executeUpdate() == 0) { + // No rows updated -> insert data + try (PreparedStatement insertStatement = connection.prepareStatement(insertQuery.toString())) { + insertStatement.setString(1, metaEntry.getKey()); + insertStatement.setString(2, metaEntry.getValue()); + insertStatement.executeUpdate(); + } catch (SQLException e) { + LOGGER.error("SQL Error: ", e); + } + } } catch (SQLException e) { LOGGER.error("SQL Error: ", e); }