From 50b5a229c4fe547a896539f24c96e5e9a86ebb80 Mon Sep 17 00:00:00 2001 From: Roy Ben Shabat Date: Tue, 20 Oct 2020 20:58:32 +0300 Subject: DATA STORE ! --- .../Properties/AssemblyInfo.cs | 7 +++ .../RemoteDataStoreCountRequest.cs | 13 ++++ .../RemoteDataStoreCountResponse.cs | 13 ++++ .../RemoteDataStoreDeleteAllRequest.cs | 13 ++++ .../RemoteDataStoreDeleteAllResponse.cs | 13 ++++ .../RemoteDataStoreDeleteRequest.cs | 14 +++++ .../RemoteDataStoreDeleteResponse.cs | 12 ++++ .../RemoteDataStoreGetAllRequest.cs | 13 ++++ .../RemoteDataStoreGetAllResponse.cs | 18 ++++++ .../RemoteDataStoreGetCollectionNamesRequest.cs | 12 ++++ .../RemoteDataStoreGetCollectionNamesResponse.cs | 18 ++++++ .../RemoteDataStoreGetItemRequest.cs | 14 +++++ .../RemoteDataStoreGetItemResponse.cs | 13 ++++ .../RemoteDataStoreGetRequest.cs | 14 +++++ .../RemoteDataStoreGetResponse.cs | 13 ++++ .../RemoteDataStorePutRequest.cs | 16 +++++ .../RemoteDataStorePutResponse.cs | 12 ++++ .../Tango.DataStore.Remote.csproj | 72 ++++++++++++++++++++++ 18 files changed, 300 insertions(+) create mode 100644 Software/Visual_Studio/Tango.DataStore.Remote/Properties/AssemblyInfo.cs create mode 100644 Software/Visual_Studio/Tango.DataStore.Remote/RemoteDataStoreCountRequest.cs create mode 100644 Software/Visual_Studio/Tango.DataStore.Remote/RemoteDataStoreCountResponse.cs create mode 100644 Software/Visual_Studio/Tango.DataStore.Remote/RemoteDataStoreDeleteAllRequest.cs create mode 100644 Software/Visual_Studio/Tango.DataStore.Remote/RemoteDataStoreDeleteAllResponse.cs create mode 100644 Software/Visual_Studio/Tango.DataStore.Remote/RemoteDataStoreDeleteRequest.cs create mode 100644 Software/Visual_Studio/Tango.DataStore.Remote/RemoteDataStoreDeleteResponse.cs create mode 100644 Software/Visual_Studio/Tango.DataStore.Remote/RemoteDataStoreGetAllRequest.cs create mode 100644 Software/Visual_Studio/Tango.DataStore.Remote/RemoteDataStoreGetAllResponse.cs create mode 100644 Software/Visual_Studio/Tango.DataStore.Remote/RemoteDataStoreGetCollectionNamesRequest.cs create mode 100644 Software/Visual_Studio/Tango.DataStore.Remote/RemoteDataStoreGetCollectionNamesResponse.cs create mode 100644 Software/Visual_Studio/Tango.DataStore.Remote/RemoteDataStoreGetItemRequest.cs create mode 100644 Software/Visual_Studio/Tango.DataStore.Remote/RemoteDataStoreGetItemResponse.cs create mode 100644 Software/Visual_Studio/Tango.DataStore.Remote/RemoteDataStoreGetRequest.cs create mode 100644 Software/Visual_Studio/Tango.DataStore.Remote/RemoteDataStoreGetResponse.cs create mode 100644 Software/Visual_Studio/Tango.DataStore.Remote/RemoteDataStorePutRequest.cs create mode 100644 Software/Visual_Studio/Tango.DataStore.Remote/RemoteDataStorePutResponse.cs create mode 100644 Software/Visual_Studio/Tango.DataStore.Remote/Tango.DataStore.Remote.csproj (limited to 'Software/Visual_Studio/Tango.DataStore.Remote') diff --git a/Software/Visual_Studio/Tango.DataStore.Remote/Properties/AssemblyInfo.cs b/Software/Visual_Studio/Tango.DataStore.Remote/Properties/AssemblyInfo.cs new file mode 100644 index 000000000..808b25d41 --- /dev/null +++ b/Software/Visual_Studio/Tango.DataStore.Remote/Properties/AssemblyInfo.cs @@ -0,0 +1,7 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +[assembly: AssemblyTitle("Tango - Data Store Remote Messages")] +[assembly: AssemblyVersion("2.0.4.1608")] +[assembly: ComVisible(false)] \ No newline at end of file diff --git a/Software/Visual_Studio/Tango.DataStore.Remote/RemoteDataStoreCountRequest.cs b/Software/Visual_Studio/Tango.DataStore.Remote/RemoteDataStoreCountRequest.cs new file mode 100644 index 000000000..84ba279fb --- /dev/null +++ b/Software/Visual_Studio/Tango.DataStore.Remote/RemoteDataStoreCountRequest.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Tango.DataStore.Remote +{ + public class RemoteDataStoreCountRequest + { + public String Collection { get; set; } + } +} diff --git a/Software/Visual_Studio/Tango.DataStore.Remote/RemoteDataStoreCountResponse.cs b/Software/Visual_Studio/Tango.DataStore.Remote/RemoteDataStoreCountResponse.cs new file mode 100644 index 000000000..71d4e13b2 --- /dev/null +++ b/Software/Visual_Studio/Tango.DataStore.Remote/RemoteDataStoreCountResponse.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Tango.DataStore.Remote +{ + public class RemoteDataStoreCountResponse + { + public int Count { get; set; } + } +} diff --git a/Software/Visual_Studio/Tango.DataStore.Remote/RemoteDataStoreDeleteAllRequest.cs b/Software/Visual_Studio/Tango.DataStore.Remote/RemoteDataStoreDeleteAllRequest.cs new file mode 100644 index 000000000..ab5406611 --- /dev/null +++ b/Software/Visual_Studio/Tango.DataStore.Remote/RemoteDataStoreDeleteAllRequest.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Tango.DataStore.Remote +{ + public class RemoteDataStoreDeleteAllRequest + { + public String Collection { get; set; } + } +} diff --git a/Software/Visual_Studio/Tango.DataStore.Remote/RemoteDataStoreDeleteAllResponse.cs b/Software/Visual_Studio/Tango.DataStore.Remote/RemoteDataStoreDeleteAllResponse.cs new file mode 100644 index 000000000..b5ddc0b64 --- /dev/null +++ b/Software/Visual_Studio/Tango.DataStore.Remote/RemoteDataStoreDeleteAllResponse.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Tango.DataStore.Remote +{ + public class RemoteDataStoreDeleteAllResponse + { + + } +} diff --git a/Software/Visual_Studio/Tango.DataStore.Remote/RemoteDataStoreDeleteRequest.cs b/Software/Visual_Studio/Tango.DataStore.Remote/RemoteDataStoreDeleteRequest.cs new file mode 100644 index 000000000..13d400154 --- /dev/null +++ b/Software/Visual_Studio/Tango.DataStore.Remote/RemoteDataStoreDeleteRequest.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Tango.DataStore.Remote +{ + public class RemoteDataStoreDeleteRequest + { + public String Collection { get; set; } + public String Key { get; set; } + } +} diff --git a/Software/Visual_Studio/Tango.DataStore.Remote/RemoteDataStoreDeleteResponse.cs b/Software/Visual_Studio/Tango.DataStore.Remote/RemoteDataStoreDeleteResponse.cs new file mode 100644 index 000000000..07bb40a8b --- /dev/null +++ b/Software/Visual_Studio/Tango.DataStore.Remote/RemoteDataStoreDeleteResponse.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Tango.DataStore.Remote +{ + public class RemoteDataStoreDeleteResponse + { + } +} diff --git a/Software/Visual_Studio/Tango.DataStore.Remote/RemoteDataStoreGetAllRequest.cs b/Software/Visual_Studio/Tango.DataStore.Remote/RemoteDataStoreGetAllRequest.cs new file mode 100644 index 000000000..747a5cb2f --- /dev/null +++ b/Software/Visual_Studio/Tango.DataStore.Remote/RemoteDataStoreGetAllRequest.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Tango.DataStore.Remote +{ + public class RemoteDataStoreGetAllRequest + { + public String Collection { get; set; } + } +} diff --git a/Software/Visual_Studio/Tango.DataStore.Remote/RemoteDataStoreGetAllResponse.cs b/Software/Visual_Studio/Tango.DataStore.Remote/RemoteDataStoreGetAllResponse.cs new file mode 100644 index 000000000..98848924c --- /dev/null +++ b/Software/Visual_Studio/Tango.DataStore.Remote/RemoteDataStoreGetAllResponse.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Tango.DataStore.Remote +{ + public class RemoteDataStoreGetAllResponse + { + public List Items { get; set; } + + public RemoteDataStoreGetAllResponse() + { + Items = new List(); + } + } +} diff --git a/Software/Visual_Studio/Tango.DataStore.Remote/RemoteDataStoreGetCollectionNamesRequest.cs b/Software/Visual_Studio/Tango.DataStore.Remote/RemoteDataStoreGetCollectionNamesRequest.cs new file mode 100644 index 000000000..6299f7512 --- /dev/null +++ b/Software/Visual_Studio/Tango.DataStore.Remote/RemoteDataStoreGetCollectionNamesRequest.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Tango.DataStore.Remote +{ + public class RemoteDataStoreGetCollectionNamesRequest + { + } +} diff --git a/Software/Visual_Studio/Tango.DataStore.Remote/RemoteDataStoreGetCollectionNamesResponse.cs b/Software/Visual_Studio/Tango.DataStore.Remote/RemoteDataStoreGetCollectionNamesResponse.cs new file mode 100644 index 000000000..fe98b73fc --- /dev/null +++ b/Software/Visual_Studio/Tango.DataStore.Remote/RemoteDataStoreGetCollectionNamesResponse.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Tango.DataStore.Remote +{ + public class RemoteDataStoreGetCollectionNamesResponse + { + public List Names { get; set; } + + public RemoteDataStoreGetCollectionNamesResponse() + { + Names = new List(); + } + } +} diff --git a/Software/Visual_Studio/Tango.DataStore.Remote/RemoteDataStoreGetItemRequest.cs b/Software/Visual_Studio/Tango.DataStore.Remote/RemoteDataStoreGetItemRequest.cs new file mode 100644 index 000000000..8bd6470f9 --- /dev/null +++ b/Software/Visual_Studio/Tango.DataStore.Remote/RemoteDataStoreGetItemRequest.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Tango.DataStore.Remote +{ + public class RemoteDataStoreGetItemRequest + { + public String Collection { get; set; } + public String Key { get; set; } + } +} diff --git a/Software/Visual_Studio/Tango.DataStore.Remote/RemoteDataStoreGetItemResponse.cs b/Software/Visual_Studio/Tango.DataStore.Remote/RemoteDataStoreGetItemResponse.cs new file mode 100644 index 000000000..ebd19eb4f --- /dev/null +++ b/Software/Visual_Studio/Tango.DataStore.Remote/RemoteDataStoreGetItemResponse.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Tango.DataStore.Remote +{ + public class RemoteDataStoreGetItemResponse + { + public IDataStoreItem Item { get; set; } + } +} diff --git a/Software/Visual_Studio/Tango.DataStore.Remote/RemoteDataStoreGetRequest.cs b/Software/Visual_Studio/Tango.DataStore.Remote/RemoteDataStoreGetRequest.cs new file mode 100644 index 000000000..1244523b3 --- /dev/null +++ b/Software/Visual_Studio/Tango.DataStore.Remote/RemoteDataStoreGetRequest.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Tango.DataStore.Remote +{ + public class RemoteDataStoreGetRequest + { + public String Collection { get; set; } + public String Key { get; set; } + } +} diff --git a/Software/Visual_Studio/Tango.DataStore.Remote/RemoteDataStoreGetResponse.cs b/Software/Visual_Studio/Tango.DataStore.Remote/RemoteDataStoreGetResponse.cs new file mode 100644 index 000000000..a3c5eb99c --- /dev/null +++ b/Software/Visual_Studio/Tango.DataStore.Remote/RemoteDataStoreGetResponse.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Tango.DataStore.Remote +{ + public class RemoteDataStoreGetResponse + { + public Object Value { get; set; } + } +} diff --git a/Software/Visual_Studio/Tango.DataStore.Remote/RemoteDataStorePutRequest.cs b/Software/Visual_Studio/Tango.DataStore.Remote/RemoteDataStorePutRequest.cs new file mode 100644 index 000000000..6ea13bf6b --- /dev/null +++ b/Software/Visual_Studio/Tango.DataStore.Remote/RemoteDataStorePutRequest.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Tango.DataStore.Remote +{ + public class RemoteDataStorePutRequest + { + public String Collection { get; set; } + public DataType DataType { get; set; } + public String Key { get; set; } + public Object Value { get; set; } + } +} diff --git a/Software/Visual_Studio/Tango.DataStore.Remote/RemoteDataStorePutResponse.cs b/Software/Visual_Studio/Tango.DataStore.Remote/RemoteDataStorePutResponse.cs new file mode 100644 index 000000000..7dd92490a --- /dev/null +++ b/Software/Visual_Studio/Tango.DataStore.Remote/RemoteDataStorePutResponse.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Tango.DataStore.Remote +{ + public class RemoteDataStorePutResponse + { + } +} diff --git a/Software/Visual_Studio/Tango.DataStore.Remote/Tango.DataStore.Remote.csproj b/Software/Visual_Studio/Tango.DataStore.Remote/Tango.DataStore.Remote.csproj new file mode 100644 index 000000000..b60d91d71 --- /dev/null +++ b/Software/Visual_Studio/Tango.DataStore.Remote/Tango.DataStore.Remote.csproj @@ -0,0 +1,72 @@ + + + + + Debug + AnyCPU + {29448F3C-9B3E-4DA6-8555-46A8B9A6B3AA} + Library + Properties + Tango.DataStore.Remote + Tango.DataStore.Remote + v4.6.1 + 512 + true + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + + + GlobalVersionInfo.cs + + + + + + + + + + + + + + + + + + + + + + {e0364dfa-0721-4637-9d32-9d22aac109d6} + Tango.DataStore + + + + \ No newline at end of file -- cgit v1.3.1 From 8d2b13aaa70bc6a8f521df4eab165caf078c33fa Mon Sep 17 00:00:00 2001 From: Roy Ben Shabat Date: Fri, 23 Oct 2020 03:13:09 +0300 Subject: DataStore Improvements. --- .../PMR/Messages/DataStore/DataStoreItem.proto | 15 ++-- .../DataStore/GetDataStoreItemRequest.proto | 3 + .../DataStore/GetDataStoreItemResponse.proto | 3 +- .../DataStore/PutDataStoreItemRequest.proto | 3 +- .../DataStore/RemoteDataStoreCollection.cs | 23 +++++- .../DataStore/DefaultDataStoreService.cs | 12 ++-- .../Tango.DataStore.EF/EFDataStoreCollection.cs | 29 +++++++- .../LiteDBDataStoreCollection.cs | 47 ++++++++---- .../RemoteDataStoreGetItemRequest.cs | 1 + .../RemoteDataStoreGetRequest.cs | 1 + .../Tango.DataStore/IDataStoreCollection.cs | 36 ++++++++++ .../Tango.Emulations/Emulators/MachineEmulator.cs | 12 ++-- .../Tango.PMR/DataStore/DataStoreItem.cs | 84 ++++++++-------------- .../Tango.PMR/DataStore/GetDataStoreItemRequest.cs | 46 ++++++++++-- .../DataStore/GetDataStoreItemResponse.cs | 42 +++++++++-- .../Tango.PMR/DataStore/PutDataStoreItemRequest.cs | 42 +++++++++-- Software/Visual_Studio/Tango.PMR/Tango.PMR.csproj | 2 +- 17 files changed, 286 insertions(+), 115 deletions(-) (limited to 'Software/Visual_Studio/Tango.DataStore.Remote') diff --git a/Software/PMR/Messages/DataStore/DataStoreItem.proto b/Software/PMR/Messages/DataStore/DataStoreItem.proto index 5f3ce7027..f516fa92c 100644 --- a/Software/PMR/Messages/DataStore/DataStoreItem.proto +++ b/Software/PMR/Messages/DataStore/DataStoreItem.proto @@ -7,12 +7,11 @@ option java_package = "com.twine.tango.pmr.datastore"; message DataStoreItem { - string Key = 1; - DataType DataType = 2; - int32 Int32Value = 3; - float FloatValue = 4; - double DoubleValue = 5; - bool BooleanValue = 6; - string StringValue = 7; - bytes BytesValue = 8; + DataType DataType = 1; + int32 Int32Value = 2; + float FloatValue = 3; + double DoubleValue = 4; + bool BooleanValue = 5; + string StringValue = 6; + bytes BytesValue = 7; } \ No newline at end of file diff --git a/Software/PMR/Messages/DataStore/GetDataStoreItemRequest.proto b/Software/PMR/Messages/DataStore/GetDataStoreItemRequest.proto index 097dfe97e..07d0cec47 100644 --- a/Software/PMR/Messages/DataStore/GetDataStoreItemRequest.proto +++ b/Software/PMR/Messages/DataStore/GetDataStoreItemRequest.proto @@ -1,5 +1,7 @@ syntax = "proto3"; +import "DataStoreItem.proto"; + package Tango.PMR.DataStore; option java_package = "com.twine.tango.pmr.datastore"; @@ -7,4 +9,5 @@ message GetDataStoreItemRequest { string Collection = 1; string Key = 2; + DataStoreItem DefaultItem = 3; } \ No newline at end of file diff --git a/Software/PMR/Messages/DataStore/GetDataStoreItemResponse.proto b/Software/PMR/Messages/DataStore/GetDataStoreItemResponse.proto index 1df920f08..9445a6fd9 100644 --- a/Software/PMR/Messages/DataStore/GetDataStoreItemResponse.proto +++ b/Software/PMR/Messages/DataStore/GetDataStoreItemResponse.proto @@ -7,5 +7,6 @@ option java_package = "com.twine.tango.pmr.datastore"; message GetDataStoreItemResponse { - DataStoreItem Item = 1; + string Key = 1; + DataStoreItem Item = 2; } \ No newline at end of file diff --git a/Software/PMR/Messages/DataStore/PutDataStoreItemRequest.proto b/Software/PMR/Messages/DataStore/PutDataStoreItemRequest.proto index 746c8340e..e4dcb979c 100644 --- a/Software/PMR/Messages/DataStore/PutDataStoreItemRequest.proto +++ b/Software/PMR/Messages/DataStore/PutDataStoreItemRequest.proto @@ -8,5 +8,6 @@ option java_package = "com.twine.tango.pmr.datastore"; message PutDataStoreItemRequest { string Collection = 1; - DataStoreItem Item = 2; + string Key = 2; + DataStoreItem Item = 3; } \ No newline at end of file diff --git a/Software/Visual_Studio/FSE/Tango.FSE.UI/DataStore/RemoteDataStoreCollection.cs b/Software/Visual_Studio/FSE/Tango.FSE.UI/DataStore/RemoteDataStoreCollection.cs index b7325cd48..cb49c667d 100644 --- a/Software/Visual_Studio/FSE/Tango.FSE.UI/DataStore/RemoteDataStoreCollection.cs +++ b/Software/Visual_Studio/FSE/Tango.FSE.UI/DataStore/RemoteDataStoreCollection.cs @@ -44,15 +44,26 @@ namespace Tango.FSE.UI.DataStore public T Get(string key) { - return (T)Convert.ChangeType(Get(key), typeof(T)); + return (T)Convert.ChangeType(Get(key, null), typeof(T)); + } + + public T Get(string key, T defaultValue) + { + return (T)Convert.ChangeType(Get(key, (object)defaultValue), typeof(T)); } public object Get(string key) + { + return Get(key, null); + } + + public object Get(string key, object defaultValue) { var result = _machineProvider.MachineOperator.SendGenericRequest(new RemoteDataStoreGetRequest() { Collection = Name, - Key = key + Key = key, + DefaultValue = defaultValue }).Result; return result.Value; @@ -96,11 +107,17 @@ namespace Tango.FSE.UI.DataStore } public IDataStoreItem GetItem(string key) + { + return GetItem(key, null); + } + + public IDataStoreItem GetItem(string key, object defaultValue) { var result = _machineProvider.MachineOperator.SendGenericRequest(new RemoteDataStoreGetItemRequest() { Collection = Name, - Key = key + Key = key, + DefaultValue = defaultValue }).Result; return result.Item; diff --git a/Software/Visual_Studio/PPC/Tango.PPC.Common/DataStore/DefaultDataStoreService.cs b/Software/Visual_Studio/PPC/Tango.PPC.Common/DataStore/DefaultDataStoreService.cs index e5bec90f2..e6da8e8e7 100644 --- a/Software/Visual_Studio/PPC/Tango.PPC.Common/DataStore/DefaultDataStoreService.cs +++ b/Software/Visual_Studio/PPC/Tango.PPC.Common/DataStore/DefaultDataStoreService.cs @@ -58,7 +58,7 @@ namespace Tango.PPC.Common.DataStore [ExternalBridgeRequestHandlerMethod(typeof(RemoteDataStoreGetRequest), RequestHandlerLoggingMode.LogRequestName)] public async Task OnRemoteDataStoreGetRequest(RemoteDataStoreGetRequest request, String token, ExternalBridgeReceiver receiver) { - var value = GetManager().GetCollection(request.Collection).Get(request.Key); + var value = GetManager().GetCollection(request.Collection).Get(request.Key, request.DefaultValue); await receiver.SendGenericResponse(new RemoteDataStoreGetResponse() { Value = value @@ -68,7 +68,7 @@ namespace Tango.PPC.Common.DataStore [ExternalBridgeRequestHandlerMethod(typeof(RemoteDataStoreGetItemRequest), RequestHandlerLoggingMode.LogRequestName)] public async Task OnRemoteDataStoreGetItemRequest(RemoteDataStoreGetItemRequest request, String token, ExternalBridgeReceiver receiver) { - var item = GetManager().GetCollection(request.Collection).GetItem(request.Key); + var item = GetManager().GetCollection(request.Collection).GetItem(request.Key, request.DefaultValue); await receiver.SendGenericResponse(new RemoteDataStoreGetItemResponse() { Item = item @@ -127,7 +127,7 @@ namespace Tango.PPC.Common.DataStore { try { - GetManager().GetCollection(request.Collection).Put(request.Item.Key, GetPMRValue(request.Item)); + GetManager().GetCollection(request.Collection).Put(request.Key, GetPMRValue(request.Item)); await transporter.SendResponse(new PutDataStoreItemResponse(), token); } catch (Exception ex) @@ -151,9 +151,10 @@ namespace Tango.PPC.Common.DataStore { try { - var item = GetManager().GetCollection(request.Collection).GetItem(request.Key); + var item = GetManager().GetCollection(request.Collection).GetItem(request.Key, GetPMRValue(request.DefaultItem)); await transporter.SendResponse(new GetDataStoreItemResponse() { + Key = item.Key, Item = CreatePMRDataStoreItem(item), }, token); } @@ -194,7 +195,6 @@ namespace Tango.PPC.Common.DataStore private DataStoreItem CreatePMRDataStoreItem(IDataStoreItem item) { DataStoreItem pmr = new DataStoreItem(); - pmr.Key = item.Key; pmr.DataType = (PMR.DataStore.DataType)item.Type; switch (item.Type) @@ -224,6 +224,8 @@ namespace Tango.PPC.Common.DataStore private Object GetPMRValue(DataStoreItem item) { + if (item == null) return null; + switch (item.DataType) { case PMR.DataStore.DataType.Int32: diff --git a/Software/Visual_Studio/Tango.DataStore.EF/EFDataStoreCollection.cs b/Software/Visual_Studio/Tango.DataStore.EF/EFDataStoreCollection.cs index eab6ef377..afec27417 100644 --- a/Software/Visual_Studio/Tango.DataStore.EF/EFDataStoreCollection.cs +++ b/Software/Visual_Studio/Tango.DataStore.EF/EFDataStoreCollection.cs @@ -53,15 +53,30 @@ namespace Tango.DataStore.EF public T Get(string key) { - return (T)Get(key); + return (T)Get(key, null); + } + + public T Get(string key, T defaultValue) + { + return (T)Get(key, (object)defaultValue); } public object Get(string key) { - return GetItem(key).Value; + return Get(key, null); + } + + public object Get(string key, object defaultValue) + { + return GetItem(key, defaultValue).Value; } public IDataStoreItem GetItem(string key) + { + return GetItem(key, null); + } + + public IDataStoreItem GetItem(string key, object defaultValue) { using (var db = ObservablesContext.CreateDefault()) { @@ -69,7 +84,15 @@ namespace Tango.DataStore.EF if (item == null) { - throw new KeyNotFoundException("The specified data store key was not found."); + if (defaultValue == null) + { + throw new KeyNotFoundException("The specified data store key was not found."); + } + else + { + Put(key, defaultValue); + return GetItem(key); + } } return item.ToDataStoreItem(); diff --git a/Software/Visual_Studio/Tango.DataStore.LiteDB/LiteDBDataStoreCollection.cs b/Software/Visual_Studio/Tango.DataStore.LiteDB/LiteDBDataStoreCollection.cs index e61385ab8..c76a3b6d9 100644 --- a/Software/Visual_Studio/Tango.DataStore.LiteDB/LiteDBDataStoreCollection.cs +++ b/Software/Visual_Studio/Tango.DataStore.LiteDB/LiteDBDataStoreCollection.cs @@ -40,21 +40,49 @@ namespace Tango.DataStore.Lite }); } + public T Get(string key) + { + return (T)Convert.ChangeType(Get(key), typeof(T)); + } + + public T Get(string key, T defaultValue) + { + return (T)Convert.ChangeType(Get(key, defaultValue), typeof(T)); + } + public object Get(string key) + { + return Get(key, null); + } + + public object Get(string key, object defaultValue) + { + return GetItem(key, defaultValue).Value; + } + + public IDataStoreItem GetItem(string key) + { + return GetItem(key, null); + } + + public IDataStoreItem GetItem(string key, object defaultValue) { var item = _collection.FindById(key); if (item == null) { - throw new KeyNotFoundException("The specified key was not found on the data store."); + if (defaultValue == null) + { + throw new KeyNotFoundException("The specified key was not found on the data store."); + } + else + { + Put(key, defaultValue); + return GetItem(key); + } } - return item.Value; - } - - public T Get(string key) - { - return (T)Convert.ChangeType(Get(key), typeof(T)); + return item; } public List GetAll() @@ -77,11 +105,6 @@ namespace Tango.DataStore.Lite return _collection.Count(); } - public IDataStoreItem GetItem(string key) - { - return _collection.FindById(key); - } - public List GetUnsynchronized() { return _collection.Find(x => !x.IsSynchronized).ToList(); diff --git a/Software/Visual_Studio/Tango.DataStore.Remote/RemoteDataStoreGetItemRequest.cs b/Software/Visual_Studio/Tango.DataStore.Remote/RemoteDataStoreGetItemRequest.cs index 8bd6470f9..7d16a0f38 100644 --- a/Software/Visual_Studio/Tango.DataStore.Remote/RemoteDataStoreGetItemRequest.cs +++ b/Software/Visual_Studio/Tango.DataStore.Remote/RemoteDataStoreGetItemRequest.cs @@ -10,5 +10,6 @@ namespace Tango.DataStore.Remote { public String Collection { get; set; } public String Key { get; set; } + public Object DefaultValue { get; set; } } } diff --git a/Software/Visual_Studio/Tango.DataStore.Remote/RemoteDataStoreGetRequest.cs b/Software/Visual_Studio/Tango.DataStore.Remote/RemoteDataStoreGetRequest.cs index 1244523b3..4b8e9ee47 100644 --- a/Software/Visual_Studio/Tango.DataStore.Remote/RemoteDataStoreGetRequest.cs +++ b/Software/Visual_Studio/Tango.DataStore.Remote/RemoteDataStoreGetRequest.cs @@ -10,5 +10,6 @@ namespace Tango.DataStore.Remote { public String Collection { get; set; } public String Key { get; set; } + public Object DefaultValue { get; set; } } } diff --git a/Software/Visual_Studio/Tango.DataStore/IDataStoreCollection.cs b/Software/Visual_Studio/Tango.DataStore/IDataStoreCollection.cs index e73d02328..baca95c67 100644 --- a/Software/Visual_Studio/Tango.DataStore/IDataStoreCollection.cs +++ b/Software/Visual_Studio/Tango.DataStore/IDataStoreCollection.cs @@ -15,12 +15,14 @@ namespace Tango.DataStore /// Gets the collection name. /// String Name { get; } + /// /// Upserts the specified key and value. /// /// The key. /// The value. void Put(String key, Object value); + /// /// Upserts the specified key and value of type T. /// @@ -28,6 +30,7 @@ namespace Tango.DataStore /// The key. /// The value. void Put(String key, T value); + /// /// Upserts the specified key and value. /// The value must be of the specified DataType. @@ -36,12 +39,22 @@ namespace Tango.DataStore /// The type. /// The value. void Put(String key, DataType type, Object value); + /// /// Gets the value by the specified key /// /// The key. /// Object Get(String key); + + /// + /// Gets the value by the specified key + /// + /// The key. + /// Will execute put when the key was not found. + /// + Object Get(String key, Object defaultValue); + /// /// Gets the value of type T by the specified key /// @@ -49,31 +62,54 @@ namespace Tango.DataStore /// The key. /// T Get(String key); + + /// + /// Gets the value of type T by the specified key + /// + /// + /// The key. + /// Will execute put when the key was not found. + /// + T Get(String key, T defaultValue); + /// /// Gets the full data store item by the specified key. /// /// The key. /// IDataStoreItem GetItem(String key); + + /// + /// Gets the full data store item by the specified key. + /// + /// The key. + /// Will execute put when the key was not found. + /// + IDataStoreItem GetItem(String key, Object defaultValue); + /// /// Gets all the data store items in the collection. /// /// List GetAll(); + /// /// Gets all the data store unsynchronized items in the collection. /// /// List GetUnsynchronized(); + /// /// Deleted an item by the specified key. /// /// The key. void Delete(String key); + /// /// Deletes all items in the collection. /// void DeleteAll(); + /// /// Returns the number of items in the collection. /// diff --git a/Software/Visual_Studio/Tango.Emulations/Emulators/MachineEmulator.cs b/Software/Visual_Studio/Tango.Emulations/Emulators/MachineEmulator.cs index f8682dd18..05752c378 100644 --- a/Software/Visual_Studio/Tango.Emulations/Emulators/MachineEmulator.cs +++ b/Software/Visual_Studio/Tango.Emulations/Emulators/MachineEmulator.cs @@ -1786,9 +1786,9 @@ namespace Tango.Emulations.Emulators var response = await Transporter.SendRequest(new PutDataStoreItemRequest() { Collection = "TEST", + Key = "int", Item = new PMR.DataStore.DataStoreItem() { - Key = "int", DataType = DataType.Int32, Int32Value = 100 } @@ -1826,9 +1826,9 @@ namespace Tango.Emulations.Emulators var response = await Transporter.SendRequest(new PutDataStoreItemRequest() { Collection = "TEST", + Key = "float", Item = new PMR.DataStore.DataStoreItem() { - Key = "float", DataType = DataType.Float, FloatValue = 101f } @@ -1866,9 +1866,9 @@ namespace Tango.Emulations.Emulators var response = await Transporter.SendRequest(new PutDataStoreItemRequest() { Collection = "TEST", + Key = "double", Item = new PMR.DataStore.DataStoreItem() { - Key = "double", DataType = DataType.Double, DoubleValue = 102d } @@ -1906,9 +1906,9 @@ namespace Tango.Emulations.Emulators var response = await Transporter.SendRequest(new PutDataStoreItemRequest() { Collection = "TEST", + Key = "bool", Item = new PMR.DataStore.DataStoreItem() { - Key = "bool", DataType = DataType.Boolean, BooleanValue = true } @@ -1946,9 +1946,9 @@ namespace Tango.Emulations.Emulators var response = await Transporter.SendRequest(new PutDataStoreItemRequest() { Collection = "TEST", + Key = "string", Item = new PMR.DataStore.DataStoreItem() { - Key = "string", DataType = DataType.String, StringValue = "String Value" } @@ -1986,9 +1986,9 @@ namespace Tango.Emulations.Emulators var response = await Transporter.SendRequest(new PutDataStoreItemRequest() { Collection = "TEST", + Key = "bytes", Item = new PMR.DataStore.DataStoreItem() { - Key = "bytes", DataType = DataType.Bytes, BytesValue = ByteString.CopyFromUtf8("Bytes TEST TEST TEST"), } diff --git a/Software/Visual_Studio/Tango.PMR/DataStore/DataStoreItem.cs b/Software/Visual_Studio/Tango.PMR/DataStore/DataStoreItem.cs index a6d2fe860..4b7534738 100644 --- a/Software/Visual_Studio/Tango.PMR/DataStore/DataStoreItem.cs +++ b/Software/Visual_Studio/Tango.PMR/DataStore/DataStoreItem.cs @@ -23,16 +23,16 @@ namespace Tango.PMR.DataStore { byte[] descriptorData = global::System.Convert.FromBase64String( string.Concat( "ChNEYXRhU3RvcmVJdGVtLnByb3RvEhNUYW5nby5QTVIuRGF0YVN0b3JlGg5E", - "YXRhVHlwZS5wcm90byLJAQoNRGF0YVN0b3JlSXRlbRILCgNLZXkYASABKAkS", - "LwoIRGF0YVR5cGUYAiABKA4yHS5UYW5nby5QTVIuRGF0YVN0b3JlLkRhdGFU", - "eXBlEhIKCkludDMyVmFsdWUYAyABKAUSEgoKRmxvYXRWYWx1ZRgEIAEoAhIT", - "CgtEb3VibGVWYWx1ZRgFIAEoARIUCgxCb29sZWFuVmFsdWUYBiABKAgSEwoL", - "U3RyaW5nVmFsdWUYByABKAkSEgoKQnl0ZXNWYWx1ZRgIIAEoDEIfCh1jb20u", - "dHdpbmUudGFuZ28ucG1yLmRhdGFzdG9yZWIGcHJvdG8z")); + "YXRhVHlwZS5wcm90byK8AQoNRGF0YVN0b3JlSXRlbRIvCghEYXRhVHlwZRgB", + "IAEoDjIdLlRhbmdvLlBNUi5EYXRhU3RvcmUuRGF0YVR5cGUSEgoKSW50MzJW", + "YWx1ZRgCIAEoBRISCgpGbG9hdFZhbHVlGAMgASgCEhMKC0RvdWJsZVZhbHVl", + "GAQgASgBEhQKDEJvb2xlYW5WYWx1ZRgFIAEoCBITCgtTdHJpbmdWYWx1ZRgG", + "IAEoCRISCgpCeXRlc1ZhbHVlGAcgASgMQh8KHWNvbS50d2luZS50YW5nby5w", + "bXIuZGF0YXN0b3JlYgZwcm90bzM=")); descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData, new pbr::FileDescriptor[] { global::Tango.PMR.DataStore.DataTypeReflection.Descriptor, }, new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] { - new pbr::GeneratedClrTypeInfo(typeof(global::Tango.PMR.DataStore.DataStoreItem), global::Tango.PMR.DataStore.DataStoreItem.Parser, new[]{ "Key", "DataType", "Int32Value", "FloatValue", "DoubleValue", "BooleanValue", "StringValue", "BytesValue" }, null, null, null) + new pbr::GeneratedClrTypeInfo(typeof(global::Tango.PMR.DataStore.DataStoreItem), global::Tango.PMR.DataStore.DataStoreItem.Parser, new[]{ "DataType", "Int32Value", "FloatValue", "DoubleValue", "BooleanValue", "StringValue", "BytesValue" }, null, null, null) })); } #endregion @@ -63,7 +63,6 @@ namespace Tango.PMR.DataStore { [global::System.Diagnostics.DebuggerNonUserCodeAttribute] public DataStoreItem(DataStoreItem other) : this() { - key_ = other.key_; dataType_ = other.dataType_; int32Value_ = other.int32Value_; floatValue_ = other.floatValue_; @@ -78,19 +77,8 @@ namespace Tango.PMR.DataStore { return new DataStoreItem(this); } - /// Field number for the "Key" field. - public const int KeyFieldNumber = 1; - private string key_ = ""; - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public string Key { - get { return key_; } - set { - key_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); - } - } - /// Field number for the "DataType" field. - public const int DataTypeFieldNumber = 2; + public const int DataTypeFieldNumber = 1; private global::Tango.PMR.DataStore.DataType dataType_ = 0; [global::System.Diagnostics.DebuggerNonUserCodeAttribute] public global::Tango.PMR.DataStore.DataType DataType { @@ -101,7 +89,7 @@ namespace Tango.PMR.DataStore { } /// Field number for the "Int32Value" field. - public const int Int32ValueFieldNumber = 3; + public const int Int32ValueFieldNumber = 2; private int int32Value_; [global::System.Diagnostics.DebuggerNonUserCodeAttribute] public int Int32Value { @@ -112,7 +100,7 @@ namespace Tango.PMR.DataStore { } /// Field number for the "FloatValue" field. - public const int FloatValueFieldNumber = 4; + public const int FloatValueFieldNumber = 3; private float floatValue_; [global::System.Diagnostics.DebuggerNonUserCodeAttribute] public float FloatValue { @@ -123,7 +111,7 @@ namespace Tango.PMR.DataStore { } /// Field number for the "DoubleValue" field. - public const int DoubleValueFieldNumber = 5; + public const int DoubleValueFieldNumber = 4; private double doubleValue_; [global::System.Diagnostics.DebuggerNonUserCodeAttribute] public double DoubleValue { @@ -134,7 +122,7 @@ namespace Tango.PMR.DataStore { } /// Field number for the "BooleanValue" field. - public const int BooleanValueFieldNumber = 6; + public const int BooleanValueFieldNumber = 5; private bool booleanValue_; [global::System.Diagnostics.DebuggerNonUserCodeAttribute] public bool BooleanValue { @@ -145,7 +133,7 @@ namespace Tango.PMR.DataStore { } /// Field number for the "StringValue" field. - public const int StringValueFieldNumber = 7; + public const int StringValueFieldNumber = 6; private string stringValue_ = ""; [global::System.Diagnostics.DebuggerNonUserCodeAttribute] public string StringValue { @@ -156,7 +144,7 @@ namespace Tango.PMR.DataStore { } /// Field number for the "BytesValue" field. - public const int BytesValueFieldNumber = 8; + public const int BytesValueFieldNumber = 7; private pb::ByteString bytesValue_ = pb::ByteString.Empty; [global::System.Diagnostics.DebuggerNonUserCodeAttribute] public pb::ByteString BytesValue { @@ -179,7 +167,6 @@ namespace Tango.PMR.DataStore { if (ReferenceEquals(other, this)) { return true; } - if (Key != other.Key) return false; if (DataType != other.DataType) return false; if (Int32Value != other.Int32Value) return false; if (FloatValue != other.FloatValue) return false; @@ -193,7 +180,6 @@ namespace Tango.PMR.DataStore { [global::System.Diagnostics.DebuggerNonUserCodeAttribute] public override int GetHashCode() { int hash = 1; - if (Key.Length != 0) hash ^= Key.GetHashCode(); if (DataType != 0) hash ^= DataType.GetHashCode(); if (Int32Value != 0) hash ^= Int32Value.GetHashCode(); if (FloatValue != 0F) hash ^= FloatValue.GetHashCode(); @@ -211,36 +197,32 @@ namespace Tango.PMR.DataStore { [global::System.Diagnostics.DebuggerNonUserCodeAttribute] public void WriteTo(pb::CodedOutputStream output) { - if (Key.Length != 0) { - output.WriteRawTag(10); - output.WriteString(Key); - } if (DataType != 0) { - output.WriteRawTag(16); + output.WriteRawTag(8); output.WriteEnum((int) DataType); } if (Int32Value != 0) { - output.WriteRawTag(24); + output.WriteRawTag(16); output.WriteInt32(Int32Value); } if (FloatValue != 0F) { - output.WriteRawTag(37); + output.WriteRawTag(29); output.WriteFloat(FloatValue); } if (DoubleValue != 0D) { - output.WriteRawTag(41); + output.WriteRawTag(33); output.WriteDouble(DoubleValue); } if (BooleanValue != false) { - output.WriteRawTag(48); + output.WriteRawTag(40); output.WriteBool(BooleanValue); } if (StringValue.Length != 0) { - output.WriteRawTag(58); + output.WriteRawTag(50); output.WriteString(StringValue); } if (BytesValue.Length != 0) { - output.WriteRawTag(66); + output.WriteRawTag(58); output.WriteBytes(BytesValue); } } @@ -248,9 +230,6 @@ namespace Tango.PMR.DataStore { [global::System.Diagnostics.DebuggerNonUserCodeAttribute] public int CalculateSize() { int size = 0; - if (Key.Length != 0) { - size += 1 + pb::CodedOutputStream.ComputeStringSize(Key); - } if (DataType != 0) { size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) DataType); } @@ -280,9 +259,6 @@ namespace Tango.PMR.DataStore { if (other == null) { return; } - if (other.Key.Length != 0) { - Key = other.Key; - } if (other.DataType != 0) { DataType = other.DataType; } @@ -314,35 +290,31 @@ namespace Tango.PMR.DataStore { default: input.SkipLastField(); break; - case 10: { - Key = input.ReadString(); - break; - } - case 16: { + case 8: { dataType_ = (global::Tango.PMR.DataStore.DataType) input.ReadEnum(); break; } - case 24: { + case 16: { Int32Value = input.ReadInt32(); break; } - case 37: { + case 29: { FloatValue = input.ReadFloat(); break; } - case 41: { + case 33: { DoubleValue = input.ReadDouble(); break; } - case 48: { + case 40: { BooleanValue = input.ReadBool(); break; } - case 58: { + case 50: { StringValue = input.ReadString(); break; } - case 66: { + case 58: { BytesValue = input.ReadBytes(); break; } diff --git a/Software/Visual_Studio/Tango.PMR/DataStore/GetDataStoreItemRequest.cs b/Software/Visual_Studio/Tango.PMR/DataStore/GetDataStoreItemRequest.cs index 6c6d20b72..a4bb5332b 100644 --- a/Software/Visual_Studio/Tango.PMR/DataStore/GetDataStoreItemRequest.cs +++ b/Software/Visual_Studio/Tango.PMR/DataStore/GetDataStoreItemRequest.cs @@ -23,13 +23,15 @@ namespace Tango.PMR.DataStore { byte[] descriptorData = global::System.Convert.FromBase64String( string.Concat( "Ch1HZXREYXRhU3RvcmVJdGVtUmVxdWVzdC5wcm90bxITVGFuZ28uUE1SLkRh", - "dGFTdG9yZSI6ChdHZXREYXRhU3RvcmVJdGVtUmVxdWVzdBISCgpDb2xsZWN0", - "aW9uGAEgASgJEgsKA0tleRgCIAEoCUIfCh1jb20udHdpbmUudGFuZ28ucG1y", - "LmRhdGFzdG9yZWIGcHJvdG8z")); + "dGFTdG9yZRoTRGF0YVN0b3JlSXRlbS5wcm90byJzChdHZXREYXRhU3RvcmVJ", + "dGVtUmVxdWVzdBISCgpDb2xsZWN0aW9uGAEgASgJEgsKA0tleRgCIAEoCRI3", + "CgtEZWZhdWx0SXRlbRgDIAEoCzIiLlRhbmdvLlBNUi5EYXRhU3RvcmUuRGF0", + "YVN0b3JlSXRlbUIfCh1jb20udHdpbmUudGFuZ28ucG1yLmRhdGFzdG9yZWIG", + "cHJvdG8z")); descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData, - new pbr::FileDescriptor[] { }, + new pbr::FileDescriptor[] { global::Tango.PMR.DataStore.DataStoreItemReflection.Descriptor, }, new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] { - new pbr::GeneratedClrTypeInfo(typeof(global::Tango.PMR.DataStore.GetDataStoreItemRequest), global::Tango.PMR.DataStore.GetDataStoreItemRequest.Parser, new[]{ "Collection", "Key" }, null, null, null) + new pbr::GeneratedClrTypeInfo(typeof(global::Tango.PMR.DataStore.GetDataStoreItemRequest), global::Tango.PMR.DataStore.GetDataStoreItemRequest.Parser, new[]{ "Collection", "Key", "DefaultItem" }, null, null, null) })); } #endregion @@ -62,6 +64,7 @@ namespace Tango.PMR.DataStore { public GetDataStoreItemRequest(GetDataStoreItemRequest other) : this() { collection_ = other.collection_; key_ = other.key_; + DefaultItem = other.defaultItem_ != null ? other.DefaultItem.Clone() : null; } [global::System.Diagnostics.DebuggerNonUserCodeAttribute] @@ -91,6 +94,17 @@ namespace Tango.PMR.DataStore { } } + /// Field number for the "DefaultItem" field. + public const int DefaultItemFieldNumber = 3; + private global::Tango.PMR.DataStore.DataStoreItem defaultItem_; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public global::Tango.PMR.DataStore.DataStoreItem DefaultItem { + get { return defaultItem_; } + set { + defaultItem_ = value; + } + } + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] public override bool Equals(object other) { return Equals(other as GetDataStoreItemRequest); @@ -106,6 +120,7 @@ namespace Tango.PMR.DataStore { } if (Collection != other.Collection) return false; if (Key != other.Key) return false; + if (!object.Equals(DefaultItem, other.DefaultItem)) return false; return true; } @@ -114,6 +129,7 @@ namespace Tango.PMR.DataStore { int hash = 1; if (Collection.Length != 0) hash ^= Collection.GetHashCode(); if (Key.Length != 0) hash ^= Key.GetHashCode(); + if (defaultItem_ != null) hash ^= DefaultItem.GetHashCode(); return hash; } @@ -132,6 +148,10 @@ namespace Tango.PMR.DataStore { output.WriteRawTag(18); output.WriteString(Key); } + if (defaultItem_ != null) { + output.WriteRawTag(26); + output.WriteMessage(DefaultItem); + } } [global::System.Diagnostics.DebuggerNonUserCodeAttribute] @@ -143,6 +163,9 @@ namespace Tango.PMR.DataStore { if (Key.Length != 0) { size += 1 + pb::CodedOutputStream.ComputeStringSize(Key); } + if (defaultItem_ != null) { + size += 1 + pb::CodedOutputStream.ComputeMessageSize(DefaultItem); + } return size; } @@ -157,6 +180,12 @@ namespace Tango.PMR.DataStore { if (other.Key.Length != 0) { Key = other.Key; } + if (other.defaultItem_ != null) { + if (defaultItem_ == null) { + defaultItem_ = new global::Tango.PMR.DataStore.DataStoreItem(); + } + DefaultItem.MergeFrom(other.DefaultItem); + } } [global::System.Diagnostics.DebuggerNonUserCodeAttribute] @@ -175,6 +204,13 @@ namespace Tango.PMR.DataStore { Key = input.ReadString(); break; } + case 26: { + if (defaultItem_ == null) { + defaultItem_ = new global::Tango.PMR.DataStore.DataStoreItem(); + } + input.ReadMessage(defaultItem_); + break; + } } } } diff --git a/Software/Visual_Studio/Tango.PMR/DataStore/GetDataStoreItemResponse.cs b/Software/Visual_Studio/Tango.PMR/DataStore/GetDataStoreItemResponse.cs index 892f197d8..a42d22d23 100644 --- a/Software/Visual_Studio/Tango.PMR/DataStore/GetDataStoreItemResponse.cs +++ b/Software/Visual_Studio/Tango.PMR/DataStore/GetDataStoreItemResponse.cs @@ -23,14 +23,14 @@ namespace Tango.PMR.DataStore { byte[] descriptorData = global::System.Convert.FromBase64String( string.Concat( "Ch5HZXREYXRhU3RvcmVJdGVtUmVzcG9uc2UucHJvdG8SE1RhbmdvLlBNUi5E", - "YXRhU3RvcmUaE0RhdGFTdG9yZUl0ZW0ucHJvdG8iTAoYR2V0RGF0YVN0b3Jl", - "SXRlbVJlc3BvbnNlEjAKBEl0ZW0YASABKAsyIi5UYW5nby5QTVIuRGF0YVN0", - "b3JlLkRhdGFTdG9yZUl0ZW1CHwodY29tLnR3aW5lLnRhbmdvLnBtci5kYXRh", - "c3RvcmViBnByb3RvMw==")); + "YXRhU3RvcmUaE0RhdGFTdG9yZUl0ZW0ucHJvdG8iWQoYR2V0RGF0YVN0b3Jl", + "SXRlbVJlc3BvbnNlEgsKA0tleRgBIAEoCRIwCgRJdGVtGAIgASgLMiIuVGFu", + "Z28uUE1SLkRhdGFTdG9yZS5EYXRhU3RvcmVJdGVtQh8KHWNvbS50d2luZS50", + "YW5nby5wbXIuZGF0YXN0b3JlYgZwcm90bzM=")); descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData, new pbr::FileDescriptor[] { global::Tango.PMR.DataStore.DataStoreItemReflection.Descriptor, }, new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] { - new pbr::GeneratedClrTypeInfo(typeof(global::Tango.PMR.DataStore.GetDataStoreItemResponse), global::Tango.PMR.DataStore.GetDataStoreItemResponse.Parser, new[]{ "Item" }, null, null, null) + new pbr::GeneratedClrTypeInfo(typeof(global::Tango.PMR.DataStore.GetDataStoreItemResponse), global::Tango.PMR.DataStore.GetDataStoreItemResponse.Parser, new[]{ "Key", "Item" }, null, null, null) })); } #endregion @@ -61,6 +61,7 @@ namespace Tango.PMR.DataStore { [global::System.Diagnostics.DebuggerNonUserCodeAttribute] public GetDataStoreItemResponse(GetDataStoreItemResponse other) : this() { + key_ = other.key_; Item = other.item_ != null ? other.Item.Clone() : null; } @@ -69,8 +70,19 @@ namespace Tango.PMR.DataStore { return new GetDataStoreItemResponse(this); } + /// Field number for the "Key" field. + public const int KeyFieldNumber = 1; + private string key_ = ""; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public string Key { + get { return key_; } + set { + key_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); + } + } + /// Field number for the "Item" field. - public const int ItemFieldNumber = 1; + public const int ItemFieldNumber = 2; private global::Tango.PMR.DataStore.DataStoreItem item_; [global::System.Diagnostics.DebuggerNonUserCodeAttribute] public global::Tango.PMR.DataStore.DataStoreItem Item { @@ -93,6 +105,7 @@ namespace Tango.PMR.DataStore { if (ReferenceEquals(other, this)) { return true; } + if (Key != other.Key) return false; if (!object.Equals(Item, other.Item)) return false; return true; } @@ -100,6 +113,7 @@ namespace Tango.PMR.DataStore { [global::System.Diagnostics.DebuggerNonUserCodeAttribute] public override int GetHashCode() { int hash = 1; + if (Key.Length != 0) hash ^= Key.GetHashCode(); if (item_ != null) hash ^= Item.GetHashCode(); return hash; } @@ -111,8 +125,12 @@ namespace Tango.PMR.DataStore { [global::System.Diagnostics.DebuggerNonUserCodeAttribute] public void WriteTo(pb::CodedOutputStream output) { - if (item_ != null) { + if (Key.Length != 0) { output.WriteRawTag(10); + output.WriteString(Key); + } + if (item_ != null) { + output.WriteRawTag(18); output.WriteMessage(Item); } } @@ -120,6 +138,9 @@ namespace Tango.PMR.DataStore { [global::System.Diagnostics.DebuggerNonUserCodeAttribute] public int CalculateSize() { int size = 0; + if (Key.Length != 0) { + size += 1 + pb::CodedOutputStream.ComputeStringSize(Key); + } if (item_ != null) { size += 1 + pb::CodedOutputStream.ComputeMessageSize(Item); } @@ -131,6 +152,9 @@ namespace Tango.PMR.DataStore { if (other == null) { return; } + if (other.Key.Length != 0) { + Key = other.Key; + } if (other.item_ != null) { if (item_ == null) { item_ = new global::Tango.PMR.DataStore.DataStoreItem(); @@ -148,6 +172,10 @@ namespace Tango.PMR.DataStore { input.SkipLastField(); break; case 10: { + Key = input.ReadString(); + break; + } + case 18: { if (item_ == null) { item_ = new global::Tango.PMR.DataStore.DataStoreItem(); } diff --git a/Software/Visual_Studio/Tango.PMR/DataStore/PutDataStoreItemRequest.cs b/Software/Visual_Studio/Tango.PMR/DataStore/PutDataStoreItemRequest.cs index 7281b4c9c..9e9be6768 100644 --- a/Software/Visual_Studio/Tango.PMR/DataStore/PutDataStoreItemRequest.cs +++ b/Software/Visual_Studio/Tango.PMR/DataStore/PutDataStoreItemRequest.cs @@ -23,14 +23,14 @@ namespace Tango.PMR.DataStore { byte[] descriptorData = global::System.Convert.FromBase64String( string.Concat( "Ch1QdXREYXRhU3RvcmVJdGVtUmVxdWVzdC5wcm90bxITVGFuZ28uUE1SLkRh", - "dGFTdG9yZRoTRGF0YVN0b3JlSXRlbS5wcm90byJfChdQdXREYXRhU3RvcmVJ", - "dGVtUmVxdWVzdBISCgpDb2xsZWN0aW9uGAEgASgJEjAKBEl0ZW0YAiABKAsy", - "Ii5UYW5nby5QTVIuRGF0YVN0b3JlLkRhdGFTdG9yZUl0ZW1CHwodY29tLnR3", - "aW5lLnRhbmdvLnBtci5kYXRhc3RvcmViBnByb3RvMw==")); + "dGFTdG9yZRoTRGF0YVN0b3JlSXRlbS5wcm90byJsChdQdXREYXRhU3RvcmVJ", + "dGVtUmVxdWVzdBISCgpDb2xsZWN0aW9uGAEgASgJEgsKA0tleRgCIAEoCRIw", + "CgRJdGVtGAMgASgLMiIuVGFuZ28uUE1SLkRhdGFTdG9yZS5EYXRhU3RvcmVJ", + "dGVtQh8KHWNvbS50d2luZS50YW5nby5wbXIuZGF0YXN0b3JlYgZwcm90bzM=")); descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData, new pbr::FileDescriptor[] { global::Tango.PMR.DataStore.DataStoreItemReflection.Descriptor, }, new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] { - new pbr::GeneratedClrTypeInfo(typeof(global::Tango.PMR.DataStore.PutDataStoreItemRequest), global::Tango.PMR.DataStore.PutDataStoreItemRequest.Parser, new[]{ "Collection", "Item" }, null, null, null) + new pbr::GeneratedClrTypeInfo(typeof(global::Tango.PMR.DataStore.PutDataStoreItemRequest), global::Tango.PMR.DataStore.PutDataStoreItemRequest.Parser, new[]{ "Collection", "Key", "Item" }, null, null, null) })); } #endregion @@ -62,6 +62,7 @@ namespace Tango.PMR.DataStore { [global::System.Diagnostics.DebuggerNonUserCodeAttribute] public PutDataStoreItemRequest(PutDataStoreItemRequest other) : this() { collection_ = other.collection_; + key_ = other.key_; Item = other.item_ != null ? other.Item.Clone() : null; } @@ -81,8 +82,19 @@ namespace Tango.PMR.DataStore { } } + /// Field number for the "Key" field. + public const int KeyFieldNumber = 2; + private string key_ = ""; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public string Key { + get { return key_; } + set { + key_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); + } + } + /// Field number for the "Item" field. - public const int ItemFieldNumber = 2; + public const int ItemFieldNumber = 3; private global::Tango.PMR.DataStore.DataStoreItem item_; [global::System.Diagnostics.DebuggerNonUserCodeAttribute] public global::Tango.PMR.DataStore.DataStoreItem Item { @@ -106,6 +118,7 @@ namespace Tango.PMR.DataStore { return true; } if (Collection != other.Collection) return false; + if (Key != other.Key) return false; if (!object.Equals(Item, other.Item)) return false; return true; } @@ -114,6 +127,7 @@ namespace Tango.PMR.DataStore { public override int GetHashCode() { int hash = 1; if (Collection.Length != 0) hash ^= Collection.GetHashCode(); + if (Key.Length != 0) hash ^= Key.GetHashCode(); if (item_ != null) hash ^= Item.GetHashCode(); return hash; } @@ -129,8 +143,12 @@ namespace Tango.PMR.DataStore { output.WriteRawTag(10); output.WriteString(Collection); } - if (item_ != null) { + if (Key.Length != 0) { output.WriteRawTag(18); + output.WriteString(Key); + } + if (item_ != null) { + output.WriteRawTag(26); output.WriteMessage(Item); } } @@ -141,6 +159,9 @@ namespace Tango.PMR.DataStore { if (Collection.Length != 0) { size += 1 + pb::CodedOutputStream.ComputeStringSize(Collection); } + if (Key.Length != 0) { + size += 1 + pb::CodedOutputStream.ComputeStringSize(Key); + } if (item_ != null) { size += 1 + pb::CodedOutputStream.ComputeMessageSize(Item); } @@ -155,6 +176,9 @@ namespace Tango.PMR.DataStore { if (other.Collection.Length != 0) { Collection = other.Collection; } + if (other.Key.Length != 0) { + Key = other.Key; + } if (other.item_ != null) { if (item_ == null) { item_ = new global::Tango.PMR.DataStore.DataStoreItem(); @@ -176,6 +200,10 @@ namespace Tango.PMR.DataStore { break; } case 18: { + Key = input.ReadString(); + break; + } + case 26: { if (item_ == null) { item_ = new global::Tango.PMR.DataStore.DataStoreItem(); } diff --git a/Software/Visual_Studio/Tango.PMR/Tango.PMR.csproj b/Software/Visual_Studio/Tango.PMR/Tango.PMR.csproj index adc8bbc21..7b3a7c397 100644 --- a/Software/Visual_Studio/Tango.PMR/Tango.PMR.csproj +++ b/Software/Visual_Studio/Tango.PMR/Tango.PMR.csproj @@ -482,7 +482,7 @@ - + \ No newline at end of file -- cgit v1.3.1 From 2d803e9410cd383d8e66c300f86fe0f7374c81ea Mon Sep 17 00:00:00 2001 From: Roy Ben Shabat Date: Fri, 23 Oct 2020 03:58:38 +0300 Subject: Improvements to DataStore Remote. --- .../Tango.FSE.Procedures/ProcedureProject.cs | 1 + .../Tango.FSE.Procedures.csproj | 4 +++ .../DataStore/RemoteDataStoreCollection.cs | 2 +- .../DataStore/DefaultDataStoreService.cs | 14 +++++++++-- .../Tango.DataStore.EF/EFDataStoreItem.cs | 2 +- .../Tango.DataStore.LiteDB/LiteDBDataStoreItem.cs | 2 +- .../RemoteDataStoreGetAllResponse.cs | 4 +-- .../RemoteDataStoreGetItemResponse.cs | 2 +- .../Tango.DataStore.Remote/RemoteDataStoreItem.cs | 29 ++++++++++++++++++++++ .../Tango.DataStore.Remote.csproj | 1 + .../Tango.DataStore/DataStoreHelper.cs | 24 ++++++++++++++++++ .../Tango.DataStore/Tango.DataStore.csproj | 2 ++ 12 files changed, 79 insertions(+), 8 deletions(-) create mode 100644 Software/Visual_Studio/Tango.DataStore.Remote/RemoteDataStoreItem.cs (limited to 'Software/Visual_Studio/Tango.DataStore.Remote') diff --git a/Software/Visual_Studio/FSE/Modules/Tango.FSE.Procedures/ProcedureProject.cs b/Software/Visual_Studio/FSE/Modules/Tango.FSE.Procedures/ProcedureProject.cs index 168d1498b..03d99da1d 100644 --- a/Software/Visual_Studio/FSE/Modules/Tango.FSE.Procedures/ProcedureProject.cs +++ b/Software/Visual_Studio/FSE/Modules/Tango.FSE.Procedures/ProcedureProject.cs @@ -67,6 +67,7 @@ namespace Tango.FSE.Procedures project.ReferenceAssemblies.Add(ReferenceAssembly.FromType(typeof(IMachineOperator))); project.ReferenceAssemblies.Add(ReferenceAssembly.FromType(typeof(IMessage))); project.ReferenceAssemblies.Add(ReferenceAssembly.FromType(typeof(System.Drawing.Point))); + project.ReferenceAssemblies.Add(ReferenceAssembly.FromType(typeof(Tango.DataStore.IDataStoreItem))); return project; } diff --git a/Software/Visual_Studio/FSE/Modules/Tango.FSE.Procedures/Tango.FSE.Procedures.csproj b/Software/Visual_Studio/FSE/Modules/Tango.FSE.Procedures/Tango.FSE.Procedures.csproj index b7e4b238c..2e7099857 100644 --- a/Software/Visual_Studio/FSE/Modules/Tango.FSE.Procedures/Tango.FSE.Procedures.csproj +++ b/Software/Visual_Studio/FSE/Modules/Tango.FSE.Procedures/Tango.FSE.Procedures.csproj @@ -284,6 +284,10 @@ {58e8825f-0c96-449c-b320-1e82b0aa876b} Tango.CSV + + {e0364dfa-0721-4637-9d32-9d22aac109d6} + Tango.DataStore + {c6ebbbbe-2123-44dc-aef7-a0d47d736ac0} Tango.FileSystem diff --git a/Software/Visual_Studio/FSE/Tango.FSE.UI/DataStore/RemoteDataStoreCollection.cs b/Software/Visual_Studio/FSE/Tango.FSE.UI/DataStore/RemoteDataStoreCollection.cs index cb49c667d..0ff387e85 100644 --- a/Software/Visual_Studio/FSE/Tango.FSE.UI/DataStore/RemoteDataStoreCollection.cs +++ b/Software/Visual_Studio/FSE/Tango.FSE.UI/DataStore/RemoteDataStoreCollection.cs @@ -76,7 +76,7 @@ namespace Tango.FSE.UI.DataStore Collection = Name }).Result; - return result.Items; + return result.Items.Cast().ToList(); } public void Delete(string key) diff --git a/Software/Visual_Studio/PPC/Tango.PPC.Common/DataStore/DefaultDataStoreService.cs b/Software/Visual_Studio/PPC/Tango.PPC.Common/DataStore/DefaultDataStoreService.cs index e6da8e8e7..f11d37659 100644 --- a/Software/Visual_Studio/PPC/Tango.PPC.Common/DataStore/DefaultDataStoreService.cs +++ b/Software/Visual_Studio/PPC/Tango.PPC.Common/DataStore/DefaultDataStoreService.cs @@ -15,6 +15,7 @@ using Tango.PMR.DataStore; using Tango.PPC.Common.Connection; using Tango.PPC.Common.ExternalBridge; using Tango.Transport; +using Tango.Core.ExtensionMethods; namespace Tango.PPC.Common.DataStore { @@ -71,7 +72,7 @@ namespace Tango.PPC.Common.DataStore var item = GetManager().GetCollection(request.Collection).GetItem(request.Key, request.DefaultValue); await receiver.SendGenericResponse(new RemoteDataStoreGetItemResponse() { - Item = item + Item = CreateRemoteItem(item) }, token); } @@ -105,7 +106,7 @@ namespace Tango.PPC.Common.DataStore var all = GetManager().GetCollection(request.Collection).GetAll(); await receiver.SendGenericResponse(new RemoteDataStoreGetAllResponse() { - Items = all + Items = all.Select(x => CreateRemoteItem(x)).ToList() }, token); } @@ -119,6 +120,15 @@ namespace Tango.PPC.Common.DataStore }, token); } + private RemoteDataStoreItem CreateRemoteItem(IDataStoreItem item) + { + RemoteDataStoreItem remote = new RemoteDataStoreItem(); + + item.MapPropertiesTo(remote, MappingFlags.All); + + return remote; + } + #endregion #region Proto Handlers diff --git a/Software/Visual_Studio/Tango.DataStore.EF/EFDataStoreItem.cs b/Software/Visual_Studio/Tango.DataStore.EF/EFDataStoreItem.cs index 45061c7ef..6bcb97d17 100644 --- a/Software/Visual_Studio/Tango.DataStore.EF/EFDataStoreItem.cs +++ b/Software/Visual_Studio/Tango.DataStore.EF/EFDataStoreItem.cs @@ -22,7 +22,7 @@ namespace Tango.DataStore.EF public override string ToString() { - return $"{Key}: {Value}"; + return DataStoreHelper.FormatDataStoreItem(this); } } } diff --git a/Software/Visual_Studio/Tango.DataStore.LiteDB/LiteDBDataStoreItem.cs b/Software/Visual_Studio/Tango.DataStore.LiteDB/LiteDBDataStoreItem.cs index 544a15b61..ba2e5748e 100644 --- a/Software/Visual_Studio/Tango.DataStore.LiteDB/LiteDBDataStoreItem.cs +++ b/Software/Visual_Studio/Tango.DataStore.LiteDB/LiteDBDataStoreItem.cs @@ -24,7 +24,7 @@ namespace Tango.DataStore.Lite public override string ToString() { - return $"{Key}: {Value}"; + return DataStoreHelper.FormatDataStoreItem(this); } } } diff --git a/Software/Visual_Studio/Tango.DataStore.Remote/RemoteDataStoreGetAllResponse.cs b/Software/Visual_Studio/Tango.DataStore.Remote/RemoteDataStoreGetAllResponse.cs index 98848924c..2d9e0f527 100644 --- a/Software/Visual_Studio/Tango.DataStore.Remote/RemoteDataStoreGetAllResponse.cs +++ b/Software/Visual_Studio/Tango.DataStore.Remote/RemoteDataStoreGetAllResponse.cs @@ -8,11 +8,11 @@ namespace Tango.DataStore.Remote { public class RemoteDataStoreGetAllResponse { - public List Items { get; set; } + public List Items { get; set; } public RemoteDataStoreGetAllResponse() { - Items = new List(); + Items = new List(); } } } diff --git a/Software/Visual_Studio/Tango.DataStore.Remote/RemoteDataStoreGetItemResponse.cs b/Software/Visual_Studio/Tango.DataStore.Remote/RemoteDataStoreGetItemResponse.cs index ebd19eb4f..82393a786 100644 --- a/Software/Visual_Studio/Tango.DataStore.Remote/RemoteDataStoreGetItemResponse.cs +++ b/Software/Visual_Studio/Tango.DataStore.Remote/RemoteDataStoreGetItemResponse.cs @@ -8,6 +8,6 @@ namespace Tango.DataStore.Remote { public class RemoteDataStoreGetItemResponse { - public IDataStoreItem Item { get; set; } + public RemoteDataStoreItem Item { get; set; } } } diff --git a/Software/Visual_Studio/Tango.DataStore.Remote/RemoteDataStoreItem.cs b/Software/Visual_Studio/Tango.DataStore.Remote/RemoteDataStoreItem.cs new file mode 100644 index 000000000..c58e3ab28 --- /dev/null +++ b/Software/Visual_Studio/Tango.DataStore.Remote/RemoteDataStoreItem.cs @@ -0,0 +1,29 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Tango.DataStore.Remote +{ + public class RemoteDataStoreItem : IDataStoreItem + { + public string Guid { get; set; } + public string Key { get; set; } + public DataType Type { get; set; } + public object Value { get; set; } + public DateTime Date { get; set; } + public bool IsSynchronized { get; set; } + + public RemoteDataStoreItem() + { + Guid = System.Guid.NewGuid().ToString(); + Date = DateTime.UtcNow; + } + + public override string ToString() + { + return DataStoreHelper.FormatDataStoreItem(this); + } + } +} diff --git a/Software/Visual_Studio/Tango.DataStore.Remote/Tango.DataStore.Remote.csproj b/Software/Visual_Studio/Tango.DataStore.Remote/Tango.DataStore.Remote.csproj index b60d91d71..87a9c4766 100644 --- a/Software/Visual_Studio/Tango.DataStore.Remote/Tango.DataStore.Remote.csproj +++ b/Software/Visual_Studio/Tango.DataStore.Remote/Tango.DataStore.Remote.csproj @@ -58,6 +58,7 @@ + diff --git a/Software/Visual_Studio/Tango.DataStore/DataStoreHelper.cs b/Software/Visual_Studio/Tango.DataStore/DataStoreHelper.cs index bf78bc35e..53745990e 100644 --- a/Software/Visual_Studio/Tango.DataStore/DataStoreHelper.cs +++ b/Software/Visual_Studio/Tango.DataStore/DataStoreHelper.cs @@ -83,5 +83,29 @@ namespace Tango.DataStore throw new NotSupportedException("The specified data type is not supported."); } + + /// + /// Formats the data store item as a string. + /// + /// The item. + /// + public static String FormatDataStoreItem(IDataStoreItem item) + { + if (item.Type != DataType.Bytes) + { + return $"{item.Key}: {item.Value}"; + } + else + { + byte[] bytes = (byte[])item.Value; + + StringBuilder hex = new StringBuilder(); + foreach (byte b in bytes) + { + hex.AppendFormat("{0:x2} ", b); + } + return hex.ToString(); + } + } } } diff --git a/Software/Visual_Studio/Tango.DataStore/Tango.DataStore.csproj b/Software/Visual_Studio/Tango.DataStore/Tango.DataStore.csproj index 2411e3b45..37c0ecfc2 100644 --- a/Software/Visual_Studio/Tango.DataStore/Tango.DataStore.csproj +++ b/Software/Visual_Studio/Tango.DataStore/Tango.DataStore.csproj @@ -21,6 +21,7 @@ DEBUG;TRACE prompt 4 + bin\Debug\Tango.DataStore.xml pdbonly @@ -29,6 +30,7 @@ TRACE prompt 4 + bin\Release\Tango.DataStore.xml -- cgit v1.3.1 From adaddad79352c156303e9178a6f172a18af50cd2 Mon Sep 17 00:00:00 2001 From: Roy Ben Shabat Date: Sat, 24 Oct 2020 06:40:07 +0300 Subject: Refactored DataStore Proto. --- .../PMR/Messages/DataStore/DataStoreItem.proto | 4 ++ Software/PMR/Messages/DataStore/DataType.proto | 1 + .../DataStore/RemoteDataStoreCollection.cs | 27 +++++++- .../DataStore/DefaultDataStoreService.cs | 14 ++++- .../Tango.Core/Bson/BsonUtcSerializer.cs | 44 +++++++++++++- .../Tango.DataStore.EF/EFDataStoreHelper.cs | 14 ++++- .../Tango.DataStore.EF/Tango.DataStore.EF.csproj | 7 +++ .../Tango.DataStore.EF/packages.config | 1 + .../RemoteDataStoreGetResponse.cs | 24 +++++++- .../Tango.DataStore.Remote/RemoteDataStoreItem.cs | 22 ++++++- .../RemoteDataStorePutRequest.cs | 23 ++++++- .../Tango.DataStore.Remote.csproj | 10 +++ .../Tango.DataStore.Remote/packages.config | 5 ++ .../Tango.DataStore/DataStoreHelper.cs | 70 +++++++++++++-------- .../Tango.DataStore/DataStoreProtoObject.cs | 71 ++++++++++++++++++++++ Software/Visual_Studio/Tango.DataStore/DataType.cs | 3 +- .../Tango.DataStore/Tango.DataStore.csproj | 21 +++++++ .../Visual_Studio/Tango.DataStore/packages.config | 5 ++ .../Tango.Emulations/Emulators/MachineEmulator.cs | 42 +++++++++++++ .../Tango.PMR/DataStore/DataStoreItem.cs | 48 ++++++++++++--- .../Visual_Studio/Tango.PMR/DataStore/DataType.cs | 7 ++- Software/Visual_Studio/Tango.PMR/MessageFactory.cs | 32 ++++++++++ .../Tango.UnitTesting/DataStore/DataStore_TST.cs | 34 ++++++++++- .../Tango.UnitTesting/Tango.UnitTesting.csproj | 6 +- 24 files changed, 484 insertions(+), 51 deletions(-) create mode 100644 Software/Visual_Studio/Tango.DataStore.Remote/packages.config create mode 100644 Software/Visual_Studio/Tango.DataStore/DataStoreProtoObject.cs create mode 100644 Software/Visual_Studio/Tango.DataStore/packages.config (limited to 'Software/Visual_Studio/Tango.DataStore.Remote') diff --git a/Software/PMR/Messages/DataStore/DataStoreItem.proto b/Software/PMR/Messages/DataStore/DataStoreItem.proto index f516fa92c..d4b329799 100644 --- a/Software/PMR/Messages/DataStore/DataStoreItem.proto +++ b/Software/PMR/Messages/DataStore/DataStoreItem.proto @@ -1,6 +1,7 @@ syntax = "proto3"; import "DataType.proto"; +import "MessageType.proto"; package Tango.PMR.DataStore; option java_package = "com.twine.tango.pmr.datastore"; @@ -14,4 +15,7 @@ message DataStoreItem bool BooleanValue = 5; string StringValue = 6; bytes BytesValue = 7; + + //Use only when DataType = Proto. + PMR.Common.MessageType ProtoType = 20; } \ No newline at end of file diff --git a/Software/PMR/Messages/DataStore/DataType.proto b/Software/PMR/Messages/DataStore/DataType.proto index 17f9403ec..3c6ae0e05 100644 --- a/Software/PMR/Messages/DataStore/DataType.proto +++ b/Software/PMR/Messages/DataStore/DataType.proto @@ -13,4 +13,5 @@ enum DataType Boolean = 3; String = 4; Bytes = 5; + Proto = 6; } \ No newline at end of file diff --git a/Software/Visual_Studio/FSE/Tango.FSE.UI/DataStore/RemoteDataStoreCollection.cs b/Software/Visual_Studio/FSE/Tango.FSE.UI/DataStore/RemoteDataStoreCollection.cs index 0ff387e85..4cf64a688 100644 --- a/Software/Visual_Studio/FSE/Tango.FSE.UI/DataStore/RemoteDataStoreCollection.cs +++ b/Software/Visual_Studio/FSE/Tango.FSE.UI/DataStore/RemoteDataStoreCollection.cs @@ -1,4 +1,5 @@ -using System; +using Google.Protobuf; +using System; using System.Collections.Generic; using System.Linq; using System.Text; @@ -33,6 +34,18 @@ namespace Tango.FSE.UI.DataStore public void Put(string key, DataType type, object value) { + if (type == DataType.Proto) + { + if (value is IMessage protoMessage) + { + value = DataStoreProtoObject.FromMessage(protoMessage); + } + else + { + throw new InvalidOperationException("DataType if Proto but actual message is not part of the PMR."); + } + } + var result = _machineProvider.MachineOperator.SendGenericRequest(new RemoteDataStorePutRequest() { Collection = Name, @@ -59,13 +72,23 @@ namespace Tango.FSE.UI.DataStore public object Get(string key, object defaultValue) { + if (defaultValue is IMessage defaultValueMessage) + { + defaultValue = DataStoreProtoObject.FromMessage(defaultValueMessage); + } + var result = _machineProvider.MachineOperator.SendGenericRequest(new RemoteDataStoreGetRequest() { Collection = Name, Key = key, - DefaultValue = defaultValue + DefaultValue = defaultValue, }).Result; + if (result.DataType == DataType.Proto) + { + return result.ProtoObject.Message; + } + return result.Value; } diff --git a/Software/Visual_Studio/PPC/Tango.PPC.Common/DataStore/DefaultDataStoreService.cs b/Software/Visual_Studio/PPC/Tango.PPC.Common/DataStore/DefaultDataStoreService.cs index f11d37659..bf0eadae1 100644 --- a/Software/Visual_Studio/PPC/Tango.PPC.Common/DataStore/DefaultDataStoreService.cs +++ b/Software/Visual_Studio/PPC/Tango.PPC.Common/DataStore/DefaultDataStoreService.cs @@ -52,17 +52,18 @@ namespace Tango.PPC.Common.DataStore [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); + GetManager().GetCollection(request.Collection).Put(request.Key, 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, request.DefaultValue); + var item = GetManager().GetCollection(request.Collection).GetItem(request.Key, request.DefaultValue); await receiver.SendGenericResponse(new RemoteDataStoreGetResponse() { - Value = value + DataType = item.Type, + Value = item.Value, }, token); } @@ -227,6 +228,11 @@ namespace Tango.PPC.Common.DataStore case Tango.DataStore.DataType.Bytes: pmr.BytesValue = Google.Protobuf.ByteString.CopyFrom((byte[])Convert.ChangeType(item.Value, typeof(byte[]))); break; + case Tango.DataStore.DataType.Proto: + DataStoreProtoObject proto = item.Value as DataStoreProtoObject; + pmr.BytesValue = Google.Protobuf.ByteString.CopyFrom(proto.Data); + pmr.ProtoType = proto.MessageType; + break; } return pmr; @@ -250,6 +256,8 @@ namespace Tango.PPC.Common.DataStore return item.StringValue; case PMR.DataStore.DataType.Bytes: return item.BytesValue.ToByteArray(); + case PMR.DataStore.DataType.Proto: + return DataStoreProtoObject.FromPMRDataStoreItem(item); } throw new NotSupportedException("The specified data type if not supported."); diff --git a/Software/Visual_Studio/Tango.Core/Bson/BsonUtcSerializer.cs b/Software/Visual_Studio/Tango.Core/Bson/BsonUtcSerializer.cs index 6f5cb7700..7621bd132 100644 --- a/Software/Visual_Studio/Tango.Core/Bson/BsonUtcSerializer.cs +++ b/Software/Visual_Studio/Tango.Core/Bson/BsonUtcSerializer.cs @@ -1,14 +1,56 @@ using Newtonsoft.Json; +using Newtonsoft.Json.Bson; using Newtonsoft.Json.Serialization; using System; using System.Collections.Generic; using System.Globalization; +using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Tango.Core.Bson { + public static class BsonConvert + { + private static BsonUtcSerializer _serializer; + + static BsonConvert() + { + _serializer = new BsonUtcSerializer(); + } + + public static byte[] Serialize(Object obj) + { + MemoryStream ms = new MemoryStream(); + using (BsonWriter writer = new BsonWriter(ms)) + { + _serializer.Serialize(writer, obj); + return ms.ToArray(); + } + } + + public static byte[] Serialize(T obj) + { + return Serialize((Object)obj); + } + + public static Object Deserialize(byte[] data, Type type) + { + MemoryStream ms = new MemoryStream(data); + using (BsonReader reader = new BsonReader(ms)) + { + Object obj = _serializer.Deserialize(reader, type); + return obj; + } + } + + public static T Deserialize(byte[] data) + { + return (T)Deserialize(data, typeof(T)); + } + } + public class BsonUtcSerializer : JsonSerializer { private class DateTimeConverter : JsonConverter @@ -65,4 +107,4 @@ namespace Tango.Core.Bson DateTimeZoneHandling = DateTimeZoneHandling.RoundtripKind; } } -} +} \ No newline at end of file diff --git a/Software/Visual_Studio/Tango.DataStore.EF/EFDataStoreHelper.cs b/Software/Visual_Studio/Tango.DataStore.EF/EFDataStoreHelper.cs index c51c54b7c..0fbb0d4fe 100644 --- a/Software/Visual_Studio/Tango.DataStore.EF/EFDataStoreHelper.cs +++ b/Software/Visual_Studio/Tango.DataStore.EF/EFDataStoreHelper.cs @@ -1,4 +1,5 @@ -using System; +using Google.Protobuf; +using System; using System.Collections.Generic; using System.Linq; using System.Text; @@ -25,6 +26,15 @@ namespace Tango.DataStore.EF return Encoding.Default.GetBytes(obj.ToString()); case DataType.Bytes: return (byte[])obj; + case DataType.Proto: + if (obj is DataStoreProtoObject protoMessage) + { + return protoMessage.ToBytes(); + } + else + { + throw new NotSupportedException($"Data type is 'Proto' but object is not of type '{nameof(DataStoreProtoObject)}'."); + } } throw new NotSupportedException("The specified type is not supported."); @@ -46,6 +56,8 @@ namespace Tango.DataStore.EF return Encoding.Default.GetString(bytes); case DataType.Bytes: return bytes; + case DataType.Proto: + return DataStoreProtoObject.FromBytes(bytes); } throw new NotSupportedException("The specified type is not supported."); diff --git a/Software/Visual_Studio/Tango.DataStore.EF/Tango.DataStore.EF.csproj b/Software/Visual_Studio/Tango.DataStore.EF/Tango.DataStore.EF.csproj index 53e288584..96ecb5ad1 100644 --- a/Software/Visual_Studio/Tango.DataStore.EF/Tango.DataStore.EF.csproj +++ b/Software/Visual_Studio/Tango.DataStore.EF/Tango.DataStore.EF.csproj @@ -37,6 +37,9 @@ ..\packages\EntityFramework.6.2.0\lib\net45\EntityFramework.SqlServer.dll + + ..\packages\Google.Protobuf.3.4.1\lib\net45\Google.Protobuf.dll + ..\packages\Newtonsoft.Json.9.0.1\lib\net45\Newtonsoft.Json.dll @@ -77,6 +80,10 @@ {e0364dfa-0721-4637-9d32-9d22aac109d6} Tango.DataStore + + {e4927038-348d-4295-aaf4-861c58cb3943} + Tango.PMR + \ No newline at end of file diff --git a/Software/Visual_Studio/Tango.DataStore.EF/packages.config b/Software/Visual_Studio/Tango.DataStore.EF/packages.config index 1127d4e32..13be55da1 100644 --- a/Software/Visual_Studio/Tango.DataStore.EF/packages.config +++ b/Software/Visual_Studio/Tango.DataStore.EF/packages.config @@ -1,5 +1,6 @@  + \ No newline at end of file diff --git a/Software/Visual_Studio/Tango.DataStore.Remote/RemoteDataStoreGetResponse.cs b/Software/Visual_Studio/Tango.DataStore.Remote/RemoteDataStoreGetResponse.cs index a3c5eb99c..cc3b157e8 100644 --- a/Software/Visual_Studio/Tango.DataStore.Remote/RemoteDataStoreGetResponse.cs +++ b/Software/Visual_Studio/Tango.DataStore.Remote/RemoteDataStoreGetResponse.cs @@ -8,6 +8,28 @@ namespace Tango.DataStore.Remote { public class RemoteDataStoreGetResponse { - public Object Value { get; set; } + public DataType DataType { get; set; } + + private Object _value; + public Object Value + { + get + { + return DataType == DataType.Proto ? ProtoObject : _value; + } + set + { + if (value is DataStoreProtoObject protoValue) + { + ProtoObject = protoValue; + } + else + { + _value = value; + } + } + } + + public DataStoreProtoObject ProtoObject { get; set; } } } diff --git a/Software/Visual_Studio/Tango.DataStore.Remote/RemoteDataStoreItem.cs b/Software/Visual_Studio/Tango.DataStore.Remote/RemoteDataStoreItem.cs index c58e3ab28..4327a0bd6 100644 --- a/Software/Visual_Studio/Tango.DataStore.Remote/RemoteDataStoreItem.cs +++ b/Software/Visual_Studio/Tango.DataStore.Remote/RemoteDataStoreItem.cs @@ -1,4 +1,5 @@ -using System; +using Newtonsoft.Json.Linq; +using System; using System.Collections.Generic; using System.Linq; using System.Text; @@ -11,7 +12,24 @@ namespace Tango.DataStore.Remote public string Guid { get; set; } public string Key { get; set; } public DataType Type { get; set; } - public object Value { get; set; } + + private object _value; + public object Value + { + get + { + if (_value is JObject jObject) + { + return (jObject.ToObject()); + } + else + { + return _value; + } + } + set { _value = value; } + } + public DateTime Date { get; set; } public bool IsSynchronized { get; set; } diff --git a/Software/Visual_Studio/Tango.DataStore.Remote/RemoteDataStorePutRequest.cs b/Software/Visual_Studio/Tango.DataStore.Remote/RemoteDataStorePutRequest.cs index 6ea13bf6b..77aa5e41f 100644 --- a/Software/Visual_Studio/Tango.DataStore.Remote/RemoteDataStorePutRequest.cs +++ b/Software/Visual_Studio/Tango.DataStore.Remote/RemoteDataStorePutRequest.cs @@ -11,6 +11,27 @@ namespace Tango.DataStore.Remote public String Collection { get; set; } public DataType DataType { get; set; } public String Key { get; set; } - public Object Value { get; set; } + + private Object _value; + public Object Value + { + get + { + return DataType == DataType.Proto ? ProtoObject : _value; + } + set + { + if (value is DataStoreProtoObject protoValue) + { + ProtoObject = protoValue; + } + else + { + _value = value; + } + } + } + + public DataStoreProtoObject ProtoObject { get; set; } } } diff --git a/Software/Visual_Studio/Tango.DataStore.Remote/Tango.DataStore.Remote.csproj b/Software/Visual_Studio/Tango.DataStore.Remote/Tango.DataStore.Remote.csproj index 87a9c4766..2b05d6af3 100644 --- a/Software/Visual_Studio/Tango.DataStore.Remote/Tango.DataStore.Remote.csproj +++ b/Software/Visual_Studio/Tango.DataStore.Remote/Tango.DataStore.Remote.csproj @@ -31,6 +31,12 @@ 4 + + ..\packages\Google.Protobuf.3.4.1\lib\net45\Google.Protobuf.dll + + + ..\packages\Newtonsoft.Json.9.0.1\lib\net45\Newtonsoft.Json.dll + @@ -69,5 +75,9 @@ Tango.DataStore + + + + \ No newline at end of file diff --git a/Software/Visual_Studio/Tango.DataStore.Remote/packages.config b/Software/Visual_Studio/Tango.DataStore.Remote/packages.config new file mode 100644 index 000000000..026e719c3 --- /dev/null +++ b/Software/Visual_Studio/Tango.DataStore.Remote/packages.config @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/Software/Visual_Studio/Tango.DataStore/DataStoreHelper.cs b/Software/Visual_Studio/Tango.DataStore/DataStoreHelper.cs index 53745990e..3cf24bdd0 100644 --- a/Software/Visual_Studio/Tango.DataStore/DataStoreHelper.cs +++ b/Software/Visual_Studio/Tango.DataStore/DataStoreHelper.cs @@ -1,8 +1,14 @@ -using System; +using Google.Protobuf; +using Newtonsoft.Json.Linq; +using System; using System.Collections.Generic; +using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; +using Tango.Core.ExtensionMethods; +using Tango.PMR; +using Tango.PMR.Common; namespace Tango.DataStore { @@ -53,6 +59,14 @@ namespace Tango.DataStore { return DataType.Bytes; } + else if (type == typeof(DataStoreProtoObject)) + { + return DataType.Proto; + } + else if (typeof(IMessage).IsAssignableFrom(type)) + { + return DataType.Proto; + } throw new NotSupportedException($"The specified type '{type.Name}' is not supported by the data store."); } @@ -63,26 +77,28 @@ namespace Tango.DataStore /// The type. /// /// The specified data type is not supported. - public static Type GetType(DataType type) - { - switch (type) - { - case DataType.Boolean: - return typeof(bool); - case DataType.Bytes: - return typeof(byte[]); - case DataType.Double: - return typeof(double); - case DataType.Float: - return typeof(float); - case DataType.Int32: - return typeof(Int32); - case DataType.String: - return typeof(String); - } + //public static Type GetType(DataType type) + //{ + // switch (type) + // { + // case DataType.Boolean: + // return typeof(bool); + // case DataType.Bytes: + // return typeof(byte[]); + // case DataType.Double: + // return typeof(double); + // case DataType.Float: + // return typeof(float); + // case DataType.Int32: + // return typeof(Int32); + // case DataType.String: + // return typeof(String); + // case DataType.Proto: + // return typeof(DataStoreProtoObject); + // } - throw new NotSupportedException("The specified data type is not supported."); - } + // throw new NotSupportedException("The specified data type is not supported."); + //} /// /// Formats the data store item as a string. @@ -91,11 +107,7 @@ namespace Tango.DataStore /// public static String FormatDataStoreItem(IDataStoreItem item) { - if (item.Type != DataType.Bytes) - { - return $"{item.Key}: {item.Value}"; - } - else + if (item.Type == DataType.Bytes) { byte[] bytes = (byte[])item.Value; @@ -106,6 +118,14 @@ namespace Tango.DataStore } return hex.ToString(); } + else if (item.Type == DataType.Proto) + { + return (item.Value as DataStoreProtoObject).Message.ToJsonString(); + } + else + { + return $"{item.Key}: {item.Value}"; + } } } } diff --git a/Software/Visual_Studio/Tango.DataStore/DataStoreProtoObject.cs b/Software/Visual_Studio/Tango.DataStore/DataStoreProtoObject.cs new file mode 100644 index 000000000..ec4cf1057 --- /dev/null +++ b/Software/Visual_Studio/Tango.DataStore/DataStoreProtoObject.cs @@ -0,0 +1,71 @@ +using Google.Protobuf; +using Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Tango.Core.Bson; +using Tango.PMR; +using Tango.PMR.Common; +using Tango.PMR.DataStore; + +namespace Tango.DataStore +{ + public class DataStoreProtoObject + { + public MessageType MessageType { get; set; } + public Type Type { get; set; } + public byte[] Data { get; set; } + + + private IMessage _message; + [JsonIgnore] + public IMessage Message + { + get + { + if (_message == null) + { + _message = MessageFactory.ParseProtoMessage(Data, Type); + } + + return _message; + } + private set { _message = value; } + } + + public byte[] ToBytes() + { + return BsonConvert.Serialize(this); + } + + public static DataStoreProtoObject FromBytes(byte[] data) + { + var instance = BsonConvert.Deserialize(data); + instance.Message = MessageFactory.ParseProtoMessage(instance.Data, instance.Type); + + return instance; + } + + public static DataStoreProtoObject FromMessage(IMessage message) + { + DataStoreProtoObject proto = new DataStoreProtoObject(); + proto.Type = message.GetType(); + proto.MessageType = MessageFactory.ParseMessageType(proto.Type.Name); + proto.Data = message.ToByteArray(); + proto.Message = message; + return proto; + } + + public static DataStoreProtoObject FromPMRDataStoreItem(DataStoreItem item) + { + DataStoreProtoObject proto = new DataStoreProtoObject(); + proto.MessageType = item.ProtoType; + proto.Type = MessageFactory.GetPMRTypeFromMessageType(item.ProtoType); + proto.Data = item.BytesValue.ToByteArray(); + return proto; + } + } +} diff --git a/Software/Visual_Studio/Tango.DataStore/DataType.cs b/Software/Visual_Studio/Tango.DataStore/DataType.cs index ddb8adf4d..132bff28e 100644 --- a/Software/Visual_Studio/Tango.DataStore/DataType.cs +++ b/Software/Visual_Studio/Tango.DataStore/DataType.cs @@ -16,6 +16,7 @@ namespace Tango.DataStore Double, Boolean, String, - Bytes + Bytes, + Proto } } diff --git a/Software/Visual_Studio/Tango.DataStore/Tango.DataStore.csproj b/Software/Visual_Studio/Tango.DataStore/Tango.DataStore.csproj index 37c0ecfc2..8035af7b4 100644 --- a/Software/Visual_Studio/Tango.DataStore/Tango.DataStore.csproj +++ b/Software/Visual_Studio/Tango.DataStore/Tango.DataStore.csproj @@ -33,6 +33,12 @@ bin\Release\Tango.DataStore.xml + + ..\packages\Google.Protobuf.3.4.1\lib\net45\Google.Protobuf.dll + + + ..\packages\Newtonsoft.Json.9.0.1\lib\net45\Newtonsoft.Json.dll + @@ -47,11 +53,26 @@ GlobalVersionInfo.cs + + + + + + + + {A34EE0F0-649D-41C8-8489-B6F1CC6924EE} + Tango.Core + + + {e4927038-348d-4295-aaf4-861c58cb3943} + Tango.PMR + + \ No newline at end of file diff --git a/Software/Visual_Studio/Tango.DataStore/packages.config b/Software/Visual_Studio/Tango.DataStore/packages.config new file mode 100644 index 000000000..026e719c3 --- /dev/null +++ b/Software/Visual_Studio/Tango.DataStore/packages.config @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/Software/Visual_Studio/Tango.Emulations/Emulators/MachineEmulator.cs b/Software/Visual_Studio/Tango.Emulations/Emulators/MachineEmulator.cs index 05752c378..e5296ab4c 100644 --- a/Software/Visual_Studio/Tango.Emulations/Emulators/MachineEmulator.cs +++ b/Software/Visual_Studio/Tango.Emulations/Emulators/MachineEmulator.cs @@ -2018,6 +2018,48 @@ namespace Tango.Emulations.Emulators LogManager.Log(ex, "Failed."); } } + + { + try + { + LogManager.Log("Testing proto..."); + + var response = await Transporter.SendRequest(new PutDataStoreItemRequest() + { + Collection = "TEST", + Key = "proto", + Item = new PMR.DataStore.DataStoreItem() + { + DataType = DataType.Proto, + BytesValue = new CalculateRequest() { A = 10, B = 15 }.ToByteString(), + ProtoType = MessageType.CalculateRequest, + } + }); + + if (response.Container.Error != ErrorCode.None) + { + LogManager.Log("Put Failed."); + LogManager.Log(response.ToJsonString()); + } + else + { + var res = await Transporter.SendRequest(new GetDataStoreItemRequest() + { + Collection = "TEST", + Key = "proto" + }); + + LogManager.Log(res.Container.Error != ErrorCode.None ? "Get Failed." : "Passed."); + + LogManager.Log(CalculateRequest.Parser.ParseFrom(res.Message.Item.BytesValue).ToJsonString()); + LogManager.Log(res.ToJsonString()); + } + } + catch (Exception ex) + { + LogManager.Log(ex, "Failed."); + } + } } #endregion diff --git a/Software/Visual_Studio/Tango.PMR/DataStore/DataStoreItem.cs b/Software/Visual_Studio/Tango.PMR/DataStore/DataStoreItem.cs index 4b7534738..f560237ae 100644 --- a/Software/Visual_Studio/Tango.PMR/DataStore/DataStoreItem.cs +++ b/Software/Visual_Studio/Tango.PMR/DataStore/DataStoreItem.cs @@ -23,16 +23,17 @@ namespace Tango.PMR.DataStore { byte[] descriptorData = global::System.Convert.FromBase64String( string.Concat( "ChNEYXRhU3RvcmVJdGVtLnByb3RvEhNUYW5nby5QTVIuRGF0YVN0b3JlGg5E", - "YXRhVHlwZS5wcm90byK8AQoNRGF0YVN0b3JlSXRlbRIvCghEYXRhVHlwZRgB", - "IAEoDjIdLlRhbmdvLlBNUi5EYXRhU3RvcmUuRGF0YVR5cGUSEgoKSW50MzJW", - "YWx1ZRgCIAEoBRISCgpGbG9hdFZhbHVlGAMgASgCEhMKC0RvdWJsZVZhbHVl", - "GAQgASgBEhQKDEJvb2xlYW5WYWx1ZRgFIAEoCBITCgtTdHJpbmdWYWx1ZRgG", - "IAEoCRISCgpCeXRlc1ZhbHVlGAcgASgMQh8KHWNvbS50d2luZS50YW5nby5w", - "bXIuZGF0YXN0b3JlYgZwcm90bzM=")); + "YXRhVHlwZS5wcm90bxoRTWVzc2FnZVR5cGUucHJvdG8i7gEKDURhdGFTdG9y", + "ZUl0ZW0SLwoIRGF0YVR5cGUYASABKA4yHS5UYW5nby5QTVIuRGF0YVN0b3Jl", + "LkRhdGFUeXBlEhIKCkludDMyVmFsdWUYAiABKAUSEgoKRmxvYXRWYWx1ZRgD", + "IAEoAhITCgtEb3VibGVWYWx1ZRgEIAEoARIUCgxCb29sZWFuVmFsdWUYBSAB", + "KAgSEwoLU3RyaW5nVmFsdWUYBiABKAkSEgoKQnl0ZXNWYWx1ZRgHIAEoDBIw", + "CglQcm90b1R5cGUYFCABKA4yHS5UYW5nby5QTVIuQ29tbW9uLk1lc3NhZ2VU", + "eXBlQh8KHWNvbS50d2luZS50YW5nby5wbXIuZGF0YXN0b3JlYgZwcm90bzM=")); descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData, - new pbr::FileDescriptor[] { global::Tango.PMR.DataStore.DataTypeReflection.Descriptor, }, + new pbr::FileDescriptor[] { global::Tango.PMR.DataStore.DataTypeReflection.Descriptor, global::Tango.PMR.Common.MessageTypeReflection.Descriptor, }, new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] { - new pbr::GeneratedClrTypeInfo(typeof(global::Tango.PMR.DataStore.DataStoreItem), global::Tango.PMR.DataStore.DataStoreItem.Parser, new[]{ "DataType", "Int32Value", "FloatValue", "DoubleValue", "BooleanValue", "StringValue", "BytesValue" }, null, null, null) + new pbr::GeneratedClrTypeInfo(typeof(global::Tango.PMR.DataStore.DataStoreItem), global::Tango.PMR.DataStore.DataStoreItem.Parser, new[]{ "DataType", "Int32Value", "FloatValue", "DoubleValue", "BooleanValue", "StringValue", "BytesValue", "ProtoType" }, null, null, null) })); } #endregion @@ -70,6 +71,7 @@ namespace Tango.PMR.DataStore { booleanValue_ = other.booleanValue_; stringValue_ = other.stringValue_; bytesValue_ = other.bytesValue_; + protoType_ = other.protoType_; } [global::System.Diagnostics.DebuggerNonUserCodeAttribute] @@ -154,6 +156,20 @@ namespace Tango.PMR.DataStore { } } + /// Field number for the "ProtoType" field. + public const int ProtoTypeFieldNumber = 20; + private global::Tango.PMR.Common.MessageType protoType_ = 0; + /// + ///Use only when DataType = Proto. + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public global::Tango.PMR.Common.MessageType ProtoType { + get { return protoType_; } + set { + protoType_ = value; + } + } + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] public override bool Equals(object other) { return Equals(other as DataStoreItem); @@ -174,6 +190,7 @@ namespace Tango.PMR.DataStore { if (BooleanValue != other.BooleanValue) return false; if (StringValue != other.StringValue) return false; if (BytesValue != other.BytesValue) return false; + if (ProtoType != other.ProtoType) return false; return true; } @@ -187,6 +204,7 @@ namespace Tango.PMR.DataStore { if (BooleanValue != false) hash ^= BooleanValue.GetHashCode(); if (StringValue.Length != 0) hash ^= StringValue.GetHashCode(); if (BytesValue.Length != 0) hash ^= BytesValue.GetHashCode(); + if (ProtoType != 0) hash ^= ProtoType.GetHashCode(); return hash; } @@ -225,6 +243,10 @@ namespace Tango.PMR.DataStore { output.WriteRawTag(58); output.WriteBytes(BytesValue); } + if (ProtoType != 0) { + output.WriteRawTag(160, 1); + output.WriteEnum((int) ProtoType); + } } [global::System.Diagnostics.DebuggerNonUserCodeAttribute] @@ -251,6 +273,9 @@ namespace Tango.PMR.DataStore { if (BytesValue.Length != 0) { size += 1 + pb::CodedOutputStream.ComputeBytesSize(BytesValue); } + if (ProtoType != 0) { + size += 2 + pb::CodedOutputStream.ComputeEnumSize((int) ProtoType); + } return size; } @@ -280,6 +305,9 @@ namespace Tango.PMR.DataStore { if (other.BytesValue.Length != 0) { BytesValue = other.BytesValue; } + if (other.ProtoType != 0) { + ProtoType = other.ProtoType; + } } [global::System.Diagnostics.DebuggerNonUserCodeAttribute] @@ -318,6 +346,10 @@ namespace Tango.PMR.DataStore { BytesValue = input.ReadBytes(); break; } + case 160: { + protoType_ = (global::Tango.PMR.Common.MessageType) input.ReadEnum(); + break; + } } } } diff --git a/Software/Visual_Studio/Tango.PMR/DataStore/DataType.cs b/Software/Visual_Studio/Tango.PMR/DataStore/DataType.cs index 0c2a2c1ab..3ec396931 100644 --- a/Software/Visual_Studio/Tango.PMR/DataStore/DataType.cs +++ b/Software/Visual_Studio/Tango.PMR/DataStore/DataType.cs @@ -22,10 +22,10 @@ namespace Tango.PMR.DataStore { static DataTypeReflection() { byte[] descriptorData = global::System.Convert.FromBase64String( string.Concat( - "Cg5EYXRhVHlwZS5wcm90bxITVGFuZ28uUE1SLkRhdGFTdG9yZSpQCghEYXRh", + "Cg5EYXRhVHlwZS5wcm90bxITVGFuZ28uUE1SLkRhdGFTdG9yZSpbCghEYXRh", "VHlwZRIJCgVJbnQzMhAAEgkKBUZsb2F0EAESCgoGRG91YmxlEAISCwoHQm9v", - "bGVhbhADEgoKBlN0cmluZxAEEgkKBUJ5dGVzEAVCHwodY29tLnR3aW5lLnRh", - "bmdvLnBtci5kYXRhc3RvcmViBnByb3RvMw==")); + "bGVhbhADEgoKBlN0cmluZxAEEgkKBUJ5dGVzEAUSCQoFUHJvdG8QBkIfCh1j", + "b20udHdpbmUudGFuZ28ucG1yLmRhdGFzdG9yZWIGcHJvdG8z")); descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData, new pbr::FileDescriptor[] { }, new pbr::GeneratedClrTypeInfo(new[] {typeof(global::Tango.PMR.DataStore.DataType), }, null)); @@ -41,6 +41,7 @@ namespace Tango.PMR.DataStore { [pbr::OriginalName("Boolean")] Boolean = 3, [pbr::OriginalName("String")] String = 4, [pbr::OriginalName("Bytes")] Bytes = 5, + [pbr::OriginalName("Proto")] Proto = 6, } #endregion diff --git a/Software/Visual_Studio/Tango.PMR/MessageFactory.cs b/Software/Visual_Studio/Tango.PMR/MessageFactory.cs index 6a796bf55..d23970e88 100644 --- a/Software/Visual_Studio/Tango.PMR/MessageFactory.cs +++ b/Software/Visual_Studio/Tango.PMR/MessageFactory.cs @@ -1,6 +1,7 @@ using Google.Protobuf; using System; using System.Collections.Generic; +using System.IO; using System.Linq; using System.Reflection; using System.Text; @@ -36,6 +37,16 @@ namespace Tango.PMR } } + /// + /// Returns the matching PMR type from the PMR message type. + /// + /// Type of the message. + /// + public static Type GetPMRTypeFromMessageType(MessageType messageType) + { + return _pmrTypes[messageType]; + } + /// /// Creates a new . /// @@ -205,5 +216,26 @@ namespace Tango.PMR { return typeof(MessageFactory).Assembly.GetTypes().Where(x => x.Namespace != null && x.Namespace.Contains("Stubs") && !x.Name.Contains("Reflection")).ToList(); } + + /// + /// Parses the proto message from the specified bytes. Requires the message type. + /// + /// The data. + /// The type. + /// + public static IMessage ParseProtoMessage(byte[] data, Type type) + { + using (MemoryStream ms = new MemoryStream(data)) + { + ms.Position = 0; + + using (BinaryReader reader = new BinaryReader(ms)) + { + IMessage message = Activator.CreateInstance(type) as IMessage; + MessageParser parser = type.GetProperty("Parser").GetValue(message) as MessageParser; + return parser.ParseFrom(data); + } + } + } } } diff --git a/Software/Visual_Studio/Tango.UnitTesting/DataStore/DataStore_TST.cs b/Software/Visual_Studio/Tango.UnitTesting/DataStore/DataStore_TST.cs index 1428aa210..594c8d7f8 100644 --- a/Software/Visual_Studio/Tango.UnitTesting/DataStore/DataStore_TST.cs +++ b/Software/Visual_Studio/Tango.UnitTesting/DataStore/DataStore_TST.cs @@ -11,6 +11,9 @@ using Tango.DataStore; using Tango.DataStore.Lite; using Tango.Core.IO; using Tango.DataStore.EF; +using Tango.PMR.Stubs; +using Tango.Transport; +using Tango.DataStore.Remote; namespace Tango.UnitTesting.DataStore { @@ -32,6 +35,27 @@ namespace Tango.UnitTesting.DataStore Run_Test(new EFDataStoreManager()); } + [TestMethod] + public void Remote_Data_Store_Working() + { + CalculateRequest calc = new CalculateRequest() + { + A = 10, + B = 15, + }; + + RemoteDataStoreGetResponse response = new RemoteDataStoreGetResponse(); + response.ProtoObject = DataStoreProtoObject.FromMessage(calc); + + byte[] data = GenericMessageSerializer.Serialize(response, PMR.Integration.GenericMessageProtocol.Bson); + + RemoteDataStoreGetResponse des = GenericMessageSerializer.Deserialize(data, PMR.Integration.GenericMessageProtocol.Bson); + + CalculateRequest cc = des.ProtoObject.Message as CalculateRequest; + + Assert.AreEqual(calc, cc); + } + private void Run_Test(IDataStoreManager manager) { IDataStoreCollection collection = manager.GetCollection("TEST"); @@ -72,7 +96,13 @@ namespace Tango.UnitTesting.DataStore Assert.AreEqual(value[0], 255); } - Assert.IsTrue(collection.Count() == 6); + { + collection.Put("calc", new CalculateRequest() { A = 10, B = 15 }); + CalculateRequest value = collection.Get("calc"); + Assert.AreEqual(value, new CalculateRequest() { A = 10, B = 15 }); + } + + Assert.IsTrue(collection.Count() == 7); Assert.ThrowsException(() => collection.Put("somekey", this)); @@ -82,7 +112,7 @@ namespace Tango.UnitTesting.DataStore collection.Delete("float"); Assert.ThrowsException(() => collection.Get("float")); - Assert.IsTrue(collection.Count() == 4); + Assert.IsTrue(collection.Count() == 5); collection.DeleteAll(); Assert.IsTrue(collection.Count() == 0); diff --git a/Software/Visual_Studio/Tango.UnitTesting/Tango.UnitTesting.csproj b/Software/Visual_Studio/Tango.UnitTesting/Tango.UnitTesting.csproj index 0371c1cca..b24079da0 100644 --- a/Software/Visual_Studio/Tango.UnitTesting/Tango.UnitTesting.csproj +++ b/Software/Visual_Studio/Tango.UnitTesting/Tango.UnitTesting.csproj @@ -221,6 +221,10 @@ {fa96bc0c-4055-475c-9dcc-70a5a9436b10} Tango.DataStore.Lite + + {29448f3c-9b3e-4da6-8555-46a8b9a6b3aa} + Tango.DataStore.Remote + {e0364dfa-0721-4637-9d32-9d22aac109d6} Tango.DataStore @@ -319,7 +323,7 @@ - + \ No newline at end of file -- cgit v1.3.1 From d530d39d7ed9b05e3e233adc62dceba2fd17e1fe Mon Sep 17 00:00:00 2001 From: Roy Ben Shabat Date: Sun, 25 Oct 2020 16:58:42 +0200 Subject: Improved extension methods support on procedures. Drastically reduces procedure designer loading time. DataStore proto support fully working and tested. --- Software/DB/PPC/Tango.mdf | Bin 75497472 -> 75497472 bytes Software/DB/PPC/Tango_log.ldf | Bin 53673984 -> 53673984 bytes Software/DB/Tango.mdf | Bin 75497472 -> 75497472 bytes Software/DB/Tango_log.ldf | Bin 22675456 -> 22675456 bytes .../DataStore/RemoteDataStoreCollection.cs | 5 ++ .../DataStore/DefaultDataStoreService.cs | 11 +++ .../Intellisense/KnownType.cs | 25 ++++++- .../Tango.Scripting.Editors/ScriptEditor.cs | 1 + .../Tango.Core/ExtensionMethods/TypeExtensions.cs | 76 ++++++++++++++++++--- .../Visual_Studio/Tango.Core/Tango.Core.csproj | 4 +- .../Tango.DataStore.Remote.csproj | 1 - .../Tango.DataStore/DataStoreHelper.cs | 35 ++-------- .../Tango.DataStore/DataStoreProtoObject.cs | 6 ++ .../Tango.DataStore/ExtensionMethods.cs | 16 +++++ .../Tango.DataStore/Tango.DataStore.csproj | 2 +- .../Tango.Emulations/Emulators/MachineEmulator.cs | 53 ++++++++++++++ .../ExtensionMethods/IMessageExtensions.cs | 27 ++++++++ Software/Visual_Studio/Tango.PMR/Tango.PMR.csproj | 3 +- 18 files changed, 220 insertions(+), 45 deletions(-) create mode 100644 Software/Visual_Studio/Tango.DataStore/ExtensionMethods.cs create mode 100644 Software/Visual_Studio/Tango.PMR/ExtensionMethods/IMessageExtensions.cs (limited to 'Software/Visual_Studio/Tango.DataStore.Remote') diff --git a/Software/DB/PPC/Tango.mdf b/Software/DB/PPC/Tango.mdf index 7e41561c2..82f79b115 100644 Binary files a/Software/DB/PPC/Tango.mdf and b/Software/DB/PPC/Tango.mdf differ diff --git a/Software/DB/PPC/Tango_log.ldf b/Software/DB/PPC/Tango_log.ldf index 9d05c6dbf..3e094bf75 100644 Binary files a/Software/DB/PPC/Tango_log.ldf and b/Software/DB/PPC/Tango_log.ldf differ diff --git a/Software/DB/Tango.mdf b/Software/DB/Tango.mdf index dd6d320e3..f51d1ef53 100644 Binary files a/Software/DB/Tango.mdf and b/Software/DB/Tango.mdf differ diff --git a/Software/DB/Tango_log.ldf b/Software/DB/Tango_log.ldf index ee59bb247..efb7ce79e 100644 Binary files a/Software/DB/Tango_log.ldf and b/Software/DB/Tango_log.ldf differ diff --git a/Software/Visual_Studio/FSE/Tango.FSE.UI/DataStore/RemoteDataStoreCollection.cs b/Software/Visual_Studio/FSE/Tango.FSE.UI/DataStore/RemoteDataStoreCollection.cs index 4cf64a688..78e2bcfb1 100644 --- a/Software/Visual_Studio/FSE/Tango.FSE.UI/DataStore/RemoteDataStoreCollection.cs +++ b/Software/Visual_Studio/FSE/Tango.FSE.UI/DataStore/RemoteDataStoreCollection.cs @@ -136,6 +136,11 @@ namespace Tango.FSE.UI.DataStore public IDataStoreItem GetItem(string key, object defaultValue) { + if (defaultValue is IMessage defaultValueMessage) + { + defaultValue = DataStoreProtoObject.FromMessage(defaultValueMessage); + } + var result = _machineProvider.MachineOperator.SendGenericRequest(new RemoteDataStoreGetItemRequest() { Collection = Name, diff --git a/Software/Visual_Studio/PPC/Tango.PPC.Common/DataStore/DefaultDataStoreService.cs b/Software/Visual_Studio/PPC/Tango.PPC.Common/DataStore/DefaultDataStoreService.cs index bf0eadae1..ddc0f6cdb 100644 --- a/Software/Visual_Studio/PPC/Tango.PPC.Common/DataStore/DefaultDataStoreService.cs +++ b/Software/Visual_Studio/PPC/Tango.PPC.Common/DataStore/DefaultDataStoreService.cs @@ -16,6 +16,7 @@ using Tango.PPC.Common.Connection; using Tango.PPC.Common.ExternalBridge; using Tango.Transport; using Tango.Core.ExtensionMethods; +using Newtonsoft.Json.Linq; namespace Tango.PPC.Common.DataStore { @@ -59,6 +60,11 @@ namespace Tango.PPC.Common.DataStore [ExternalBridgeRequestHandlerMethod(typeof(RemoteDataStoreGetRequest), RequestHandlerLoggingMode.LogRequestName)] public async Task OnRemoteDataStoreGetRequest(RemoteDataStoreGetRequest request, String token, ExternalBridgeReceiver receiver) { + if (request.DefaultValue is JObject obj) + { + request.DefaultValue = DataStoreProtoObject.FromJObject(obj); + } + var item = GetManager().GetCollection(request.Collection).GetItem(request.Key, request.DefaultValue); await receiver.SendGenericResponse(new RemoteDataStoreGetResponse() { @@ -70,6 +76,11 @@ namespace Tango.PPC.Common.DataStore [ExternalBridgeRequestHandlerMethod(typeof(RemoteDataStoreGetItemRequest), RequestHandlerLoggingMode.LogRequestName)] public async Task OnRemoteDataStoreGetItemRequest(RemoteDataStoreGetItemRequest request, String token, ExternalBridgeReceiver receiver) { + if (request.DefaultValue is JObject obj) + { + request.DefaultValue = DataStoreProtoObject.FromJObject(obj); + } + var item = GetManager().GetCollection(request.Collection).GetItem(request.Key, request.DefaultValue); await receiver.SendGenericResponse(new RemoteDataStoreGetItemResponse() { diff --git a/Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Intellisense/KnownType.cs b/Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Intellisense/KnownType.cs index f55838db3..8010dc689 100644 --- a/Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Intellisense/KnownType.cs +++ b/Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Intellisense/KnownType.cs @@ -1,4 +1,5 @@ -using System; +using Newtonsoft.Json; +using System; using System.Collections; using System.Collections.Generic; using System.Drawing; @@ -43,6 +44,13 @@ namespace Tango.Scripting.Editors.Intellisense } public List Fields { get; set; } + public static List ExtensionMethodsAssemblies { get; set; } + + static KnownType() + { + ExtensionMethodsAssemblies = new List(); + } + public KnownType(Type type) { Summary = "Loading documentation..."; @@ -131,11 +139,24 @@ namespace Tango.Scripting.Editors.Intellisense methods.AddRange(inter.GetRuntimeMethods().Where(x => x.IsPublic && !x.IsSpecialName).ToList()); } methods = methods.Distinct().ToList(); + + if (!methods.Exists(x => x.Name == "ToString")) + { + methods.Add(typeof(Object).GetMethod("ToString")); + } } //TODO: Separate extension methods! methods.AddRange(Type.GetExtensionMethods(Type.Assembly).ToList()); + if (Type.Namespace.StartsWith("Tango")) + { + foreach (var asm in ExtensionMethodsAssemblies.Where(x => x != Type.Assembly)) + { + methods.AddRange(Type.GetExtensionMethods(asm).ToList()); + } + } + if (typeof(IEnumerable).IsAssignableFrom(Type)) { var linqMethods = typeof(System.Linq.Enumerable).GetMethods(BindingFlags.Static | BindingFlags.Public).ToList(); @@ -152,7 +173,7 @@ namespace Tango.Scripting.Editors.Intellisense m.Name = method.Name; m.ReturnType = method.ReturnType; m.ReturnTypeFriendlyName = method.ReturnType.GetFriendlyName(); - m.IsStatic = method.IsStatic; + m.IsStatic = method.IsStatic && !method.IsDefined(typeof(System.Runtime.CompilerServices.ExtensionAttribute), false); if (method.IsGenericMethod) { diff --git a/Software/Visual_Studio/Scripting/Tango.Scripting.Editors/ScriptEditor.cs b/Software/Visual_Studio/Scripting/Tango.Scripting.Editors/ScriptEditor.cs index 9ff78912f..e65ff671d 100644 --- a/Software/Visual_Studio/Scripting/Tango.Scripting.Editors/ScriptEditor.cs +++ b/Software/Visual_Studio/Scripting/Tango.Scripting.Editors/ScriptEditor.cs @@ -1808,6 +1808,7 @@ namespace Tango.Scripting.Editors _isLoadingTypes = true; var assemblies = ReferenceAssemblies.ToList(); + KnownType.ExtensionMethodsAssemblies = assemblies.ToList(); var usings = _current_usings.ToList(); Thread t = new Thread(() => diff --git a/Software/Visual_Studio/Tango.Core/ExtensionMethods/TypeExtensions.cs b/Software/Visual_Studio/Tango.Core/ExtensionMethods/TypeExtensions.cs index 66978ec19..44297b277 100644 --- a/Software/Visual_Studio/Tango.Core/ExtensionMethods/TypeExtensions.cs +++ b/Software/Visual_Studio/Tango.Core/ExtensionMethods/TypeExtensions.cs @@ -10,6 +10,19 @@ using System.Threading.Tasks; /// public static class TypeExtensions { + private class AssemblyExtensionMethods + { + public Assembly Assembly { get; set; } + public List Methods { get; set; } + + public AssemblyExtensionMethods() + { + Methods = new List(); + } + } + + private static List _extensionMethodsCache = new List(); + /// /// Gets all the extension methods registered in the specified assembly. /// @@ -18,14 +31,61 @@ public static class TypeExtensions /// public static IEnumerable GetExtensionMethods(this Type type, Assembly extensionsAssembly) { - var query = from t in extensionsAssembly.GetTypes() - where !t.IsGenericType && !t.IsNested - from m in t.GetMethods(BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic) - where m.IsDefined(typeof(System.Runtime.CompilerServices.ExtensionAttribute), false) - where m.GetParameters()[0].ParameterType == type - select m; - - return query; + if (type.Name == "CalculateRequest") + { + + } + + var asmMethods = _extensionMethodsCache.FirstOrDefault(x => x.Assembly == extensionsAssembly); + + if (asmMethods == null) + { + var query = from t in extensionsAssembly.GetTypes() + where !t.IsGenericType && !t.IsNested + from m in t.GetMethods(BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic) + where m.IsDefined(typeof(System.Runtime.CompilerServices.ExtensionAttribute), false) + select m; + + asmMethods = new AssemblyExtensionMethods(); + asmMethods.Assembly = extensionsAssembly; + asmMethods.Methods = query.ToList(); + _extensionMethodsCache.Add(asmMethods); + } + + List methods = new List(); + + asmMethods.Methods.Where(x => x.GetParameters()[0].ParameterType.IsAssignableFrom(type)); + + foreach (var method in asmMethods.Methods) + { + var parameter = method.GetParameters()[0]; + + if (parameter.ParameterType.IsGenericParameter) + { + var constraints = parameter.ParameterType.GetGenericParameterConstraints().ToList(); + + if (constraints.Count > 0) + { + if (constraints[0].IsAssignableFrom(type)) + { + methods.Add(method); + } + else if (constraints[0].GetInterfaces().Any(x => x.IsAssignableFrom(type))) + { + methods.Add(method); + } + } + } + else + { + if (parameter.ParameterType.IsAssignableFrom(type)) + { + methods.Add(method); + } + } + } + + return methods; } /// diff --git a/Software/Visual_Studio/Tango.Core/Tango.Core.csproj b/Software/Visual_Studio/Tango.Core/Tango.Core.csproj index 582fa9712..813a31443 100644 --- a/Software/Visual_Studio/Tango.Core/Tango.Core.csproj +++ b/Software/Visual_Studio/Tango.Core/Tango.Core.csproj @@ -155,7 +155,7 @@ - + @@ -220,7 +220,7 @@ - + diff --git a/Software/Visual_Studio/Tango.DataStore.Remote/Tango.DataStore.Remote.csproj b/Software/Visual_Studio/Tango.DataStore.Remote/Tango.DataStore.Remote.csproj index 2b05d6af3..4d0d04054 100644 --- a/Software/Visual_Studio/Tango.DataStore.Remote/Tango.DataStore.Remote.csproj +++ b/Software/Visual_Studio/Tango.DataStore.Remote/Tango.DataStore.Remote.csproj @@ -76,7 +76,6 @@ - diff --git a/Software/Visual_Studio/Tango.DataStore/DataStoreHelper.cs b/Software/Visual_Studio/Tango.DataStore/DataStoreHelper.cs index 3cf24bdd0..96a905120 100644 --- a/Software/Visual_Studio/Tango.DataStore/DataStoreHelper.cs +++ b/Software/Visual_Studio/Tango.DataStore/DataStoreHelper.cs @@ -35,7 +35,11 @@ namespace Tango.DataStore /// public static DataType GetDataType(Type type) { - if (type == typeof(Int32)) + if (type == typeof(int)) + { + return DataType.Int32; + } + else if (type == typeof(Int64)) { return DataType.Int32; } @@ -71,35 +75,6 @@ namespace Tango.DataStore throw new NotSupportedException($"The specified type '{type.Name}' is not supported by the data store."); } - /// - /// Gets the CLR type by specified data store data type. - /// - /// The type. - /// - /// The specified data type is not supported. - //public static Type GetType(DataType type) - //{ - // switch (type) - // { - // case DataType.Boolean: - // return typeof(bool); - // case DataType.Bytes: - // return typeof(byte[]); - // case DataType.Double: - // return typeof(double); - // case DataType.Float: - // return typeof(float); - // case DataType.Int32: - // return typeof(Int32); - // case DataType.String: - // return typeof(String); - // case DataType.Proto: - // return typeof(DataStoreProtoObject); - // } - - // throw new NotSupportedException("The specified data type is not supported."); - //} - /// /// Formats the data store item as a string. /// diff --git a/Software/Visual_Studio/Tango.DataStore/DataStoreProtoObject.cs b/Software/Visual_Studio/Tango.DataStore/DataStoreProtoObject.cs index ec4cf1057..6661c2017 100644 --- a/Software/Visual_Studio/Tango.DataStore/DataStoreProtoObject.cs +++ b/Software/Visual_Studio/Tango.DataStore/DataStoreProtoObject.cs @@ -1,5 +1,6 @@ using Google.Protobuf; using Newtonsoft.Json; +using Newtonsoft.Json.Linq; using System; using System.Collections.Generic; using System.IO; @@ -59,6 +60,11 @@ namespace Tango.DataStore return proto; } + public static DataStoreProtoObject FromJObject(JObject obj) + { + return (obj.ToObject()); + } + public static DataStoreProtoObject FromPMRDataStoreItem(DataStoreItem item) { DataStoreProtoObject proto = new DataStoreProtoObject(); diff --git a/Software/Visual_Studio/Tango.DataStore/ExtensionMethods.cs b/Software/Visual_Studio/Tango.DataStore/ExtensionMethods.cs new file mode 100644 index 000000000..acc381a61 --- /dev/null +++ b/Software/Visual_Studio/Tango.DataStore/ExtensionMethods.cs @@ -0,0 +1,16 @@ +using Google.Protobuf; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Tango.DataStore; + +public static class ExtensionMethods +{ + public static DataStoreProtoObject ToDataStoreProtoObject(IMessage message) + { + return DataStoreProtoObject.FromMessage(message); + } +} + diff --git a/Software/Visual_Studio/Tango.DataStore/Tango.DataStore.csproj b/Software/Visual_Studio/Tango.DataStore/Tango.DataStore.csproj index 8035af7b4..c12abe9e8 100644 --- a/Software/Visual_Studio/Tango.DataStore/Tango.DataStore.csproj +++ b/Software/Visual_Studio/Tango.DataStore/Tango.DataStore.csproj @@ -54,6 +54,7 @@ + @@ -61,7 +62,6 @@ - diff --git a/Software/Visual_Studio/Tango.Emulations/Emulators/MachineEmulator.cs b/Software/Visual_Studio/Tango.Emulations/Emulators/MachineEmulator.cs index e5296ab4c..6b49ca4eb 100644 --- a/Software/Visual_Studio/Tango.Emulations/Emulators/MachineEmulator.cs +++ b/Software/Visual_Studio/Tango.Emulations/Emulators/MachineEmulator.cs @@ -2060,6 +2060,59 @@ namespace Tango.Emulations.Emulators LogManager.Log(ex, "Failed."); } } + + { + try + { + LogManager.Log("Testing int default..."); + + var res = await Transporter.SendRequest(new GetDataStoreItemRequest() + { + Collection = "TEST", + Key = "intDefault", + DefaultItem = new PMR.DataStore.DataStoreItem() + { + DataType = DataType.Int32, + Int32Value = 10, + }, + }); + + LogManager.Log(res.Container.Error != ErrorCode.None ? "Get Failed." : "Passed."); + LogManager.Log(res.ToJsonString()); + } + catch (Exception ex) + { + LogManager.Log(ex, "Failed."); + } + } + + { + try + { + LogManager.Log("Testing proto default..."); + + var res = await Transporter.SendRequest(new GetDataStoreItemRequest() + { + Collection = "TEST", + Key = "protoDefault", + DefaultItem = new PMR.DataStore.DataStoreItem() + { + DataType = DataType.Proto, + BytesValue = (new CalculateRequest() { A = 10, B = 15 }).ToByteString(), + ProtoType = MessageType.CalculateRequest, + }, + }); + + LogManager.Log(res.Container.Error != ErrorCode.None ? "Get Failed." : "Passed."); + + LogManager.Log(CalculateRequest.Parser.ParseFrom(res.Message.Item.BytesValue).ToJsonString()); + LogManager.Log(res.ToJsonString()); + } + catch (Exception ex) + { + LogManager.Log(ex, "Failed."); + } + } } #endregion diff --git a/Software/Visual_Studio/Tango.PMR/ExtensionMethods/IMessageExtensions.cs b/Software/Visual_Studio/Tango.PMR/ExtensionMethods/IMessageExtensions.cs new file mode 100644 index 000000000..84acb51d2 --- /dev/null +++ b/Software/Visual_Studio/Tango.PMR/ExtensionMethods/IMessageExtensions.cs @@ -0,0 +1,27 @@ +using Google.Protobuf; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + + +public static class IMessageExtensions +{ + /// + /// Serializes this PMR message to byte array. + /// + /// + /// The message. + /// + public static byte[] ToBytes(this T message) where T : IMessage + { + using (MemoryStream ms = new MemoryStream()) + { + message.WriteTo(ms); + return ms.ToArray(); + } + } +} + diff --git a/Software/Visual_Studio/Tango.PMR/Tango.PMR.csproj b/Software/Visual_Studio/Tango.PMR/Tango.PMR.csproj index 7b3a7c397..bb44ef591 100644 --- a/Software/Visual_Studio/Tango.PMR/Tango.PMR.csproj +++ b/Software/Visual_Studio/Tango.PMR/Tango.PMR.csproj @@ -189,6 +189,7 @@ + @@ -482,7 +483,7 @@ - + \ No newline at end of file -- cgit v1.3.1