diff --git a/DevConsole/Program.cs b/DevConsole/Program.cs index 3b430b4..a421553 100644 --- a/DevConsole/Program.cs +++ b/DevConsole/Program.cs @@ -4,21 +4,20 @@ using Gsm; using System; using System.Collections.Generic; using System.ComponentModel; -using System.IO; using System.Linq; -using System.Security.Cryptography.X509Certificates; namespace DevConsole { class Program { public static readonly GsmRO gsmRO = new GsmRO(); - public static FireLanceCRUD fireLanceCRUD = new FireLanceCRUD(); + public static FirelanceMgr flcMgr = new FirelanceMgr(); + public static FirelanceCRUD flcCRUD; static void Main(string[] args) { ConnectToGsmDb(); - ConnectToFlcDb(); + ConnectToFirelanceManager(); Console.WriteLine(""); while (true) { CommandsMenu(); } } @@ -61,10 +60,11 @@ namespace DevConsole Console.WriteLine($"GSMParser Connection State: {gsmRO.IsConnectionOpen()}"); } - private static void ConnectToFlcDb() + private static void ConnectToFirelanceManager() { - fireLanceCRUD.OpenConnection("sr3", 27017); - Console.WriteLine($"FireLance Connection State: {fireLanceCRUD.IsConnectionOpen()}"); + flcMgr.OpenConnection("sr3", 27017); + flcCRUD = new FirelanceCRUD(flcMgr.DBInstance); + Console.WriteLine($"FireLance Connection State: {flcMgr.IsConnectionOpen()}"); } #region Command Options @@ -73,7 +73,7 @@ namespace DevConsole Console.WriteLine("[GsmDb]------------"); Console.WriteLine("A. Open DB"); Console.WriteLine("B. Close DB"); - Console.WriteLine("[FlcDb]------------"); + Console.WriteLine("[Firelance]------------"); Console.WriteLine("C. Open DB"); Console.WriteLine("D. Close DB (Unsupported)"); Console.WriteLine("X. <--- Go back\n"); @@ -91,10 +91,10 @@ namespace DevConsole gsmRO.CloseCurrentConnection(); break; case "C": - ConnectToFlcDb(); + ConnectToFirelanceManager(); break; case "D": - fireLanceCRUD.CloseCurrentConnection(); + flcMgr.CloseCurrentConnection(); break; case "X": break; @@ -152,10 +152,12 @@ namespace DevConsole private static void CmdFlcActions() { - Console.WriteLine("A. FireLance Write Predefined MasterGameRecord"); - Console.WriteLine("B. FireLance Read Predefined MasterGameRecord"); - Console.WriteLine("C. FireLance Insert Save Entry into existing MasterGameRecord"); - Console.WriteLine("D. FireLance Remove Save Entry from existing MasterGameRecord"); + Console.WriteLine("A. Write predefined MasterGameRecord"); + Console.WriteLine("B. Read predefined MasterGameRecord"); + Console.WriteLine("C. Insert save entry into existing MasterGameRecord"); + Console.WriteLine("D. Remove save entry from existing MasterGameRecord"); + Console.WriteLine("E. Upload save entry using GridFS"); + Console.WriteLine("F. Download save entry using GridFS"); Console.WriteLine("X. <--- Go back\n"); Console.Write(":"); @@ -176,6 +178,12 @@ namespace DevConsole case "D": FlcRemoveSaveEntryAction(); break; + case "E": + FlcUploadToGridFsAction(); + break; + case "F": + FlcDownloadToGridFsAction(); + break; case "X": break; } @@ -205,12 +213,12 @@ namespace DevConsole masterGameRecord.GameEntry = gameEntry; masterGameRecord.SaveGameEntries = saveGameEntries; - fireLanceCRUD.InsertRecord("GameRecords", masterGameRecord); + flcCRUD.InsertRecord("GameRecords", masterGameRecord); } static void FlcReadMasterGameRecordAction() { - var masterGameRecords = fireLanceCRUD.LoadRecordsFromTable("GameRecords"); + var masterGameRecords = flcCRUD.LoadRecordsFromTable("GameRecords"); foreach (var record in masterGameRecords) { Console.WriteLine(record.Id); @@ -234,21 +242,37 @@ namespace DevConsole private static void FlcRemoveSaveEntryAction() { - Guid firstMasterGameRecordGuid = fireLanceCRUD.LoadRecordsFromTable("GameRecords").First().Id; - var masterGameRecordToRemove = fireLanceCRUD.LoadRecordById("GameRecords", firstMasterGameRecordGuid); + Guid firstMasterGameRecordGuid = flcCRUD.LoadRecordsFromTable("GameRecords").First().Id; + var masterGameRecordToRemove = flcCRUD.LoadRecordById("GameRecords", firstMasterGameRecordGuid); Guid firstSaveGameEntryGuid = masterGameRecordToRemove.SaveGameEntries.Select(x => x.Id).First(); masterGameRecordToRemove.SaveGameEntries.RemoveAll(x => x.Id == firstSaveGameEntryGuid); - fireLanceCRUD.UpsertRecordById("GameRecords", firstMasterGameRecordGuid, masterGameRecordToRemove); + flcCRUD.UpsertRecordById("GameRecords", firstMasterGameRecordGuid, masterGameRecordToRemove); } private static void FlcInsertSaveEntryAction() { - Guid firstMasterGameRecordGuid = fireLanceCRUD.LoadRecordsFromTable("GameRecords").First().Id; - var masterGameRecordToInsert = fireLanceCRUD.LoadRecordById("GameRecords", firstMasterGameRecordGuid); + Guid firstMasterGameRecordGuid = flcCRUD.LoadRecordsFromTable("GameRecords").First().Id; + var masterGameRecordToInsert = flcCRUD.LoadRecordById("GameRecords", firstMasterGameRecordGuid); masterGameRecordToInsert.SaveGameEntries.Add(new SaveGameEntriesModel()); - fireLanceCRUD.UpsertRecordById("GameRecords", firstMasterGameRecordGuid, masterGameRecordToInsert); + flcCRUD.UpsertRecordById("GameRecords", firstMasterGameRecordGuid, masterGameRecordToInsert); + } + + private static void FlcUploadToGridFsAction() + { + var flcGFS = new FirelanceGFS(flcMgr.DBInstance); + var ulResult = flcGFS.UploadFile("TestFile", @"C:\Users\Dunestorm\Downloads\OpenMW-0.46.0-win64.exe"); + Console.WriteLine(ulResult.Result); + } + + private static void FlcDownloadToGridFsAction() + { + var objId = "5f00a560b65a2f02d0c7996e"; + + var flcGFC = new FirelanceGFS(flcMgr.DBInstance); + var dlResult = flcGFC.DownloadFile(new MongoDB.Bson.ObjectId(objId), @$"D:\Temp\{objId}.exe"); + Console.WriteLine($"Download Successful: {dlResult.Result}"); } #endregion diff --git a/FireLance.sln b/FireLance.sln index 1005847..1d96090 100644 --- a/FireLance.sln +++ b/FireLance.sln @@ -7,7 +7,7 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "GSMParser", "GSMParser\GSMP EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DevConsole", "DevConsole\DevConsole.csproj", "{6B7A9B29-420B-4F58-975E-3D72A3D95314}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FireLance", "FireLance\FireLance.csproj", "{6ACF5E6F-42EE-4FD6-8657-51E6380D422C}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Firelance", "FireLance\Firelance.csproj", "{6ACF5E6F-42EE-4FD6-8657-51E6380D422C}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution diff --git a/FireLance/FireLance.csproj b/FireLance/FireLance.csproj index dfb8d5c..beacf7c 100644 --- a/FireLance/FireLance.csproj +++ b/FireLance/FireLance.csproj @@ -6,6 +6,7 @@ + diff --git a/FireLance/FireLanceCRUD.cs b/FireLance/FireLanceCRUD.cs index 4dfbd44..443c2bd 100644 --- a/FireLance/FireLanceCRUD.cs +++ b/FireLance/FireLanceCRUD.cs @@ -5,17 +5,23 @@ using System.Collections.Generic; namespace FireLance { - public class FireLanceCRUD : FireLanceDB + public class FirelanceCRUD : IFlcMongoConnecton { + public IMongoDatabase DBInstance { get; set; } + public FirelanceCRUD(IMongoDatabase db) + { + DBInstance = db; + } + public void InsertRecord(string table, T record) { - var collection = db.GetCollection(table); + var collection = DBInstance.GetCollection(table); collection.InsertOne(record); } public void UpsertRecordById(string table, Guid id, T record) { - var collection = db.GetCollection(table); + var collection = DBInstance.GetCollection(table); collection.ReplaceOne( new BsonDocument("_id", id), record, @@ -24,13 +30,13 @@ namespace FireLance public List LoadRecordsFromTable(string table) { - var collection = db.GetCollection(table); + var collection = DBInstance.GetCollection(table); return collection.Find(new BsonDocument()).ToList(); } public T LoadRecordById(string table, Guid id) { - var collection = db.GetCollection(table); + var collection = DBInstance.GetCollection(table); var filter = Builders.Filter.Eq("Id", id); return collection.Find(filter).First(); @@ -38,7 +44,7 @@ namespace FireLance public void DeleteRecordById(string table, Guid id) { - var collection = db.GetCollection(table); + var collection = DBInstance.GetCollection(table); var filter = Builders.Filter.Eq("Id", id); collection.DeleteOne(filter); } diff --git a/FireLance/FireLanceGFS.cs b/FireLance/FireLanceGFS.cs new file mode 100644 index 0000000..dd72646 --- /dev/null +++ b/FireLance/FireLanceGFS.cs @@ -0,0 +1,44 @@ +using MongoDB.Bson; +using MongoDB.Driver; +using MongoDB.Driver.GridFS; +using System.IO; +using System.Threading.Tasks; + +namespace FireLance +{ + public class FirelanceGFS + { + private GridFSBucket gridFSBucket; + + public FirelanceGFS(IMongoDatabase db) + { + gridFSBucket = new GridFSBucket(db, new GridFSBucketOptions + { + BucketName = "SaveGames" + }); + } + + public async Task UploadFile(string fileName, string location) + { + ObjectId fileId; + using (var fs = new FileStream(location, FileMode.Open)) + { + fileId = await gridFSBucket.UploadFromStreamAsync(fileName, fs); + } + + return fileId.ToString(); + } + + public async Task DownloadFile(ObjectId id, string saveLocation) + { + using (var fs = new FileStream(saveLocation, FileMode.Create)) + { + await gridFSBucket.DownloadToStreamAsync(id, fs); + } + + return VerifyDownloadedFile(saveLocation); + } + + private bool VerifyDownloadedFile(string path) { return File.Exists(path); } + } +} diff --git a/FireLance/FireLanceDB.cs b/FireLance/FirelanceMgr.cs similarity index 71% rename from FireLance/FireLanceDB.cs rename to FireLance/FirelanceMgr.cs index 6a3e239..68d00b7 100644 --- a/FireLance/FireLanceDB.cs +++ b/FireLance/FirelanceMgr.cs @@ -5,31 +5,31 @@ using System; namespace FireLance { - public abstract class FireLanceDB : IDatabaseConnection + public class FirelanceMgr : IFlcDbConnection, IFlcMongoConnecton { - internal IMongoDatabase db; + public IMongoDatabase DBInstance { get; private set; } public void OpenConnection(string dbLocation, int port) { var client = new MongoClient($"mongodb://{dbLocation}:{port}"); var settings = new MongoDatabaseSettings { GuidRepresentation = GuidRepresentation.Standard }; - db = client.GetDatabase(dbLocation, settings); - } - - public void CloseCurrentConnection() - { - throw new NotSupportedException("MongoDB does not support closing connections."); + DBInstance = client.GetDatabase(dbLocation, settings); } public bool IsConnectionOpen() { int connectionCnt = 0; - try { connectionCnt = db.Client.ListDatabases().ToList().Count; } + try { connectionCnt = DBInstance.Client.ListDatabases().ToList().Count; } catch { } return (connectionCnt > 0) ? true : false; } + + public void CloseCurrentConnection() + { + throw new NotSupportedException("MongoDB does not support closing connections."); + } } } diff --git a/FireLance/Interfaces/IDatabaseConnection.cs b/FireLance/Interfaces/IFlcDbConnection.cs similarity index 83% rename from FireLance/Interfaces/IDatabaseConnection.cs rename to FireLance/Interfaces/IFlcDbConnection.cs index 4ae95ab..8d313f0 100644 --- a/FireLance/Interfaces/IDatabaseConnection.cs +++ b/FireLance/Interfaces/IFlcDbConnection.cs @@ -1,6 +1,6 @@ namespace FireLance.Interfaces { - public interface IDatabaseConnection + public interface IFlcDbConnection { public void OpenConnection(string dbLocation, int port); public void CloseCurrentConnection(); diff --git a/FireLance/Interfaces/IFlcMongoConnecton.cs b/FireLance/Interfaces/IFlcMongoConnecton.cs new file mode 100644 index 0000000..d463583 --- /dev/null +++ b/FireLance/Interfaces/IFlcMongoConnecton.cs @@ -0,0 +1,9 @@ +using MongoDB.Driver; + +namespace FireLance +{ + public interface IFlcMongoConnecton + { + public IMongoDatabase DBInstance { get; } + } +} \ No newline at end of file diff --git a/GSMParser/GSMParser.csproj b/GSMParser/GSMParser.csproj index 719597e..73f54d5 100644 --- a/GSMParser/GSMParser.csproj +++ b/GSMParser/GSMParser.csproj @@ -11,7 +11,7 @@ - + diff --git a/GSMParser/GsmDB.cs b/GSMParser/GsmDB.cs index 13ddf17..8807652 100644 --- a/GSMParser/GsmDB.cs +++ b/GSMParser/GsmDB.cs @@ -5,7 +5,7 @@ using FireLance.Interfaces; namespace Gsm { - public abstract class GsmDB : IDatabaseConnection + public abstract class GsmDB : IFlcDbConnection { internal SqliteConnection DBConnection = new SqliteConnection();