Skip to content

Commit

Permalink
Fixes the issue with unsync database sequences.
Browse files Browse the repository at this point in the history
  • Loading branch information
htmfilho committed Sep 21, 2022
1 parent b381602 commit 4e4e039
Show file tree
Hide file tree
Showing 12 changed files with 79 additions and 10 deletions.
6 changes: 6 additions & 0 deletions src/main/java/digger/repository/ColumnRepository.java
Original file line number Diff line number Diff line change
Expand Up @@ -18,15 +18,21 @@

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<Column, Long> {
Long count();

Column findById(Long id);

@Query(value = "select nextval('table_column_id_seq')", nativeQuery = true)
BigDecimal getSequenceNextVal();

List<Column> findAllByOrderByForeignKeyAsc();
List<Column> findByTable(Table table);
List<Column> findByForeignKey(Column foreignKey);
Expand Down
6 changes: 6 additions & 0 deletions src/main/java/digger/repository/DatasourceRepository.java
Original file line number Diff line number Diff line change
Expand Up @@ -17,15 +17,21 @@
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<Datasource, Long> {
Long count();

Datasource findById(Long id);

@Query(value = "select nextval('datasource_id_seq')", nativeQuery = true)
BigDecimal getSequenceNextVal();

List<Datasource> findAll();
List<Datasource> findAllByOrderByName();

Expand Down
5 changes: 5 additions & 0 deletions src/main/java/digger/repository/IgnoredTableRepository.java
Original file line number Diff line number Diff line change
Expand Up @@ -19,15 +19,20 @@
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<IgnoredTable, Long> {
Long count();

IgnoredTable findById(Long id);

@Query(value = "select nextval('ignored_table_id_seq')", nativeQuery = true)
BigDecimal getSequenceNextVal();

List<IgnoredTable> findAll();
List<IgnoredTable> findByDatasourceOrderByNameAsc(Datasource datasource);

Expand Down
5 changes: 5 additions & 0 deletions src/main/java/digger/repository/RoleRepository.java
Original file line number Diff line number Diff line change
Expand Up @@ -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<Role, Long> {
Long count();
Long countAllByAuthority(String authority);

@Query(value = "select nextval('authorities_id_seq')", nativeQuery = true)
BigDecimal getSequenceNextVal();

Role findByUsername(String username);

Expand Down
4 changes: 2 additions & 2 deletions src/main/java/digger/repository/TableRepository.java
Original file line number Diff line number Diff line change
Expand Up @@ -33,8 +33,8 @@ public interface TableRepository extends Repository<Table, Long> {
List<Table> findAll();
List<Table> 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);
Expand Down
5 changes: 5 additions & 0 deletions src/main/java/digger/repository/UserRepository.java
Original file line number Diff line number Diff line change
Expand Up @@ -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<User, Long> {
Expand All @@ -29,6 +31,9 @@ public interface UserRepository extends Repository<User, Long> {
User findById(long id);
User findByUsername(String username);

@Query(value = "select nextval('user_id_seq')", nativeQuery = true)
BigDecimal getSequenceNextVal();

List<User> findAll();
List<User> findAllByOrderByUsernameAsc();

Expand Down
10 changes: 9 additions & 1 deletion src/main/java/digger/service/impl/ColumnServiceImpl.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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());
}

Expand Down
10 changes: 9 additions & 1 deletion src/main/java/digger/service/impl/DatasourceServiceImpl.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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());
}

Expand Down
14 changes: 11 additions & 3 deletions src/main/java/digger/service/impl/IgnoredTableServiceImpl.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand All @@ -40,9 +42,15 @@ public IgnoredTableServiceImpl(IgnoredTableRepository ignoredTableRepository) {
}

public void save(List<IgnoredTable> 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);
}
}

Expand Down
10 changes: 9 additions & 1 deletion src/main/java/digger/service/impl/RoleServiceImpl.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand All @@ -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());
}

Expand Down
4 changes: 3 additions & 1 deletion src/main/java/digger/service/impl/TableServiceImpl.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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());
Expand Down
10 changes: 9 additions & 1 deletion src/main/java/digger/service/impl/UserServiceImpl.java
Original file line number Diff line number Diff line change
Expand Up @@ -26,13 +26,15 @@
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;
import org.springframework.security.provisioning.UserDetailsManager;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;

Expand Down Expand Up @@ -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());
}

Expand Down

0 comments on commit 4e4e039

Please sign in to comment.