You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

271 lines
8.8 KiB

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<RowEntity> 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<RowPermission> 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<RowInheritance> 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<RowLadder> 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');");
}
}