ntminer 6 years ago
parent
commit
7c4ff3c5ae

+ 10 - 0
src/AppModels/Vms/KernelOutputKeywordViewModel.cs

@@ -9,6 +9,7 @@ namespace NTMiner.Vms {
         private string _messageType;
         private string _keyword;
         private string _description;
+        private DateTime _timestamp;
 
         public ICommand Remove { get; private set; }
         public ICommand Edit { get; private set; }
@@ -27,6 +28,7 @@ namespace NTMiner.Vms {
             _messageType = data.MessageType;
             _keyword = data.Keyword;
             _description = data.Description;
+            _timestamp = data.Timestamp;
         }
 
         public KernelOutputKeywordViewModel(Guid id) {
@@ -102,5 +104,13 @@ namespace NTMiner.Vms {
                 OnPropertyChanged(nameof(Description));
             }
         }
+
+        public DateTime Timestamp {
+            get { return _timestamp; }
+            set {
+                _timestamp = value;
+                OnPropertyChanged(nameof(Timestamp));
+            }
+        }
     }
 }

+ 1 - 0
src/NTMinerDataObjects/Core/IKernelOutputKeyword.cs

@@ -9,5 +9,6 @@ namespace NTMiner.Core {
         /// 大意
         /// </summary>
         string Description { get; }
+        DateTime Timestamp { get; }
     }
 }

+ 4 - 1
src/NTMinerDataObjects/Core/KernelOutputKeywordData.cs

@@ -15,7 +15,8 @@ namespace NTMiner.Core {
                 MessageType = data.MessageType,
                 Keyword = data.Keyword,
                 DataLevel = data.DataLevel,
-                Description = string.Empty
+                Description = data.Description,
+                Timestamp = data.Timestamp
             };
         }
 
@@ -40,5 +41,7 @@ namespace NTMiner.Core {
         public string Keyword { get; set; }
 
         public string Description { get; set; }
+
+        public DateTime Timestamp { get; set; }
     }
 }

+ 43 - 6
src/NTMinerRpcClient/KernelOutputKeyword/KernelOutputKeywordSet.cs

@@ -8,12 +8,49 @@ using System.Linq;
 namespace NTMiner.KernelOutputKeyword {
     public class KernelOutputKeywordSet : IKernelOutputKeywordSet {
         private readonly Dictionary<Guid, KernelOutputKeywordData> _dicById = new Dictionary<Guid, KernelOutputKeywordData>();
-        private readonly string _dbFileFullName;
+        private readonly string _connectionString;
         private readonly bool _isServer;
 
         public KernelOutputKeywordSet(string dbFileFullName, bool isServer) {
-            _dbFileFullName = dbFileFullName;
+            if (!string.IsNullOrEmpty(dbFileFullName)) {
+                _connectionString = $"filename={dbFileFullName};journal=false";
+            }
             _isServer = isServer;
+            if (!isServer) {
+                VirtualRoot.BuildCmdPath<LoadKernelOutputKeywordCommand>(action: message => {
+                    if (!VirtualRoot.IsKernelOutputKeywordVisible) {
+                        return;
+                    }
+                    DateTime localTimestamp = VirtualRoot.LocalKernelOutputKeywordSetTimestamp;
+                    // 如果已知服务器端最新内核输出关键字时间戳不比本地已加载的最新内核输出关键字时间戳新就不用加载了
+                    if (message.KnowKernelOutputKeywordTimestamp <= Timestamp.GetTimestamp(localTimestamp)) {
+                        return;
+                    }
+                    OfficialServer.KernelOutputKeywordService.GetKernelOutputKeywords((response, e) => {
+                        if (response.IsSuccess()) {
+                            Guid[] toRemoves = _dicById.Where(a => a.Value.DataLevel == DataLevel.Global).Select(a => a.Key).ToArray();
+                            foreach (var id in toRemoves) {
+                                _dicById.Remove(id);
+                            }
+                            DateTime maxTime = localTimestamp;
+                            if (response.Data.Count != 0) {
+                                var orderedData = response.Data.OrderBy(a => a.Keyword).ToArray();
+                                foreach (var item in orderedData) {
+                                    if (item.Timestamp > maxTime) {
+                                        maxTime = item.Timestamp;
+                                    }
+                                    item.SetDataLevel(DataLevel.Global);
+                                    _dicById.Add(item.Id, item);
+                                }
+                                if (maxTime != localTimestamp) {
+                                    VirtualRoot.LocalKernelOutputKeywordSetTimestamp = maxTime;
+                                }
+                                VirtualRoot.RaiseEvent(new KernelOutputKeywordLoadedEvent(orderedData));
+                            }
+                        }
+                    });
+                });
+            }
             VirtualRoot.BuildCmdPath<AddOrUpdateKernelOutputKeywordCommand>(action: (message) => {
                 InitOnece();
                 if (message == null || message.Input == null || message.Input.GetId() == Guid.Empty) {
@@ -30,7 +67,7 @@ namespace NTMiner.KernelOutputKeyword {
                 }
                 if (_dicById.TryGetValue(message.Input.GetId(), out KernelOutputKeywordData exist)) {
                     exist.Update(message.Input);
-                    using (LiteDatabase db = new LiteDatabase(_dbFileFullName)) {
+                    using (LiteDatabase db = new LiteDatabase(_connectionString)) {
                         var col = db.GetCollection<KernelOutputKeywordData>();
                         col.Update(exist);
                     }
@@ -38,7 +75,7 @@ namespace NTMiner.KernelOutputKeyword {
                 else {
                     KernelOutputKeywordData entity = new KernelOutputKeywordData().Update(message.Input);
                     _dicById.Add(entity.Id, entity);
-                    using (LiteDatabase db = new LiteDatabase(_dbFileFullName)) {
+                    using (LiteDatabase db = new LiteDatabase(_connectionString)) {
                         var col = db.GetCollection<KernelOutputKeywordData>();
                         col.Insert(entity);
                     }
@@ -54,7 +91,7 @@ namespace NTMiner.KernelOutputKeyword {
                 }
                 KernelOutputKeywordData entity = _dicById[message.EntityId];
                 _dicById.Remove(entity.GetId());
-                using (LiteDatabase db = new LiteDatabase(_dbFileFullName)) {
+                using (LiteDatabase db = new LiteDatabase(_connectionString)) {
                     var col = db.GetCollection<KernelOutputKeywordData>();
                     col.Delete(message.EntityId);
                 }
@@ -74,7 +111,7 @@ namespace NTMiner.KernelOutputKeyword {
         private void Init() {
             lock (_locker) {
                 if (!_isInited) {
-                    using (LiteDatabase db = new LiteDatabase(_dbFileFullName)) {
+                    using (LiteDatabase db = new LiteDatabase(_connectionString)) {
                         var col = db.GetCollection<KernelOutputKeywordData>();
                         foreach (var item in col.FindAll()) {
                             if (!_dicById.ContainsKey(item.GetId())) {

+ 1 - 1
src/NTMinerRpcClient/OfficialServer.partials.KernelOutputKeywordService.cs

@@ -27,7 +27,7 @@ namespace NTMiner {
             #region GetKernelOutputKeywords
             public void GetKernelOutputKeywords(Action<DataResponse<List<KernelOutputKeywordData>>, Exception> callback) {
                 try {
-                    AppSettingsRequest request = new AppSettingsRequest {
+                    KernelOutputKeywordsRequest request = new KernelOutputKeywordsRequest {
                     };
                     PostAsync(SControllerName, nameof(IKernelOutputKeywordController.KernelOutputKeywords), null, request, callback);
                 }

+ 1 - 1
src/NTMinerRpcClient/ServerMessage/ServerMessageSet.cs

@@ -17,7 +17,7 @@ namespace NTMiner.ServerMessage {
                 _connectionString = $"filename={dbFileFullName};journal=false";
             }
             _isServer = isServer;
-            if (!_isServer) {
+            if (!isServer) {
                 VirtualRoot.BuildCmdPath<LoadNewServerMessageCommand>(action: message => {
                     if (!VirtualRoot.IsServerMessagesVisible) {
                         return;

+ 22 - 1
src/NTMinerlib/Messages.cs

@@ -196,13 +196,34 @@ namespace NTMiner {
         public ulong KnowServerMessageTimestamp { get; private set; }
     }
 
+    [MessageType(description: "从服务器获取内核输出关键字")]
+    public class LoadKernelOutputKeywordCommand : Cmd {
+        public LoadKernelOutputKeywordCommand() {
+            this.KnowKernelOutputKeywordTimestamp = Timestamp.GetTimestamp();
+        }
+        public LoadKernelOutputKeywordCommand(ulong knowKernelOutputKeywordTimestamp) {
+            this.KnowKernelOutputKeywordTimestamp = knowKernelOutputKeywordTimestamp;
+        }
+
+        public ulong KnowKernelOutputKeywordTimestamp { get; private set; }
+    }
+
     [MessageType(description: "从服务器获取到新的服务器消息后")]
     public class NewServerMessageLoadedEvent : EventBase {
         public NewServerMessageLoadedEvent(LinkedList<ServerMessageData> data) {
             this.Data = data;
         }
 
-        public LinkedList<ServerMessageData> Data { get; }
+        public LinkedList<ServerMessageData> Data { get; private set; }
+    }
+
+    [MessageType(description: "从服务器获取了内核输出关键字后")]
+    public class KernelOutputKeywordLoadedEvent : EventBase {
+        public KernelOutputKeywordLoadedEvent(KernelOutputKeywordData[] data) {
+            this.Data = data;
+        }
+
+        public KernelOutputKeywordData[] Data { get; private set; }
     }
 
     [MessageType(description: "添加或修改服务器消息")]

+ 27 - 0
src/NTMinerlib/VirtualRoot.cs

@@ -112,6 +112,15 @@ namespace NTMiner {
             _isServerMessagesVisible = value;
         }
 
+        private static bool _isKernelOutputKeywordVisible = false;
+        public static bool IsKernelOutputKeywordVisible {
+            get { return _isKernelOutputKeywordVisible; }
+        }
+
+        public static void SetIsKernelOutputKeywordVisible(bool value) {
+            _isKernelOutputKeywordVisible = value;
+        }
+
         public static ILocalIpSet LocalIpSet { get; private set; }
         public static IObjectSerializer JsonSerializer { get; private set; }
 
@@ -194,6 +203,24 @@ namespace NTMiner {
         }
         #endregion
 
+        #region LocalKernelOutputKeywordSetTimestamp
+        public static DateTime LocalKernelOutputKeywordSetTimestamp {
+            get {
+                if (LocalAppSettingSet.TryGetAppSetting(nameof(LocalKernelOutputKeywordSetTimestamp), out IAppSetting appSetting) && appSetting.Value is DateTime value) {
+                    return value;
+                }
+                return Timestamp.UnixBaseTime;
+            }
+            set {
+                AppSettingData appSetting = new AppSettingData {
+                    Key = nameof(LocalKernelOutputKeywordSetTimestamp),
+                    Value = value
+                };
+                Execute(new SetLocalAppSettingCommand(appSetting));
+            }
+        }
+        #endregion
+
         #region LocalAppSettingSet
         private static IAppSettingSet _appSettingSet;
         public static IAppSettingSet LocalAppSettingSet {