Only create zones and message blocks table when required.

This commit is contained in:
UnknownShadow200 2016-08-23 19:04:09 +10:00
parent 6e1dcc72f1
commit 1b6fecc7d4
3 changed files with 49 additions and 34 deletions

View File

@ -36,7 +36,7 @@ namespace MCGalaxy.Commands.Building {
public override void Use(Player p, string message) {
if (message == "") { Help(p); return; }
CatchPos cpos;
MBData cpos;
cpos.message = null;
string[] args = message.SplitSpaces(2);
switch (args[0].ToLower()) {
@ -85,7 +85,7 @@ namespace MCGalaxy.Commands.Building {
void PlacedMark(Player p, ushort x, ushort y, ushort z, byte type, byte extType) {
p.ClearBlockchange();
CatchPos cpos = (CatchPos)p.blockchangeObject;
MBData cpos = (MBData)p.blockchangeObject;
byte old = p.level.GetTile(x, y, z);
if (p.level.CheckAffectPermissions(p, x, y, z, old, cpos.type, 0)) {
@ -102,20 +102,29 @@ namespace MCGalaxy.Commands.Building {
p.Blockchange += PlacedMark;
}
void UpdateDatabase(Player p, CatchPos cpos, ushort x, ushort y, ushort z) {
cpos.message = cpos.message.Replace("'", "\\'");
cpos.message = Colors.EscapeColors(cpos.message);
void UpdateDatabase(Player p, MBData data, ushort x, ushort y, ushort z) {
data.message = data.message.Replace("'", "\\'");
data.message = Colors.EscapeColors(data.message);
//safe against SQL injections because no user input is given here
DataTable Messages = Database.Fill("SELECT * FROM `Messages" + p.level.name + "` WHERE X=@0 AND Y=@1 AND Z=@2", x, y, z);
Messages.Dispose();
string lvlName = p.level.name;
object locker = ThreadSafeCache.DBCache.Get(lvlName);
string syntax = Messages.Rows.Count == 0 ?
"INSERT INTO `Messages" + p.level.name + "` (X, Y, Z, Message) VALUES (@0, @1, @2, @3)"
: "UPDATE `Messages" + p.level.name + "` SET Message=@3 WHERE X=@0 AND Y=@1 AND Z=@2";
Database.Execute(syntax, x, y, z, cpos.message);
lock (locker) {
Database.Execute(String.Format(LevelDB.createMessages, lvlName));
int count = 0;
string syntax = "SELECT * FROM `Messages" + lvlName + "` WHERE X=@0 AND Y=@1 AND Z=@2";
using (DataTable Messages = Database.Fill(syntax, x, y, z))
count = Messages.Rows.Count;
syntax = count == 0 ?
"INSERT INTO `Messages" + lvlName + "` (X, Y, Z, Message) VALUES (@0, @1, @2, @3)"
: "UPDATE `Messages" + lvlName + "` SET Message=@3 WHERE X=@0 AND Y=@1 AND Z=@2";
Database.Execute(syntax, x, y, z, data.message);
}
}
struct CatchPos { public string message; public byte type; }
struct MBData { public string message; public byte type; }
void ShowMessageBlocks(Player p) {
p.showMBs = !p.showMBs;

View File

@ -59,7 +59,7 @@ namespace MCGalaxy {
//newName is being split and partly checked on illegal characters reserved for Windows.
string syntax = Server.useMySQL
? "RENAME TABLE `{2}{0}` TO `{2}{1}`" : "ALTER TABLE `{2}{0}` RENAME TO `{2}{1}`";
Database.Execute(String.Format(syntax, src, dst, "Blocks"));
Database.Execute(String.Format(syntax, src, dst, "Block"));
object locker = ThreadSafeCache.DBCache.Get(src);
lock (locker) {

View File

@ -104,8 +104,6 @@ namespace MCGalaxy {
public static void CreateTables(string givenName) {
Database.Execute(String.Format(createBlock, givenName, Server.useMySQL ? "BOOL" : "INT"));
Database.Execute(String.Format(createPortals, givenName));
Database.Execute(String.Format(createMessages, givenName));
Database.Execute(String.Format(createZones, givenName));
}
internal static void LoadZones(Level level, string name) {
@ -157,16 +155,24 @@ namespace MCGalaxy {
}
public static void DeleteZone(string level, Level.Zone zn) {
object locker = ThreadSafeCache.DBCache.Get(level);
lock (locker) {
if (!Database.TableExists("Zone" + level)) return;
Database.Execute("DELETE FROM `Zone" + level + "` WHERE Owner=@0 AND SmallX=@1 AND " +
"SMALLY=@2 AND SMALLZ=@3 AND BIGX=@4 AND BIGY=@5 AND BIGZ=@6",
zn.Owner, zn.smallX, zn.smallY, zn.smallZ, zn.bigX, zn.bigY, zn.bigZ);
}
}
public static void CreateZone(string level, Level.Zone zn) {
object locker = ThreadSafeCache.DBCache.Get(level);
lock (locker) {
Database.Execute(String.Format(LevelDB.createZones, level));
Database.Execute("INSERT INTO `Zone" + level + "` (Owner, SmallX, SmallY, " +
"SmallZ, BigX, BigY, BigZ) VALUES (@0, @1, @2, @3, @4, @5, @6)",
zn.Owner, zn.smallX, zn.smallY, zn.smallZ, zn.bigX, zn.bigY, zn.bigZ);
}
}
internal const string createBlock =