From 4e4e03916dd1709b56ef9fcb808d33429098e113 Mon Sep 17 00:00:00 2001 From: Hildeberto Mendonca Date: Wed, 21 Sep 2022 14:59:19 -0400 Subject: [PATCH] Fixes the issue with unsync database sequences. --- .../java/digger/repository/ColumnRepository.java | 6 ++++++ .../digger/repository/DatasourceRepository.java | 6 ++++++ .../digger/repository/IgnoredTableRepository.java | 5 +++++ .../java/digger/repository/RoleRepository.java | 5 +++++ .../java/digger/repository/TableRepository.java | 4 ++-- .../java/digger/repository/UserRepository.java | 5 +++++ .../digger/service/impl/ColumnServiceImpl.java | 10 +++++++++- .../digger/service/impl/DatasourceServiceImpl.java | 10 +++++++++- .../service/impl/IgnoredTableServiceImpl.java | 14 +++++++++++--- .../java/digger/service/impl/RoleServiceImpl.java | 10 +++++++++- .../java/digger/service/impl/TableServiceImpl.java | 4 +++- .../java/digger/service/impl/UserServiceImpl.java | 10 +++++++++- 12 files changed, 79 insertions(+), 10 deletions(-) diff --git a/src/main/java/digger/repository/ColumnRepository.java b/src/main/java/digger/repository/ColumnRepository.java index a32217e..63e967f 100644 --- a/src/main/java/digger/repository/ColumnRepository.java +++ b/src/main/java/digger/repository/ColumnRepository.java @@ -18,8 +18,11 @@ import digger.model.Column; import digger.model.Table; + +import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.Repository; +import java.math.BigDecimal; import java.util.List; public interface ColumnRepository extends Repository { @@ -27,6 +30,9 @@ public interface ColumnRepository extends Repository { Column findById(Long id); + @Query(value = "select nextval('table_column_id_seq')", nativeQuery = true) + BigDecimal getSequenceNextVal(); + List findAllByOrderByForeignKeyAsc(); List findByTable(Table table); List findByForeignKey(Column foreignKey); diff --git a/src/main/java/digger/repository/DatasourceRepository.java b/src/main/java/digger/repository/DatasourceRepository.java index c0e5065..d8bd6f7 100644 --- a/src/main/java/digger/repository/DatasourceRepository.java +++ b/src/main/java/digger/repository/DatasourceRepository.java @@ -17,8 +17,11 @@ package digger.repository; import digger.model.Datasource; + +import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.Repository; +import java.math.BigDecimal; import java.util.List; public interface DatasourceRepository extends Repository { @@ -26,6 +29,9 @@ public interface DatasourceRepository extends Repository { Datasource findById(Long id); + @Query(value = "select nextval('datasource_id_seq')", nativeQuery = true) + BigDecimal getSequenceNextVal(); + List findAll(); List findAllByOrderByName(); diff --git a/src/main/java/digger/repository/IgnoredTableRepository.java b/src/main/java/digger/repository/IgnoredTableRepository.java index c20dff0..e3c772c 100644 --- a/src/main/java/digger/repository/IgnoredTableRepository.java +++ b/src/main/java/digger/repository/IgnoredTableRepository.java @@ -19,8 +19,10 @@ import digger.model.Datasource; import digger.model.IgnoredTable; +import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.Repository; +import java.math.BigDecimal; import java.util.List; public interface IgnoredTableRepository extends Repository { @@ -28,6 +30,9 @@ public interface IgnoredTableRepository extends Repository { IgnoredTable findById(Long id); + @Query(value = "select nextval('ignored_table_id_seq')", nativeQuery = true) + BigDecimal getSequenceNextVal(); + List findAll(); List findByDatasourceOrderByNameAsc(Datasource datasource); diff --git a/src/main/java/digger/repository/RoleRepository.java b/src/main/java/digger/repository/RoleRepository.java index 52cf7ed..ecb3ef2 100644 --- a/src/main/java/digger/repository/RoleRepository.java +++ b/src/main/java/digger/repository/RoleRepository.java @@ -16,15 +16,20 @@ package digger.repository; +import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.Repository; import digger.model.Role; +import java.math.BigDecimal; import java.util.List; public interface RoleRepository extends Repository { Long count(); Long countAllByAuthority(String authority); + + @Query(value = "select nextval('authorities_id_seq')", nativeQuery = true) + BigDecimal getSequenceNextVal(); Role findByUsername(String username); diff --git a/src/main/java/digger/repository/TableRepository.java b/src/main/java/digger/repository/TableRepository.java index 89c725e..8c21222 100644 --- a/src/main/java/digger/repository/TableRepository.java +++ b/src/main/java/digger/repository/TableRepository.java @@ -33,8 +33,8 @@ public interface TableRepository extends Repository { List findAll(); List
findByDatasourceOrderByNameAsc(Datasource datasource); - @Query(value = "select database_table_id_seq.nextval from dual", nativeQuery = true) - BigDecimal getNextVal(); + @Query(value = "select nextval('database_table_id_seq')", nativeQuery = true) + BigDecimal getSequenceNextVal(); void save(Table table); void deleteById(Long id); diff --git a/src/main/java/digger/repository/UserRepository.java b/src/main/java/digger/repository/UserRepository.java index 42b77cb..f17fd20 100644 --- a/src/main/java/digger/repository/UserRepository.java +++ b/src/main/java/digger/repository/UserRepository.java @@ -18,8 +18,10 @@ import digger.model.User; +import java.math.BigDecimal; import java.util.List; +import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.Repository; public interface UserRepository extends Repository { @@ -29,6 +31,9 @@ public interface UserRepository extends Repository { User findById(long id); User findByUsername(String username); + @Query(value = "select nextval('user_id_seq')", nativeQuery = true) + BigDecimal getSequenceNextVal(); + List findAll(); List findAllByOrderByUsernameAsc(); diff --git a/src/main/java/digger/service/impl/ColumnServiceImpl.java b/src/main/java/digger/service/impl/ColumnServiceImpl.java index 48dcdb4..5915e8f 100644 --- a/src/main/java/digger/service/impl/ColumnServiceImpl.java +++ b/src/main/java/digger/service/impl/ColumnServiceImpl.java @@ -27,8 +27,10 @@ import digger.utils.SqlHelper; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.dao.DataIntegrityViolationException; import org.springframework.stereotype.Service; +import java.math.BigDecimal; import java.sql.Connection; import java.sql.DatabaseMetaData; import java.sql.ResultSet; @@ -134,7 +136,13 @@ public Column getColumn(final Datasource datasource, final Table table, final Co public void save(Column column) { column.setPrimaryKey(isPrimaryKey(column)); - columnRepository.save(column); + try { + columnRepository.save(column); + } catch (DataIntegrityViolationException dive) { + BigDecimal seq = columnRepository.getSequenceNextVal(); + logger.warn("Column sequence out of sync. Incrementing sequence to: {}", seq); + save(column); + } logger.info("Saved the column {}", column.getName()); } diff --git a/src/main/java/digger/service/impl/DatasourceServiceImpl.java b/src/main/java/digger/service/impl/DatasourceServiceImpl.java index 59ec811..e9e429d 100644 --- a/src/main/java/digger/service/impl/DatasourceServiceImpl.java +++ b/src/main/java/digger/service/impl/DatasourceServiceImpl.java @@ -22,8 +22,10 @@ import digger.utils.SqlHelper; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.dao.DataIntegrityViolationException; import org.springframework.stereotype.Service; +import java.math.BigDecimal; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; @@ -53,7 +55,13 @@ public Datasource findById(final Long id) { } public void save(Datasource datasource) { - datasourceRepository.save(datasource); + try { + datasourceRepository.save(datasource); + } catch (DataIntegrityViolationException dive) { + BigDecimal seq = datasourceRepository.getSequenceNextVal(); + logger.warn("Datasource sequence out of sync. Incrementing sequence to: {}", seq); + save(datasource); + } logger.info("Saved datasource {}", datasource.getName()); } diff --git a/src/main/java/digger/service/impl/IgnoredTableServiceImpl.java b/src/main/java/digger/service/impl/IgnoredTableServiceImpl.java index e23f6b6..6a079ac 100644 --- a/src/main/java/digger/service/impl/IgnoredTableServiceImpl.java +++ b/src/main/java/digger/service/impl/IgnoredTableServiceImpl.java @@ -24,8 +24,10 @@ import digger.utils.SqlHelper; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.dao.DataIntegrityViolationException; import org.springframework.stereotype.Service; +import java.math.BigDecimal; import java.util.ArrayList; import java.util.List; @@ -40,9 +42,15 @@ public IgnoredTableServiceImpl(IgnoredTableRepository ignoredTableRepository) { } public void save(List ignoredTables) { - for (IgnoredTable ignoredTable: ignoredTables) { - ignoredTableRepository.save(ignoredTable); - logger.info("Saved ignored table {}", ignoredTable.getName()); + try { + for (IgnoredTable ignoredTable: ignoredTables) { + ignoredTableRepository.save(ignoredTable); + logger.info("Saved ignored table {}", ignoredTable.getName()); + } + } catch (DataIntegrityViolationException dive) { + BigDecimal seq = ignoredTableRepository.getSequenceNextVal(); + logger.warn("IgnoredTable sequence out of sync. Incrementing sequence to: {}", seq); + save(ignoredTables); } } diff --git a/src/main/java/digger/service/impl/RoleServiceImpl.java b/src/main/java/digger/service/impl/RoleServiceImpl.java index 1f72242..ddfc7aa 100644 --- a/src/main/java/digger/service/impl/RoleServiceImpl.java +++ b/src/main/java/digger/service/impl/RoleServiceImpl.java @@ -22,8 +22,10 @@ import digger.utils.SqlHelper; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.dao.DataIntegrityViolationException; import org.springframework.stereotype.Service; +import java.math.BigDecimal; import java.util.ArrayList; import java.util.List; @@ -50,7 +52,13 @@ public Role findByUsername(final String username) { } public void save(Role role) { - this.roleRepository.save(role); + try { + this.roleRepository.save(role); + } catch (DataIntegrityViolationException dive) { + BigDecimal seq = roleRepository.getSequenceNextVal(); + logger.warn("Role sequence out of sync. Incrementing sequence to: {}", seq); + save(role); + } logger.info("Assigned role {} to user {}", role.getAuthority(), role.getUsername()); } diff --git a/src/main/java/digger/service/impl/TableServiceImpl.java b/src/main/java/digger/service/impl/TableServiceImpl.java index 15bf52f..dceff44 100644 --- a/src/main/java/digger/service/impl/TableServiceImpl.java +++ b/src/main/java/digger/service/impl/TableServiceImpl.java @@ -28,6 +28,7 @@ import org.springframework.dao.DataIntegrityViolationException; import org.springframework.stereotype.Service; +import java.math.BigDecimal; import java.sql.Connection; import java.sql.DatabaseMetaData; import java.sql.ResultSet; @@ -92,7 +93,8 @@ public void save(Table table) { try { tableRepository.save(table); } catch (DataIntegrityViolationException dive) { - tableRepository.getNextVal(); + BigDecimal seq = tableRepository.getSequenceNextVal(); + logger.warn("Table sequence out of sync. Incrementing sequence to: {}", seq); save(table); } logger.info("Saved table {}", table.getName()); diff --git a/src/main/java/digger/service/impl/UserServiceImpl.java b/src/main/java/digger/service/impl/UserServiceImpl.java index b0a5c28..bbe22a3 100644 --- a/src/main/java/digger/service/impl/UserServiceImpl.java +++ b/src/main/java/digger/service/impl/UserServiceImpl.java @@ -26,6 +26,7 @@ import digger.utils.SqlHelper; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.dao.DataIntegrityViolationException; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.crypto.factory.PasswordEncoderFactories; import org.springframework.security.crypto.password.PasswordEncoder; @@ -33,6 +34,7 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.math.BigDecimal; import java.util.ArrayList; import java.util.List; @@ -71,7 +73,13 @@ public digger.model.User findByUsername(final String username) { } public void save(digger.model.User user) { - userRepository.save(user); + try { + userRepository.save(user); + } catch (DataIntegrityViolationException dive) { + BigDecimal seq = userRepository.getSequenceNextVal(); + logger.warn("User sequence out of sync. Incrementing sequence to: {}", seq); + save(user); + } logger.info("Saved user {}", user.getUsername()); }