/// <summary> /// Load from database unless the local cache has the data /// </summary> public override void Load() { Get_Modified_Date(); DateTime DB_Date = getDatabaseValue <DateTime>("MAX(DT_Stamp)", "SELECT MAX(DT_Stamp) FROM tbl_Save_Data WHERE Unique_Identifier = '" + d.DUI + "';"); d.Log(true, "Loading Game State : Local Cache > " + Modified + ", Database > " + DB_Date + ((Modified >= DB_Date) ? " | Attempting to restore Game State from local cache." : " | Attempting to restore Game State from database."), false); if (Modified >= DB_Date) { #region Use Local cache data try { BinaryFormatter bf = new BinaryFormatter(); file = new FileStream(d.path + "/" + File_Name, FileMode.OpenOrCreate); BinaryReader br = new BinaryReader(file); Modified = Convert.ToDateTime(br.ReadString()); Current_Medals = br.ReadByte(); Total_Medals_Earned = br.ReadByte(); Current_Gems = br.ReadInt32(); Total_Gems_Earned = br.ReadInt32(); Level_Data.Clear(); int Level_Count = br.ReadInt32(); for (int i = 0; i < Level_Count; i++) { Level_Data.Add((Level_Info)bf.Deserialize(br.BaseStream)); } br.Close(); file.Close(); } catch (Exception e) { d.Log(false, "Loading from local cache failed: " + e.Message + " Attempting to load from database instead.", true); try { reader = queryDatabase("SELECT * FROM tbl_Save_Data WHERE Unique_Identifier = '" + d.DUI + "';"); if (reader == null) { d.Log(false, "Loading from database failed: The MySqlDataReader returned null, please check the SQL Syntax is correct and ensure there is data to pull! " + "| UNABLE TO LOAD GAME STATE!", true); return; } if (reader.Read()) { Current_Medals = reader.GetByte("Current_Medals"); Total_Medals_Earned = reader.GetByte("Total_Medals_Earned"); Current_Gems = reader.GetInt32("Current_Gems"); Total_Gems_Earned = reader.GetInt32("Total_Gems_Earned"); int Save_ID = reader.GetInt32("Save_ID"); Level_Data.Clear(); reader = queryDatabase("SELECT " + "tbl_Level_Save_Data.Medals_Earned AS ME, " + "tbl_Map_Data.Level_Name AS LN, " + "tbl_Map_Data.Level_Number AS MI " + "FROM tbl_Level_Save_Data " + "LEFT JOIN tbl_Map_Data " + "ON tbl_Level_Save_Data.Map_ID = tbl_Map_Data.Level_Number " + "WHERE tbl_Level_Save_Data.Save_ID = " + Save_ID + ";"); if (reader.HasRows) { while (reader.Read()) { Level_Data.Add(new Level_Info(reader["LN"].ToString(), reader.GetByte("MI"), reader.GetByte("ME"))); } } } else { d.Log(false, "Loading from database failed: The MySqlDataReader returned no records | UNABLE TO LOAD GAME STATE!", true); return; } Modified = DB_Date; d.Log(true, "Loading from database successful.", false); return; } catch (Exception ex) { d.Log(false, "Loading from database failed: " + ex.Message + " | UNABLE TO LOAD GAME STATE!", true); } } finally { if (file != null) { file.Close(); } } d.Log(true, "Loading from local cache successful: " + Path.Combine(d.path, File_Name), false); #endregion } else { #region Use Database data try { reader = queryDatabase("SELECT * FROM tbl_Save_Data WHERE Unique_Identifier = '" + d.DUI + "';"); if (reader == null) { d.Log(false, "Loading from database failed: The MySqlDataReader returned null, please check the SQL Syntax is correct and ensure there is data to pull! " + "Attempting to load from local cache instead.", true); try { // Use local cache data instead BinaryFormatter bf = new BinaryFormatter(); file = new FileStream(d.path + "/" + File_Name, FileMode.OpenOrCreate); BinaryReader br = new BinaryReader(file); Modified = Convert.ToDateTime(br.ReadString()); Current_Medals = br.ReadByte(); Total_Medals_Earned = br.ReadByte(); Current_Gems = br.ReadInt32(); Total_Gems_Earned = br.ReadInt32(); Level_Data.Clear(); int Level_Count = br.ReadInt32(); for (int i = 0; i < Level_Count; i++) { Level_Data.Add((Level_Info)bf.Deserialize(br.BaseStream)); } d.Log(true, "Loading from local cache successful.", false); br.Close(); file.Close(); } catch (Exception e) { d.Log(false, "Loading from local cache failed: " + e.Message + " | UNABLE TO LOAD GAME STATE!", true); } finally { if (file != null) { file.Close(); } } return; } if (reader.Read()) { Current_Medals = reader.GetByte("Current_Medals"); Total_Medals_Earned = reader.GetByte("Total_Medals_Earned"); Current_Gems = reader.GetInt32("Current_Gems"); Total_Gems_Earned = reader.GetInt32("Total_Gems_Earned"); int Save_ID = reader.GetInt32("Save_ID"); Level_Data.Clear(); reader = queryDatabase("SELECT " + "tbl_Level_Save_Data.Medals_Earned AS ME, " + "tbl_Map_Data.Level_Name AS LN, " + "tbl_Map_Data.Level_Number AS MI " + "FROM tbl_Level_Save_Data " + "LEFT JOIN tbl_Map_Data " + "ON tbl_Level_Save_Data.Map_ID = tbl_Map_Data.Level_Number " + "WHERE tbl_Level_Save_Data.Save_ID = " + Save_ID + ";"); if (reader.HasRows) { while (reader.Read()) { Level_Data.Add(new Level_Info(reader["LN"].ToString(), reader.GetByte("MI"), reader.GetByte("ME"))); } } } else { d.Log(false, "Loading from database failed: The MySqlDataReader returned no records | UNABLE TO LOAD GAME STATE!", true); return; } Modified = DB_Date; d.Log(true, "Loading from database successful.", false); return; } catch (Exception ex) { d.Log(false, "Loading from database failed: " + ex.Message + " | UNABLE TO LOAD GAME STATE!", true); } #endregion } // For testing purposes: d.Log(true, "Game State Contents: ", false); d.Log(true, "Current Medals: " + Current_Medals + ", Total Medals Earned: " + total_Medals_Earned + ", Current Gems: " + Current_Gems + ", Total Gems Earned: " + Total_Gems_Earned + ", Modified DateTime: " + Modified, false); foreach (Level_Info level in Level_Data) { d.Log(true, "Level #" + level.Number + ", '" + level.Name + "', Medals: " + level.Medals, false); } }