From 2ee17dcc7932ac12c7eb5e24fc311998273861cb Mon Sep 17 00:00:00 2001 From: Matthew Cech Date: Fri, 24 May 2019 00:08:12 -0700 Subject: [PATCH] = Database patching for thread safety (Should be non-issue but could be in the future) --- src/core/DatabaseDriver.java | 5 +++- src/core/DatabaseManager.java | 48 ++++++++++++++++++++++++----------- 2 files changed, 37 insertions(+), 16 deletions(-) diff --git a/src/core/DatabaseDriver.java b/src/core/DatabaseDriver.java index eb4d499..ee2b84a 100644 --- a/src/core/DatabaseDriver.java +++ b/src/core/DatabaseDriver.java @@ -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. diff --git a/src/core/DatabaseManager.java b/src/core/DatabaseManager.java index b1f72ec..d8afd5a 100644 --- a/src/core/DatabaseManager.java +++ b/src/core/DatabaseManager.java @@ -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 trackedObjects; + private Vector 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(); + trackedObjects = new Vector(); 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); + } } }