fix: DB inserts in statistics work with PostgreSQL

pull/1580/head
BaranekD 2021-12-06 15:19:20 +01:00
parent cc76258a3b
commit b72eb8fd8e
1 changed files with 106 additions and 40 deletions

View File

@ -105,36 +105,44 @@ public class ProxyStatisticsFilter extends PerunRequestFilter {
return true;
}
this.insertLogin(idpEntityId, idpName, clientIdentifier, clientName, userId);
this.insertOrUpdateLogin(idpEntityId, idpName, clientIdentifier, clientName, userId);
this.logUserLogin(idpEntityId, clientIdentifier, clientName, userId);
return true;
}
private void insertLogin(String idpEntityId, String idpName, String spIdentifier, String spName, String userId) {
LocalDate date = LocalDate.now();
String insertLoginQuery = "INSERT INTO " + statisticsTableName + "(day, idpId, spId, user, logins)" +
" VALUES(?, ?, ?, ?, '1') ON DUPLICATE KEY UPDATE logins = logins + 1";
private void insertOrUpdateLogin(String idpEntityId, String idpName, String spIdentifier, String spName, String userId) {
Connection c;
int idpId;
int spId;
try (Connection c = mitreIdStats.getConnection()) {
insertIdpMap(c, idpEntityId, idpName);
insertSpMap(c, spIdentifier, spName);
int idpId = extractIdpId(c, idpEntityId);
int spId = extractSpId(c, spIdentifier);
try (PreparedStatement preparedStatement = c.prepareStatement(insertLoginQuery)) {
preparedStatement.setDate(1, Date.valueOf(date));
preparedStatement.setInt(2, idpId);
preparedStatement.setInt(3, spId);
preparedStatement.setString(4, userId);
preparedStatement.execute();
log.trace("{} - login entry stored ({}, {}, {}, {}, {})", filterName, idpEntityId, idpName,
spIdentifier, spName, userId);
}
try {
c = mitreIdStats.getConnection();
insertOrUpdateIdpMap(c, idpEntityId, idpName);
insertOrUpdateSpMap(c, spIdentifier, spName);
idpId = extractIdpId(c, idpEntityId);
spId = extractSpId(c, spIdentifier);
} catch (SQLException ex) {
log.warn("{} - caught SQLException", filterName);
log.debug("{} - details:", filterName, ex);
return;
}
LocalDate date = LocalDate.now();
try {
insertLogin(date, c, idpId, spId, userId);
} catch (SQLException ex) {
try {
updateLogin(date, c, idpId, spId, userId);
} catch (SQLException e) {
log.warn("{} - caught SQLException", filterName);
log.debug("{} - details:", filterName, e);
}
}
log.trace("{} - login entry stored ({}, {}, {}, {}, {})", filterName, idpEntityId, idpName,
spIdentifier, spName, userId);
}
private int extractSpId(Connection c, String spIdentifier) throws SQLException {
@ -159,30 +167,24 @@ public class ProxyStatisticsFilter extends PerunRequestFilter {
}
}
private void insertSpMap(Connection c, String spIdentifier, String spName) throws SQLException {
String insertSpMapQuery = "INSERT INTO " + serviceProvidersMapTableName + "(identifier, name)" +
" VALUES (?, ?) ON DUPLICATE KEY UPDATE name = ?";
try (PreparedStatement preparedStatement = c.prepareStatement(insertSpMapQuery)) {
preparedStatement.setString(1, spIdentifier);
preparedStatement.setString(2, spName);
preparedStatement.setString(3, spName);
preparedStatement.execute();
log.trace("{} - SP map entry inserted", filterName);
private void insertOrUpdateIdpMap(Connection c, String idpEntityId, String idpName) throws SQLException {
try {
insertIdpMap(c, idpEntityId, idpName);
} catch (SQLException ex) {
updateIdpMap(c, idpEntityId, idpName);
}
log.trace("{} - IdP map entry inserted", filterName);
}
private void insertIdpMap(Connection c, String idpEntityId, String idpName) throws SQLException {
String insertIdpMapQuery = "INSERT INTO " + identityProvidersMapTableName + "(identifier, name)" +
" VALUES (?, ?) ON DUPLICATE KEY UPDATE name = ?";
try (PreparedStatement preparedStatement = c.prepareStatement(insertIdpMapQuery)) {
preparedStatement.setString(1, idpEntityId);
preparedStatement.setString(2, idpName);
preparedStatement.setString(3, idpName);
preparedStatement.execute();
log.trace("{} - IdP map entry inserted", filterName);
private void insertOrUpdateSpMap(Connection c, String spIdentifier, String idpName) throws SQLException {
try {
insertSpMap(c, spIdentifier, idpName);
} catch (SQLException ex) {
updateSpMap(c, spIdentifier, idpName);
}
log.trace("{} - SP map entry inserted", filterName);
}
private String changeParamEncoding(String original) {
@ -199,4 +201,68 @@ public class ProxyStatisticsFilter extends PerunRequestFilter {
spName, idpEntityId);
}
private void insertLogin(LocalDate date, Connection c, int idpId, int spId, String userId) throws SQLException {
String insertLoginQuery = "INSERT INTO " + statisticsTableName +
"(day, idpId, spId, user, logins)" +
" VALUES(?, ?, ?, ?, '1')";
PreparedStatement preparedStatement = c.prepareStatement(insertLoginQuery);
preparedStatement.setDate(1, Date.valueOf(date));
preparedStatement.setInt(2, idpId);
preparedStatement.setInt(3, spId);
preparedStatement.setString(4, userId);
preparedStatement.execute();
}
private void updateLogin(LocalDate date, Connection c, int idpId, int spId, String userId) throws SQLException {
String updateLoginQuery = "UPDATE " + statisticsTableName + " SET logins = logins + 1" +
" WHERE day = ? AND idpId = ? AND spId = ? AND user = ?";
PreparedStatement preparedStatement = c.prepareStatement(updateLoginQuery);
preparedStatement.setDate(1, Date.valueOf(date));
preparedStatement.setInt(2, idpId);
preparedStatement.setInt(3, spId);
preparedStatement.setString(4, userId);
preparedStatement.execute();
}
private void insertIdpMap(Connection c, String idpEntityId, String idpName) throws SQLException {
String insertIdpMapQuery = "INSERT INTO " + identityProvidersMapTableName + "(identifier, name)" +
" VALUES (?, ?)";
PreparedStatement preparedStatement = c.prepareStatement(insertIdpMapQuery);
preparedStatement.setString(1, idpEntityId);
preparedStatement.setString(2, idpName);
preparedStatement.execute();
}
private void updateIdpMap(Connection c, String idpEntityId, String idpName) throws SQLException {
String updateIdpMapQuery = "UPDATE " + identityProvidersMapTableName + "SET name = ? WHERE identifier = ?";
PreparedStatement preparedStatement = c.prepareStatement(updateIdpMapQuery);
preparedStatement.setString(1, idpName);
preparedStatement.setString(2, idpEntityId);
preparedStatement.execute();
}
private void insertSpMap(Connection c, String spIdentifier, String spName) throws SQLException {
String insertSpMapQuery = "INSERT INTO " + serviceProvidersMapTableName + "(identifier, name)" +
" VALUES (?, ?)";
try (PreparedStatement preparedStatement = c.prepareStatement(insertSpMapQuery)) {
preparedStatement.setString(1, spIdentifier);
preparedStatement.setString(2, spName);
preparedStatement.execute();
}
}
private void updateSpMap(Connection c, String spIdentifier, String idpName) throws SQLException {
String updateSpMapQuery = "UPDATE " + serviceProvidersMapTableName + "SET name = ? WHERE identifier = ?";
PreparedStatement preparedStatement = c.prepareStatement(updateSpMapQuery);
preparedStatement.setString(1, idpName);
preparedStatement.setString(2, spIdentifier);
preparedStatement.execute();
}
}