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.

351 lines
12 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.logging.Level;
import ru.simsonic.rscPermissions.DataTypes.Destination;
import ru.simsonic.rscPermissions.DataTypes.RowEntity;
import ru.simsonic.rscPermissions.DataTypes.RowEntity.EntityType;
import ru.simsonic.rscPermissions.DataTypes.RowInheritance;
import ru.simsonic.rscPermissions.DataTypes.RowLadder;
import ru.simsonic.rscPermissions.DataTypes.RowPermission;
import ru.simsonic.rscPermissions.DataTypes.RowReward;
import ru.simsonic.rscPermissions.DataTypes.RowServer;
import ru.simsonic.rscPermissions.LocalCacheData;
import ru.simsonic.rscPermissions.MainPluginClass;
import ru.simsonic.rscPermissions.Rewards;
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())
{
createTablesIfNotExist();
cleanupTables();
updateServerInfo();
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 createTablesIfNotExist()
{
executeUpdate(loadResourceSQLT("Initialize_main_v1"));
if(plugin.settings.isRewardsEnabled())
executeUpdate(loadResourceSQLT("Initialize_rewards_v1"));
}
private void cleanupTables()
{
executeUpdate(loadResourceSQLT("Cleanup_tables"));
}
private void updateServerInfo()
{
final String mMode = plugin.settings.getMaintenanceMode();
setupQueryTemplate("{SERVERID}", plugin.getServer().getServerId());
setupQueryTemplate("{PLUGIN_VER}", plugin.getDescription().getVersion());
setupQueryTemplate("{DEFAULT}", plugin.settings.getDefaultGroup());
setupQueryTemplate("{OP}", plugin.settings.isAsteriskOP() ? "1" : "0");
setupQueryTemplate("{DELAY}", Integer.toString(plugin.settings.getAutoReloadDelayTicks() / 20));
setupQueryTemplate("{mMode}", "".equals(mMode) ? "NULL" : "\"" + mMode + "\"");
setupQueryTemplate("{USE_R}", plugin.settings.isRewardsEnabled() ? "1" : "0");
setupQueryTemplate("{CFG_VER}", Integer.toString(plugin.settings.CurrentVersion));
executeUpdate(loadResourceSQLT("Update_server_info"));
}
@Override
public synchronized void fetchIntoCache(LocalCacheData cache)
{
cleanupTables();
MainPluginClass.consoleLog.log(Level.INFO,
"[rscp] Fetched {0}e, {1}p, {2}i, {3}l, {4}s from \"{5}\".",
new Object[]
{
Integer.toString(cache.ImportEntities(fetchEntities())),
Integer.toString(cache.ImportPermissions(fetchPermissions())),
Integer.toString(cache.ImportInheritance(fetchInheritance())),
Integer.toString(cache.ImportLadders(fetchLadders())),
Integer.toString(cache.ImportServers(fetchServers())),
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.entity_type = 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.entity_type = 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");
String[] breaked = row.parent.split(Settings.separatorRegExp);
if(breaked.length == 2)
{
row.parent = breaked[0];
row.instance = breaked[1];
}
row.child_type = 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.climber_type = 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 RowServer[] fetchServers()
{
final ArrayList<RowServer> result = new ArrayList<>();
final ResultSet rs = executeQuery("SELECT * FROM `{DATABASE}`.`{PREFIX}servers`;");
try
{
while(rs.next())
{
RowServer row = new RowServer();
row.serverId = rs.getString("serverId");
// PARSE OTHER COLUMNS HERE
result.add(row);
}
rs.close();
} catch(SQLException ex) {
MainPluginClass.consoleLog.log(Level.WARNING, "[rscp] Exception in rs2s(): {0}", ex.getLocalizedMessage());
}
return result.toArray(new RowServer[result.size()]);
}
public synchronized void fetchRewards(Rewards rewardHelper)
{
final ArrayList<RowReward> result = new ArrayList<>();
final ResultSet rs = executeQuery("SELECT * FROM `{DATABASE}`.`{PREFIX}rewards`;");
try
{
while(rs.next())
{
RowReward row = new RowReward();
row.id = rs.getInt("id");
row.user = rs.getString("user").toLowerCase();
row.code = rs.getString("code");
row.activated = rs.getBoolean("activated");
if(row.activated)
continue;
row.activated_timestamp = rs.getTimestamp("activated_timestamp");
row.execute_commands = rs.getString("execute_commands");
row.command_permissions = rs.getString("command_permissions");
row.add_group = rs.getString("add_group");
row.add_group_destination = rs.getString("add_group_destination");
row.add_group_expirience = rs.getInt("add_group_expirience");
row.add_group_interval = rs.getString("add_group_interval");
result.add(row);
}
rs.close();
} catch(SQLException ex) {
MainPluginClass.consoleLog.log(Level.WARNING, "[rscp] Exception in rs2r(): {0}", ex.getLocalizedMessage());
}
MainPluginClass.consoleLog.log(Level.INFO, "[rscp] Fetched {0} unused reward codes.",
Integer.toString(result.size()));
rewardHelper.ImportRewards(result.toArray(new RowReward[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');");
}
}