= Database patching for thread safety (Should be non-issue but could be in the future)

This commit is contained in:
Matthew Cech
2019-05-24 00:08:12 -07:00
parent 7fefa5f89c
commit 2ee17dcc79
2 changed files with 37 additions and 16 deletions
+4 -1
View File
@@ -40,7 +40,10 @@ public class DatabaseDriver
public boolean Connect()
{
driver = new JDBCDriverSQLite();
driver.Connect();
if(driver.Connect() == false)
{
return false;
}
// Verify tables we want to use exist
EnsureTableExists(globalTableName, globalKeyName, globalValueName); // General table. Do not remove.
+33 -15
View File
@@ -1,7 +1,6 @@
package core;
import java.util.ArrayList;
import java.util.Vector;
import utils.GlobalLog;
import utils.LogFilter;
@@ -11,11 +10,13 @@ public class DatabaseManager
public static DatabaseManager instance = null;
// Private internal variables
private ArrayList<DatabaseTrackedObject> trackedObjects;
private Vector<DatabaseTrackedObject> trackedObjects;
private DatabaseDriver driver;
public DatabaseManager()
{
GlobalLog.Log(LogFilter.Database, "Creating database manager");
if(instance == null)
{
instance = this;
@@ -26,40 +27,57 @@ public class DatabaseManager
return;
}
trackedObjects = new ArrayList<DatabaseTrackedObject>();
trackedObjects = new Vector<DatabaseTrackedObject>();
driver = new DatabaseDriver();
driver.Connect();
if(driver.Connect() == false)
{
GlobalLog.Error("Database failed to connect. Currently, without the DB, this bot can not run.");
System.exit(1);
}
}
// Thumbs through registered objects and syncs them with the database.
// Consider moving this operation to a separate thread.
public void Upkeep()
{
for(int i = 0 ; i < trackedObjects.size(); ++i)
synchronized(trackedObjects)
{
DatabaseTrackedObject dto = trackedObjects.get(i);
if(dto.IsDirty())
for(int i = 0 ; i < trackedObjects.size(); ++i)
{
SetRemoteValue(dto.identifier, dto.Serialize());
dto.Resolve();
DatabaseTrackedObject dto = trackedObjects.get(i);
if(dto.IsDirty())
{
SetRemoteValue(dto.identifier, dto.Serialize());
dto.Resolve();
}
}
}
}
public void Register(DatabaseTrackedObject tracked)
{
trackedObjects.add(tracked);
tracked.DeSerialzie(GetRemoteValue(tracked.identifier));
synchronized(trackedObjects)
{
trackedObjects.add(tracked);
tracked.DeSerialzie(GetRemoteValue(tracked.identifier));
}
}
public String GetRemoteValue(String key)
{
return driver.CreateGetKey(key);
synchronized(driver)
{
return driver.CreateGetKey(key);
}
}
public void SetRemoteValue(String key, String value)
{
driver.CreateSetKey(key, value);
synchronized(driver)
{
driver.CreateSetKey(key, value);
}
}
}