package ru.simsonic.rscPermissions.Backends; import ru.simsonic.utilities.*; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.Arrays; import java.util.logging.Level; import ru.simsonic.rscPermissions.DataTypes.Destination; import ru.simsonic.rscPermissions.DataTypes.RowEntity; import ru.simsonic.rscPermissions.DataTypes.EntityType; import ru.simsonic.rscPermissions.DataTypes.RowInheritance; import ru.simsonic.rscPermissions.DataTypes.RowLadder; import ru.simsonic.rscPermissions.DataTypes.RowPermission; import ru.simsonic.rscPermissions.InternalCache.LocalCacheData; import ru.simsonic.rscPermissions.MainPluginClass; import ru.simsonic.rscPermissions.Settings; public class BackendMySQL extends ConnectionMySQL implements Backend { protected final MainPluginClass plugin; protected static enum WorkMode { read, write, none, } protected WorkMode RememberWork; public BackendMySQL(MainPluginClass plugin) { this.plugin = plugin; } public synchronized void Initialize(String name, String database, String username, String password, String workmode, String prefixes) { super.Initialize(name, database, username, password, prefixes); switch(workmode.toLowerCase()) { case "fullaccess": RememberWork = WorkMode.write; break; case "readonly": RememberWork = WorkMode.read; break; case "none": default: RememberWork = WorkMode.none; break; } } @Override public synchronized boolean canRead() { return (RememberWork != WorkMode.none) ? (isConnected() ? true : Connect()) : false; } @Override public synchronized boolean canWrite() { return (RememberWork == WorkMode.write) ? (isConnected() ? true : Connect()) : false; } @Override public synchronized boolean Connect() { if(RememberWork == WorkMode.none) return false; if(super.Connect()) { executeUpdate(loadResourceSQLT("Initialize_main_v1")); cleanupTables(); return true; } return false; } @Override public synchronized ResultSet executeQuery(String query) { if(canRead() == false) return null; return super.executeQuery(query); } @Override public synchronized boolean executeUpdate(String query) { if(canWrite() == false) return false; return super.executeUpdate(query); } private void cleanupTables() { executeUpdate(loadResourceSQLT("Cleanup_tables")); } @Override public synchronized void fetchIntoCache(LocalCacheData cache) { cleanupTables(); MainPluginClass.consoleLog.log(Level.INFO, "[rscp] Fetched {0}e, {1}p, {2}i, {3}l, from \"{4}\".", new Object[] { Integer.toString(cache.ImportEntities(fetchEntities())), Integer.toString(cache.ImportPermissions(fetchPermissions())), Integer.toString(cache.ImportInheritance(fetchInheritance())), Integer.toString(cache.ImportLadders(fetchLadders())), RememberName, }); } @Override public synchronized RowEntity[] fetchEntities() { final ArrayList result = new ArrayList<>(); final ResultSet rs = executeQuery("SELECT * FROM `{DATABASE}`.`{PREFIX}entities`;"); try { while(rs.next()) { RowEntity row = new RowEntity(); row.id = rs.getInt("id"); row.entity = rs.getString("entity"); row.entityType = EntityType.byValue(rs.getInt("entity_type")); row.prefix = rs.getString("prefix"); row.suffix = rs.getString("suffix"); result.add(row); } rs.close(); } catch(SQLException ex) { MainPluginClass.consoleLog.log(Level.WARNING, "[rscp] Exception in rs2e(): {0}", ex.getLocalizedMessage()); } return result.toArray(new RowEntity[result.size()]); } @Override public synchronized RowPermission[] fetchPermissions() { final ArrayList result = new ArrayList<>(); final ResultSet rs = executeQuery("SELECT * FROM `{DATABASE}`.`{PREFIX}permissions`;"); final String serverId = plugin.getServer().getServerId(); try { while(rs.next()) { for(Destination destination : Destination.ParseDestinations(rs.getString("destination"))) { if(destination.IsServerIdApplicable(serverId) == false) continue; RowPermission row = new RowPermission(); row.id = rs.getInt("id"); row.entity = rs.getString("entity"); row.entityType = EntityType.byValue(rs.getInt("entity_type")); row.permission = rs.getString("permission"); row.value = rs.getBoolean("value"); row.destination = destination; row.expirience = rs.getInt("expirience"); row.lifetime = rs.getTimestamp("lifetime"); result.add(row); } } rs.close(); } catch(SQLException ex) { MainPluginClass.consoleLog.log(Level.WARNING, "[rscp] Exception in rs2p(): {0}", ex.getLocalizedMessage()); } return result.toArray(new RowPermission[result.size()]); } @Override public synchronized RowInheritance[] fetchInheritance() { final ArrayList result = new ArrayList<>(); final ResultSet rs = executeQuery("SELECT * FROM `{DATABASE}`.`{PREFIX}inheritance`;"); final String serverId = plugin.getServer().getServerId(); try { while(rs.next()) { for(Destination destination : Destination.ParseDestinations(rs.getString("destination"))) { if(destination.IsServerIdApplicable(serverId) == false) continue; RowInheritance row = new RowInheritance(); row.id = rs.getInt("id"); row.entity = rs.getString("entity"); row.parent = rs.getString("parent"); row.deriveInstance(); row.childType = EntityType.byValue(rs.getInt("inheritance_type")); row.priority = rs.getInt("inheritance_priority"); row.destination = destination; row.expirience = rs.getInt("expirience"); row.lifetime = rs.getTimestamp("lifetime"); result.add(row); } } rs.close(); } catch(SQLException ex) { MainPluginClass.consoleLog.log(Level.WARNING, "[rscp] Exception in rs2i(): {0}", ex.getLocalizedMessage()); } return result.toArray(new RowInheritance[result.size()]); } @Override public synchronized RowLadder[] fetchLadders() { final ArrayList result = new ArrayList<>(); final ResultSet rs = executeQuery("SELECT * FROM `{DATABASE}`.`{PREFIX}ladders`;"); try { while(rs.next()) { RowLadder row = new RowLadder(); row.id = rs.getInt("id"); row.climber = rs.getString("climber"); if("".equals(row.climber)) row.climber = null; row.climberType = EntityType.byValue(rs.getInt("climber_type")); row.ladder = rs.getString("ladder"); String[] breaked = row.ladder.split(Settings.separatorRegExp); if(breaked.length == 2) { row.ladder = breaked[0]; row.instance = breaked[1]; } row.rank = rs.getInt("rank"); result.add(row); } rs.close(); } catch(SQLException ex) { MainPluginClass.consoleLog.log(Level.WARNING, "[rscp] Exception in rs2l(): {0}", ex.getLocalizedMessage()); } return result.toArray(new RowLadder[result.size()]); } @Override public synchronized void insertExampleRows() { executeUpdate(loadResourceSQLT("Insert_example_rows_v1")); } @Override public synchronized void updateEntityText(String entity, boolean entity_type, String text, boolean isPrefix) { if("".equals(entity)) return; if("".equals(text) || "\"\"".equals(text)) text = null; setupQueryTemplate("{ENTITY}", entity); setupQueryTemplate("{ENTITY_TYPE}", entity_type ? "1" : "0"); setupQueryTemplate("{TEXT_TYPE}", isPrefix ? "prefix" : "suffix"); setupQueryTemplate("{TEXT}", (text != null) ? "'" + text + "'" : "NULL"); executeUpdate(loadResourceSQLT("Update_entity_text")); } @Override public synchronized void setUserRank(String user, String ladder, int rank) { if("".equals(user) || "".equals(ladder)) return; setupQueryTemplate("{USER}", user); setupQueryTemplate("{LADDER}", ladder); setupQueryTemplate("{RANK}", Integer.toString(rank)); executeUpdate(loadResourceSQLT("Set_user_rank")); } @Override public synchronized void dropUserFromLadder(String user, String ladder) { String instance = ""; String[] breaked = ladder.split(Settings.separatorRegExp); if(breaked.length == 2) { ladder = breaked[0]; instance = breaked[1]; } if("".equals(user) || "".equals(ladder)) return; setupQueryTemplate("{USER}", user); setupQueryTemplate("{LADDER}", ladder); setupQueryTemplate("{INSTANCE}", instance); executeUpdate(loadResourceSQLT("Drop_user_from_ladder")); } @Override public synchronized void addUserParentGroup(String user, String newGroup) { setupQueryTemplate("{USER}", user); setupQueryTemplate("{PARENT}", newGroup); executeUpdate("INSERT INTO `{DATABASE}`.`{PREFIX}inheritance` (`entity`, `parent`, `inheritance_type`) VALUES ('{USER}', '{PARENT}', b'1');"); } }