aboutsummaryrefslogtreecommitdiffstats
path: root/Software/Visual_Studio/PPC
diff options
context:
space:
mode:
authorRoy Ben Shabat <Roy.mail.net@gmail.com>2020-10-20 20:58:32 +0300
committerRoy Ben Shabat <Roy.mail.net@gmail.com>2020-10-20 20:58:32 +0300
commit50b5a229c4fe547a896539f24c96e5e9a86ebb80 (patch)
tree653f78a466296564862e5bcba38422284f693545 /Software/Visual_Studio/PPC
parentb732167cbc51f0b19447d67687af5c514cf4f65a (diff)
downloadTango-50b5a229c4fe547a896539f24c96e5e9a86ebb80.tar.gz
Tango-50b5a229c4fe547a896539f24c96e5e9a86ebb80.zip
DATA STORE !
Diffstat (limited to 'Software/Visual_Studio/PPC')
-rw-r--r--Software/Visual_Studio/PPC/Tango.PPC.Common/DataStore/DefaultDataStoreService.cs254
-rw-r--r--Software/Visual_Studio/PPC/Tango.PPC.Common/DataStore/IDataStoreService.cs14
-rw-r--r--Software/Visual_Studio/PPC/Tango.PPC.Common/Tango.PPC.Common.csproj16
-rw-r--r--Software/Visual_Studio/PPC/Tango.PPC.UI/ViewModelLocator.cs3
4 files changed, 286 insertions, 1 deletions
diff --git a/Software/Visual_Studio/PPC/Tango.PPC.Common/DataStore/DefaultDataStoreService.cs b/Software/Visual_Studio/PPC/Tango.PPC.Common/DataStore/DefaultDataStoreService.cs
new file mode 100644
index 000000000..02d8e1858
--- /dev/null
+++ b/Software/Visual_Studio/PPC/Tango.PPC.Common/DataStore/DefaultDataStoreService.cs
@@ -0,0 +1,254 @@
+using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.IO;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Tango.Core.DI;
+using Tango.DataStore;
+using Tango.DataStore.Lite;
+using Tango.DataStore.Remote;
+using Tango.Integration.ExternalBridge;
+using Tango.PMR.DataStore;
+using Tango.PPC.Common.Connection;
+using Tango.PPC.Common.ExternalBridge;
+using Tango.Transport;
+
+namespace Tango.PPC.Common.DataStore
+{
+ [TangoCreateWhenRegistered]
+ public class DefaultDataStoreService : IDataStoreService, IExternalBridgeRequestHandler
+ {
+ private IDataStoreManager _manager;
+
+ public DefaultDataStoreService(IPPCExternalBridgeService externalBridge, IMachineProvider machineProvider)
+ {
+ externalBridge.RegisterRequestHandler(this);
+
+ machineProvider.MachineOperator.RegisterRequestHandler<PutDataStoreItemRequest>(OnPutDataStoreItemRequest);
+ machineProvider.MachineOperator.RegisterRequestHandler<GetDataStoreItemRequest>(OnGetDataStoreItemRequest);
+ }
+
+ public IDataStoreManager GetManager()
+ {
+ if (_manager == null)
+ {
+ _manager = new LiteDBDataStoreManager(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "Twine", "Tango", "DataStore", Path.GetFileNameWithoutExtension(AppDomain.CurrentDomain.FriendlyName) + ".db"));
+ }
+
+ return _manager;
+ }
+
+ public void Dispose()
+ {
+ _manager?.Dispose();
+ }
+
+ #region Generic Handlers
+
+ [ExternalBridgeRequestHandlerMethod(typeof(RemoteDataStorePutRequest), RequestHandlerLoggingMode.LogRequestName)]
+ public async Task OnRemoteDataStorePutRequest(RemoteDataStorePutRequest request, String token, ExternalBridgeReceiver receiver)
+ {
+ GetManager().GetCollection(request.Collection).Put(request.Key, request.DataType, request.Value);
+ await receiver.SendGenericResponse(new RemoteDataStorePutResponse(), token);
+ }
+
+ [ExternalBridgeRequestHandlerMethod(typeof(RemoteDataStoreGetRequest), RequestHandlerLoggingMode.LogRequestName)]
+ public async Task OnRemoteDataStoreGetRequest(RemoteDataStoreGetRequest request, String token, ExternalBridgeReceiver receiver)
+ {
+ var value = GetManager().GetCollection(request.Collection).Get(request.Key);
+ await receiver.SendGenericResponse(new RemoteDataStoreGetResponse()
+ {
+ Value = value
+ }, token);
+ }
+
+ [ExternalBridgeRequestHandlerMethod(typeof(RemoteDataStoreGetItemRequest), RequestHandlerLoggingMode.LogRequestName)]
+ public async Task OnRemoteDataStoreGetItemRequest(RemoteDataStoreGetItemRequest request, String token, ExternalBridgeReceiver receiver)
+ {
+ var item = GetManager().GetCollection(request.Collection).GetItem(request.Key);
+ await receiver.SendGenericResponse(new RemoteDataStoreGetItemResponse()
+ {
+ Item = item
+ }, token);
+ }
+
+ [ExternalBridgeRequestHandlerMethod(typeof(RemoteDataStoreCountRequest), RequestHandlerLoggingMode.LogRequestName)]
+ public async Task OnRemoteDataStoreCountRequest(RemoteDataStoreCountRequest request, String token, ExternalBridgeReceiver receiver)
+ {
+ var count = GetManager().GetCollection(request.Collection).Count();
+ await receiver.SendGenericResponse(new RemoteDataStoreCountResponse()
+ {
+ Count = count
+ }, token);
+ }
+
+ [ExternalBridgeRequestHandlerMethod(typeof(RemoteDataStoreDeleteRequest), RequestHandlerLoggingMode.LogRequestName)]
+ public async Task OnRemoteDataStoreDeleteRequest(RemoteDataStoreDeleteRequest request, String token, ExternalBridgeReceiver receiver)
+ {
+ GetManager().GetCollection(request.Collection).Delete(request.Key);
+ await receiver.SendGenericResponse(new RemoteDataStoreDeleteResponse(), token);
+ }
+
+ [ExternalBridgeRequestHandlerMethod(typeof(RemoteDataStoreDeleteAllRequest), RequestHandlerLoggingMode.LogRequestName)]
+ public async Task OnRemoteDataStoreDeleteAllRequest(RemoteDataStoreDeleteAllRequest request, String token, ExternalBridgeReceiver receiver)
+ {
+ GetManager().GetCollection(request.Collection).DeleteAll();
+ await receiver.SendGenericResponse(new RemoteDataStoreDeleteAllResponse(), token);
+ }
+
+ [ExternalBridgeRequestHandlerMethod(typeof(RemoteDataStoreGetAllRequest), RequestHandlerLoggingMode.LogRequestName)]
+ public async Task OnRemoteDataStoreGetAllRequest(RemoteDataStoreGetAllRequest request, String token, ExternalBridgeReceiver receiver)
+ {
+ var all = GetManager().GetCollection(request.Collection).GetAll();
+ await receiver.SendGenericResponse(new RemoteDataStoreGetAllResponse()
+ {
+ Items = all
+ }, token);
+ }
+
+ [ExternalBridgeRequestHandlerMethod(typeof(RemoteDataStoreGetCollectionNamesRequest), RequestHandlerLoggingMode.LogRequestName)]
+ public async Task OnRemoteDataStoreGetCollectionNamesRequest(RemoteDataStoreGetCollectionNamesRequest request, String token, ExternalBridgeReceiver receiver)
+ {
+ var names = GetManager().GetCollectionNames();
+ await receiver.SendGenericResponse(new RemoteDataStoreGetCollectionNamesResponse()
+ {
+ Names = names
+ }, token);
+ }
+
+ #endregion
+
+ #region Proto Handlers
+
+ private async void OnPutDataStoreItemRequest(ITransporter transporter, PutDataStoreItemRequest request, string token)
+ {
+ try
+ {
+ GetManager().GetCollection(request.Collection).Put(request.Item.Key, GetPMRValue(request.Item));
+ await transporter.SendResponse(new PutDataStoreItemResponse(), token);
+ }
+ catch (Exception ex)
+ {
+ try
+ {
+ await transporter.SendResponse(new PutDataStoreItemResponse(), token, new TransportResponseConfig()
+ {
+ ErrorCode = PMR.Common.ErrorCode.GeneralDatastoreError,
+ ErrorMessage = ex.Message
+ });
+ }
+ catch (Exception exx)
+ {
+ Debug.WriteLine(exx);
+ }
+ }
+ }
+
+ private async void OnGetDataStoreItemRequest(ITransporter transporter, GetDataStoreItemRequest request, string token)
+ {
+ try
+ {
+ var item = GetManager().GetCollection(request.Collection).GetItem(request.Key);
+ await transporter.SendResponse(new GetDataStoreItemResponse()
+ {
+ Item = CreatePMRDataStoreItem(item),
+ }, token);
+ }
+ catch (KeyNotFoundException ex)
+ {
+ try
+ {
+ await transporter.SendResponse(new GetDataStoreItemResponse(), token, new TransportResponseConfig()
+ {
+ ErrorCode = PMR.Common.ErrorCode.KeyNotFound,
+ ErrorMessage = ex.Message
+ });
+ }
+ catch (Exception exx)
+ {
+ Debug.WriteLine(exx);
+ }
+ }
+ catch (Exception ex)
+ {
+ try
+ {
+ await transporter.SendResponse(new GetDataStoreItemResponse(), token, new TransportResponseConfig()
+ {
+ ErrorCode = PMR.Common.ErrorCode.GeneralDatastoreError,
+ ErrorMessage = ex.Message
+ });
+ }
+ catch (Exception exx)
+ {
+ Debug.WriteLine(exx);
+ }
+ }
+ }
+
+ #region Helpers
+
+ private DataStoreItem CreatePMRDataStoreItem(IDataStoreItem item)
+ {
+ DataStoreItem pmr = new DataStoreItem();
+ pmr.Key = item.Key;
+ pmr.DataType = (PMR.DataStore.DataType)item.Type;
+
+ switch (item.Type)
+ {
+ case Tango.DataStore.DataType.Int32:
+ pmr.Int32Value = (int)Convert.ChangeType(item.Value, typeof(int));
+ break;
+ case Tango.DataStore.DataType.Float:
+ pmr.FloatValue = (float)Convert.ChangeType(item.Value, typeof(float));
+ break;
+ case Tango.DataStore.DataType.Double:
+ pmr.DoubleValue = (double)Convert.ChangeType(item.Value, typeof(double));
+ break;
+ case Tango.DataStore.DataType.Boolean:
+ pmr.BooleanValue = (bool)Convert.ChangeType(item.Value, typeof(bool));
+ break;
+ case Tango.DataStore.DataType.String:
+ pmr.StringValue = (String)Convert.ChangeType(item.Value, typeof(String));
+ break;
+ case Tango.DataStore.DataType.Bytes:
+ pmr.BytesValue = Google.Protobuf.ByteString.CopyFrom((byte[])Convert.ChangeType(item.Value, typeof(byte[])));
+ break;
+ }
+
+ return pmr;
+ }
+
+ private Object GetPMRValue(DataStoreItem item)
+ {
+ switch (item.DataType)
+ {
+ case PMR.DataStore.DataType.Int32:
+ return item.Int32Value;
+ case PMR.DataStore.DataType.Float:
+ return item.FloatValue;
+ case PMR.DataStore.DataType.Double:
+ return item.DoubleValue;
+ case PMR.DataStore.DataType.Boolean:
+ return item.BooleanValue;
+ case PMR.DataStore.DataType.String:
+ return item.StringValue;
+ case PMR.DataStore.DataType.Bytes:
+ return item.BytesValue.ToByteArray();
+ }
+
+ throw new NotSupportedException("The specified data type if not supported.");
+ }
+
+ #endregion
+
+ #endregion
+
+ public void OnReceiverDisconnected(ExternalBridgeReceiver receiver)
+ {
+ //Do nothing.
+ }
+ }
+}
diff --git a/Software/Visual_Studio/PPC/Tango.PPC.Common/DataStore/IDataStoreService.cs b/Software/Visual_Studio/PPC/Tango.PPC.Common/DataStore/IDataStoreService.cs
new file mode 100644
index 000000000..94ae3fa30
--- /dev/null
+++ b/Software/Visual_Studio/PPC/Tango.PPC.Common/DataStore/IDataStoreService.cs
@@ -0,0 +1,14 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Tango.DataStore;
+
+namespace Tango.PPC.Common.DataStore
+{
+ public interface IDataStoreService : IDisposable
+ {
+ IDataStoreManager GetManager();
+ }
+}
diff --git a/Software/Visual_Studio/PPC/Tango.PPC.Common/Tango.PPC.Common.csproj b/Software/Visual_Studio/PPC/Tango.PPC.Common/Tango.PPC.Common.csproj
index 2e0c6843e..fec0dfd1a 100644
--- a/Software/Visual_Studio/PPC/Tango.PPC.Common/Tango.PPC.Common.csproj
+++ b/Software/Visual_Studio/PPC/Tango.PPC.Common/Tango.PPC.Common.csproj
@@ -151,6 +151,8 @@
</Compile>
<Compile Include="Controls\TwineCatalogRenderer.cs" />
<Compile Include="Converters\HeightToOpacityConverter.cs" />
+ <Compile Include="DataStore\DefaultDataStoreService.cs" />
+ <Compile Include="DataStore\IDataStoreService.cs" />
<Compile Include="ExtensionMethods\IListExtensions.cs" />
<Compile Include="ExtensionMethods\ObservableCollectionExtensions.cs" />
<Compile Include="ExternalBridge\IPPCExternalBridgeService.cs" />
@@ -381,6 +383,18 @@
<Project>{58e8825f-0c96-449c-b320-1e82b0aa876b}</Project>
<Name>Tango.CSV</Name>
</ProjectReference>
+ <ProjectReference Include="..\..\Tango.DataStore.LiteDB\Tango.DataStore.Lite.csproj">
+ <Project>{fa96bc0c-4055-475c-9dcc-70a5a9436b10}</Project>
+ <Name>Tango.DataStore.Lite</Name>
+ </ProjectReference>
+ <ProjectReference Include="..\..\Tango.DataStore.Remote\Tango.DataStore.Remote.csproj">
+ <Project>{29448f3c-9b3e-4da6-8555-46a8b9a6b3aa}</Project>
+ <Name>Tango.DataStore.Remote</Name>
+ </ProjectReference>
+ <ProjectReference Include="..\..\Tango.DataStore\Tango.DataStore.csproj">
+ <Project>{e0364dfa-0721-4637-9d32-9d22aac109d6}</Project>
+ <Name>Tango.DataStore</Name>
+ </ProjectReference>
<ProjectReference Include="..\..\Tango.Emulations\Tango.Emulations.csproj">
<Project>{63561e19-ff5a-414b-a5ef-e30711543e1d}</Project>
<Name>Tango.Emulations</Name>
@@ -493,7 +507,7 @@
</Target>
<ProjectExtensions>
<VisualStudio>
- <UserProperties BuildVersion_StartDate="2000/1/1" BuildVersion_UseGlobalSettings="False" BuildVersion_BuildVersioningStyle="None.None.Increment.TimeStamp" BuildVersion_UpdateAssemblyVersion="True" BuildVersion_AssemblyInfoFilename="Properties\AssemblyInfo.cs" />
+ <UserProperties BuildVersion_AssemblyInfoFilename="Properties\AssemblyInfo.cs" BuildVersion_UpdateAssemblyVersion="True" BuildVersion_BuildVersioningStyle="None.None.Increment.TimeStamp" BuildVersion_UseGlobalSettings="False" BuildVersion_StartDate="2000/1/1" />
</VisualStudio>
</ProjectExtensions>
</Project> \ No newline at end of file
diff --git a/Software/Visual_Studio/PPC/Tango.PPC.UI/ViewModelLocator.cs b/Software/Visual_Studio/PPC/Tango.PPC.UI/ViewModelLocator.cs
index 181f70d4d..222d3a1e8 100644
--- a/Software/Visual_Studio/PPC/Tango.PPC.UI/ViewModelLocator.cs
+++ b/Software/Visual_Studio/PPC/Tango.PPC.UI/ViewModelLocator.cs
@@ -10,6 +10,7 @@ using Tango.PPC.Common.BackupRestore;
using Tango.PPC.Common.Connection;
using Tango.PPC.Common.Connectivity;
using Tango.PPC.Common.Console;
+using Tango.PPC.Common.DataStore;
using Tango.PPC.Common.Diagnostics;
using Tango.PPC.Common.EventLogging;
using Tango.PPC.Common.ExternalBridge;
@@ -100,6 +101,7 @@ namespace Tango.PPC.UI
TangoIOC.Default.Unregister<IInsightsService>();
TangoIOC.Default.Unregister<IRemoteActionsService>();
TangoIOC.Default.Unregister<IThreadLoadingService>();
+ TangoIOC.Default.Unregister<IDataStoreService>();
if (App.StartupArgs != null && App.StartupArgs.Contains("-webDebug"))
{
@@ -143,6 +145,7 @@ namespace Tango.PPC.UI
TangoIOC.Default.Register<IInsightsService, DefaultInsightsService>();
TangoIOC.Default.Register<IRemoteActionsService, DefaultRemoteActionsService>();
TangoIOC.Default.Register<IThreadLoadingService, DefaultThreadLoadingService>();
+ TangoIOC.Default.Register<IDataStoreService, DefaultDataStoreService>();
TangoIOC.Default.Register<LoadingViewVM>();
TangoIOC.Default.Register<MainViewVM>();