From 2896e7df2167acc79d91eaad88354d5f6a588061 Mon Sep 17 00:00:00 2001 From: Stanislav Usenkov Date: Tue, 26 Apr 2016 10:34:12 +0600 Subject: [PATCH] Working on db changing methods. --- .../Engine/Backends/DatabaseTransaction.java | 93 ++++++++++++++++--- 1 file changed, 78 insertions(+), 15 deletions(-) diff --git a/src/main/java/ru/simsonic/rscPermissions/Engine/Backends/DatabaseTransaction.java b/src/main/java/ru/simsonic/rscPermissions/Engine/Backends/DatabaseTransaction.java index 072195b..8d895a0 100644 --- a/src/main/java/ru/simsonic/rscPermissions/Engine/Backends/DatabaseTransaction.java +++ b/src/main/java/ru/simsonic/rscPermissions/Engine/Backends/DatabaseTransaction.java @@ -1,8 +1,12 @@ package ru.simsonic.rscPermissions.Engine.Backends; +import java.util.HashSet; import java.util.LinkedList; import java.util.List; import ru.simsonic.rscMinecraftLibrary.Bukkit.CommandAnswerException; +import ru.simsonic.rscMinecraftLibrary.Bukkit.GenericChatCodes; +import ru.simsonic.rscPermissions.API.RowInheritance; +import ru.simsonic.rscPermissions.API.RowPermission; import ru.simsonic.rscPermissions.BukkitPluginMain; public class DatabaseTransaction @@ -22,15 +26,7 @@ public class DatabaseTransaction */ public void apply() throws CommandAnswerException { - // START TRANSACTION AND LOCK TABLE - rscp.connection.lockTableEntities(); - rscp.connection.lockTablePermissions(); - rscp.connection.lockTableInheritance(); - rscp.connection.transactionStart(); - - // SELECT FROM DATABASE INTO LOCAL CACHE TO MAKE IT ACTUAL - final DatabaseContents contents = rscp.commandHelper.threadFetchDatabaseContents.remoteToLocal(); - + final DatabaseContents contents = prepareChanges(); // UNDERSTAND WHAT TO DO if(contents != null) { @@ -44,13 +40,80 @@ public class DatabaseTransaction { } - } - - // COMMIT CHANGES AND UNLOCK TABLE - rscp.connection.transactionCommit(); - rscp.connection.unlockAllTables(); - + // COMMIT CHANGES AND UNLOCK TABLES + finishChanges(true); + } else + // CANCEL TRANSACTION AND UNLOCK TABLES + finishChanges(false); + } + private void applyAddUserPermission() + { + } + private void applyAddUserInheritance() + { + } + private void applyRemoveUserPermission() + { + } + private void applyRemoveUserInheritance() + { + } + private DatabaseContents prepareChanges() + { + // START TRANSACTION AND LOCK TABLE + rscp.connection.lockTableEntities(); + rscp.connection.lockTablePermissions(); + rscp.connection.lockTableInheritance(); + rscp.connection.transactionStart(); + // SELECT FROM DATABASE INTO LOCAL CACHE TO MAKE IT ACTUAL + return rscp.commandHelper.threadFetchDatabaseContents.remoteToLocal(); + } + private void finishChanges(boolean commit) + { + // COMMIT OR ROLLBACK ACTIONS + if(commit) + rscp.connection.transactionCommit(); + else + rscp.connection.transactionCommit(); // CALL PLUGIN TO APPLY ALL THIS CHANGES rscp.commandHelper.threadFetchDatabaseContents.run(); } + private RowPermission restorePermissionsAfterDelete(DatabaseContents contents, RowPermission remove) + { + final LinkedList sameIDs = new LinkedList<>(); + for(RowPermission row : contents.permissions) + if(row.id == remove.id) + sameIDs.add(row); + if(sameIDs.isEmpty() == false) + { + final HashSet names = new HashSet<>(); + final HashSet perms = new HashSet<>(); + final HashSet dests = new HashSet<>(); + for(RowPermission row : sameIDs) + { + // assert remove.value == row.value; + // assert remove.expirience == row.expirience; + // assert remove.entityType.equals(row.entityType); + // assert remove.lifetime.equals(row.lifetime); + names.add(row.entity); + perms.add(row.permission); + dests.add(row.destination.toString()); + } + try + { + final RowPermission merged = remove.clone(); + merged.entity = GenericChatCodes.glue(names.toArray(new String[names.size()]), "; \n"); + merged.permission = GenericChatCodes.glue(perms.toArray(new String[names.size()]), "; \n"); + merged.destinationSource = GenericChatCodes.glue(dests.toArray(new String[names.size()]), "; \n"); + return merged; + } catch(CloneNotSupportedException ex) { + // IMPOSSIBLE + } + } + return null; + } + private RowPermission restoreInheritanceAfterDelete(DatabaseContents contents, RowInheritance remove) + { + return null; + } }