Skip to content

Commit 3cec0bb

Browse files
committed
DBAdapter.java now drops all tables constraints before main restore loop (restore step -2) to fix fk dependency errors on re-creating pk's
Fix autoCommit mode set to true in some occasions SortedListMetaObject.java, DBBackupAdapter.java some refactor\renames
1 parent 9b2c02b commit 3cec0bb

File tree

3 files changed

+43
-21
lines changed

3 files changed

+43
-21
lines changed

src/main/java/ru/fusionsoft/dbgit/adapters/DBAdapter.java

Lines changed: 28 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515
import java.sql.ResultSet;
1616
import java.sql.Timestamp;
1717
import java.text.MessageFormat;
18-
import java.util.ArrayList;
1918
import java.util.List;
2019
import java.util.Set;
2120
import java.util.concurrent.TimeUnit;
@@ -45,10 +44,10 @@ public Connection getConnection() {
4544
int pauseTimeSeconds = DBGitConfig.getInstance().getInteger("core", "TRY_DELAY", DBGitConfig.getInstance().getIntegerGlobal("core", "TRY_DELAY", 1000));
4645
int currentTry = 0;
4746

48-
if (connect.isValid(0))
47+
if (connect.isValid(0)){
48+
connect.setAutoCommit(false);
4949
return connect;
50-
51-
else {
50+
} else {
5251
ConsoleWriter.println("Connection lost, trying to reconnect...");
5352
while (currentTry <= maxTriesCount) {
5453
TimeUnit.SECONDS.sleep(pauseTimeSeconds);
@@ -60,6 +59,7 @@ public Connection getConnection() {
6059
conn = DBConnection.getInstance(true);
6160
ConsoleWriter.println("Successful reconnect");
6261
connect = conn.getConnect();
62+
connect.setAutoCommit(false);
6363
return connect;
6464
}
6565
}
@@ -92,11 +92,19 @@ public void restoreDataBase(IMapMetaObject updateObjs) throws Exception {
9292
DBGitLang lang = DBGitLang.getInstance();
9393

9494
try {
95-
List<MetaTable> tables = new ArrayList<>();
95+
SortedListMetaObject tables = new SortedListMetaObject(updateObjs.values().stream().filter(x->x instanceof MetaTable ).collect(Collectors.toList()));
96+
SortedListMetaObject tablesExists = new SortedListMetaObject(updateObjs.values().stream().filter(x->x instanceof MetaTable && isExists(x)).collect(Collectors.toList()));
97+
9698
Set<String> createdSchemas = getSchemes().values().stream().map(DBOptionsObject::getName).collect(Collectors.toSet());
9799
Set<String> createdRoles = getRoles().values().stream().map(DBRole::getName).collect(Collectors.toSet());
98100

99-
for (IMetaObject obj : updateObjs.getSortedList().sortFromFree()) {
101+
// remove table indexes and constraints, which is step(-2) of restoreMetaObject(MetaTable)
102+
ConsoleWriter.println("Dropping constraints for all updating tables...");
103+
for (IMetaObject table : tablesExists.sortFromDependencies()) {
104+
getFactoryRestore().getAdapterRestore(DBGitMetaType.DBGitTable, this).restoreMetaObject(table, -2);
105+
}
106+
107+
for (IMetaObject obj : updateObjs.getSortedList().sortFromReferenced()) {
100108
Timestamp timestampBefore = new Timestamp(System.currentTimeMillis());
101109
int step = 0;
102110
boolean res = false;
@@ -113,15 +121,15 @@ public void restoreDataBase(IMapMetaObject updateObjs) throws Exception {
113121
res = restoreAdapter.restoreMetaObject(obj, step++);
114122

115123
if (step > 100) { throw new Exception(lang.getValue("errors", "restore", "restoreErrorDidNotReturnTrue").toString()); }
116-
if (obj instanceof MetaTable){ tables.add((MetaTable) obj); }
117124
}
118125

119126
Long timeDiff = new Timestamp(System.currentTimeMillis()).getTime() - timestampBefore.getTime();
120127
ConsoleWriter.detailsPrintlnGreen(MessageFormat.format("({1} {2})", obj.getName(), timeDiff, lang.getValue("general", "add", "ms")));
121128
}
122129

123130
// restore table constraints, which is step(-1) of restoreMetaObject(MetaTable)
124-
for (MetaTable table : tables) {
131+
ConsoleWriter.println("Restoring constraints for all updated tables...");
132+
for (IMetaObject table : tables.sortFromReferenced()) {
125133
getFactoryRestore().getAdapterRestore(DBGitMetaType.DBGitTable, this).restoreMetaObject(table, -1);
126134
}
127135
connect.commit();
@@ -144,7 +152,7 @@ public void deleteDataBase(IMapMetaObject deleteObjs, boolean isDeleteFromIndex)
144152
DBGitIndex index = DBGitIndex.getInctance();
145153

146154
try {
147-
List<IMetaObject> deleteObjsSorted = deleteObjs.getSortedList().sortFromDependant();
155+
List<IMetaObject> deleteObjsSorted = deleteObjs.getSortedList().sortFromDependencies();
148156
for (IMetaObject obj : deleteObjsSorted) {
149157
getFactoryRestore().getAdapterRestore(obj.getType(), this).removeMetaObject(obj);
150158
if(isDeleteFromIndex) index.removeItem(obj);
@@ -219,6 +227,17 @@ private void createRoleIfNeed(IMetaObject obj, Set<String> createdRoles) throws
219227
}
220228

221229
}
230+
protected boolean isExists(IMetaObject obj){
231+
try{
232+
IDBBackupAdapter backupAdapter = getBackupAdapterFactory().getBackupAdapter(AdapterFactory.createAdapter());
233+
return backupAdapter.isExists(
234+
obj.getUnderlyingDbObject().getSchema(),
235+
obj.getUnderlyingDbObject().getName()
236+
);
237+
} catch (Exception ex) {
238+
return false;
239+
}
240+
}
222241

223242
private boolean checkContainsNativeFields(IMetaObject obj){
224243
if (obj instanceof MetaTable) {

src/main/java/ru/fusionsoft/dbgit/adapters/DBBackupAdapter.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
import ru.fusionsoft.dbgit.statement.StatementLogging;
88
import ru.fusionsoft.dbgit.utils.ConsoleWriter;
99

10-
import java.sql.Timestamp;
1110
import java.text.MessageFormat;
1211
import java.util.*;
1312
import java.util.function.Function;
@@ -128,7 +127,7 @@ public void backupDatabase(IMapMetaObject updateObjs) throws Exception {
128127

129128
dropList.addAll(dbDroppingBackups.values());
130129
dropList.addAll(dbDroppingBackupsDeps);
131-
List<IMetaObject> dropListSorted = new SortedListMetaObject(dropList).sortFromDependant();
130+
List<IMetaObject> dropListSorted = new SortedListMetaObject(dropList).sortFromDependencies();
132131

133132
ConsoleWriter.printlnGreen(MessageFormat.format("Rewriting {0} backups with {1} dependencies", dbDroppingBackups.size(), dbDroppingBackupsDeps.size()));
134133
dropListSorted.forEach( x -> ConsoleWriter.detailsPrintlnGreen( x.getName()));
@@ -143,7 +142,7 @@ public void backupDatabase(IMapMetaObject updateObjs) throws Exception {
143142
}
144143

145144
//create backups
146-
for(IMetaObject imo : dbToBackup.getSortedList().sortFromFree()){
145+
for(IMetaObject imo : dbToBackup.getSortedList().sortFromReferenced()){
147146
backupDBObject(imo);
148147
}
149148

src/main/java/ru/fusionsoft/dbgit/meta/SortedListMetaObject.java

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,9 @@ private void calculateImoCrossDependencies(){
6464
// long diff = timestampAfter.getTime() - timestampBefore.getTime();
6565
// ConsoleWriter.detailsPrintlnGreen(DBGitLang.getInstance().getValue("general", "time").withParams(Long.toString(diff)));
6666
}
67+
public Collection<IMetaObject> getCollection(){
68+
return collection;
69+
}
6770

6871
public List<IMetaObject> createSortedList(boolean isSortedFromFree) throws ExceptionDBGit {
6972
List<IMetaObject> list = new ArrayList<>();
@@ -85,11 +88,11 @@ public List<IMetaObject> createSortedList(boolean isSortedFromFree) throws Excep
8588
if (tp.equals(DBGitMetaType.DBGitTable) || objectsOfType.get(0) instanceof MetaSql) {
8689
Set<String> namesAllOfType = objectsOfType.stream().map(IMetaObject::getName).collect(Collectors.toSet());
8790
List<IMetaObject> objectsL0 = objectsOfType.stream()
88-
.filter(x -> {
89-
Set<String> deps = x.getUnderlyingDbObject().getDependencies();
90-
return deps.size() == 0 || ( deps.size() == 1 && deps.contains(x.getName()) );
91-
})
92-
.collect(Collectors.toList());
91+
.filter(x -> {
92+
Set<String> deps = x.getUnderlyingDbObject().getDependencies();
93+
return deps.size() == 0 || ( deps.size() == 1 && deps.contains(x.getName()) );
94+
})
95+
.collect(Collectors.toList());
9396

9497
objectsOfType.removeAll(objectsL0);
9598
while (!objectsOfType.isEmpty()) {
@@ -98,7 +101,7 @@ public List<IMetaObject> createSortedList(boolean isSortedFromFree) throws Excep
98101
.stream()
99102
.filter(x -> {
100103
Set<String> actualDeps = new HashSet<>(x.getUnderlyingDbObject().getDependencies());
101-
actualDeps.retainAll(namesAllOfType);
104+
actualDeps.retainAll(namesAllOfType); //only deps of same type
102105
actualDeps.remove(x.getName());
103106
return namesL0.containsAll(actualDeps);
104107
})
@@ -109,7 +112,8 @@ public List<IMetaObject> createSortedList(boolean isSortedFromFree) throws Excep
109112
throw new ExceptionDBGit("infinite loop");
110113
}
111114
objectsOfType.removeAll(objectsL1);
112-
if(isSortedFromFree) { objectsL0.addAll(objectsL1); } else { objectsL0.addAll(0, objectsL1); }
115+
if(isSortedFromFree) { objectsL0.addAll(objectsL1); }
116+
else { objectsL0.addAll(0, objectsL1); }
113117
}
114118
list.addAll(objectsL0);
115119
} else {
@@ -125,14 +129,14 @@ public List<IMetaObject> createSortedList(boolean isSortedFromFree) throws Excep
125129
return list;
126130
}
127131

128-
public List<IMetaObject> sortFromDependant() throws ExceptionDBGit {
132+
public List<IMetaObject> sortFromDependencies() throws ExceptionDBGit {
129133
if (listFromDependant == null) {
130134
listFromDependant = createSortedList(false);
131135
}
132136
return listFromDependant;
133137

134138
}
135-
public List<IMetaObject> sortFromFree() throws ExceptionDBGit {
139+
public List<IMetaObject> sortFromReferenced() throws ExceptionDBGit {
136140
if (listFromFree == null) {
137141
listFromFree = createSortedList(true);
138142
}

0 commit comments

Comments
 (0)