Selaa lähdekoodia

Made some tweaks and added the methods in the server handlers to handle the paging

Kenric Nugteren 11 kuukautta sitten
vanhempi
commit
fc9d75c0da

+ 6 - 0
InABox.Core/Client/Client.cs

@@ -118,6 +118,12 @@ namespace InABox.Clients
             new Client<TEntity>().Query(filter, columns, orderby, range, callback);
         }
 
+        public static void Query<TEntity>(Filter<TEntity>? filter, Columns<TEntity>? columns, SortOrder<TEntity>? orderby, Action<CoreTable?, Exception?> callback)
+            where TEntity : Entity, IRemotable, IPersistent, new()
+        {
+            new Client<TEntity>().Query(filter, columns, orderby, null, callback);
+        }
+
         public static void Save<TEntity>(TEntity entity, string auditNote)
             where TEntity : Entity, IRemotable, IPersistent, new()
         {

+ 5 - 22
InABox.Core/Client/Request.cs

@@ -226,44 +226,27 @@ namespace InABox.Clients
             Filter = reader.ReadFilter<TEntity>();
             Columns = reader.ReadColumns<TEntity>();
             Sort = reader.ReadSortOrder<TEntity>();
-            Range = reader.ReadBinaryValue(typeof(CoreRange)) as CoreRange;
+            Range = reader.ReadBinaryValue<CoreRange>();
         }
-
-
     }
 
     public class QueryResponse<TEntity> : BaseResponse<TEntity>, ISerializeBinary where TEntity : Entity, new()
     {
-        public CoreTable? Items { get; set; }
+        public CoreTable Items { get; set; } = new CoreTable();
 
         public override void DeserializeBinary(CoreBinaryReader reader)
         {
             base.DeserializeBinary(reader);
 
-            if (reader.ReadBoolean())
-            {
-                Items = new CoreTable();
-                Items.DeserializeBinary(reader);
-            }
-            else
-            {
-                Items = null;
-            }
+            Items = new CoreTable();
+            Items.DeserializeBinary(reader);
         }
 
         public override void SerializeBinary(CoreBinaryWriter writer)
         {
             base.SerializeBinary(writer);
 
-            if(Items is null)
-            {
-                writer.Write(false);
-            }
-            else
-            {
-                writer.Write(true);
-                Items.SerializeBinary(writer);
-            }
+            Items.SerializeBinary(writer);
         }
     }
 

+ 8 - 6
InABox.Core/Query/CoreRange.cs

@@ -4,7 +4,13 @@ namespace InABox.Core
 {
     public enum CoreRangeType
     {
+        /// <summary>
+        /// Get specific range in the database query.
+        /// </summary>
         Database, 
+        /// <summary>
+        /// Get everything from the database, but only return a small number to the client.
+        /// </summary>
         Paged
     }
     public class CoreRange : ISerializeBinary
@@ -33,10 +39,6 @@ namespace InABox.Core
         public CoreRange Next()
         {
             Offset = (int)Math.Min((long)int.MaxValue, (long)Offset + (long)Limit);
-            if (Offset < int.MaxValue - Limit)
-                Offset += Limit;
-            else
-                Offset = Limit;
             return this;
         }      
         
@@ -46,14 +48,14 @@ namespace InABox.Core
         
         public void SerializeBinary(CoreBinaryWriter writer)
         {
-            writer.Write((int)Type);
+            writer.Write((byte)Type);
             writer.Write(Offset);
             writer.Write(Limit);
         }
 
         public void DeserializeBinary(CoreBinaryReader reader)
         {
-            Type = (CoreRangeType)reader.ReadInt32();
+            Type = (CoreRangeType)reader.ReadByte();
             Offset = reader.ReadInt32();
             Limit = reader.ReadInt32();
         }

+ 1 - 1
InABox.RPC.Shared/Commands/Query/RpcQueryDefinition.cs

@@ -33,7 +33,7 @@ namespace InABox.Rpc
             Filter = reader.ReadBinaryValue(typeof(Filter<>).MakeGenericType(Type)) as IFilter;
             Columns = reader.ReadBinaryValue(typeof(Columns<>).MakeGenericType(Type)) as IColumns;
             Sort = reader.ReadBinaryValue(typeof(SortOrder<>).MakeGenericType(Type)) as ISortOrder;
-            Range = reader.ReadBinaryValue(typeof(CoreRange)) as CoreRange;
+            Range = reader.ReadBinaryValue<CoreRange>();
         }
 
         public string FullDescription() => $"[{Filter}]";

+ 1 - 1
InABox.Server/RPC/Handlers/Query.cs

@@ -22,7 +22,7 @@ public class RpcQueryHandler : RpcCommandHandler<IRpcServer, RpcQueryCommand, Rp
                 try
                 {
                     var store = DbFactory.FindStore(query.Type, user.ID, user.UserID, session.Platform, session.Version ?? "");
-                    table.Table = store.Query(query.Filter, query.Columns, query.Sort);
+                    table.Table = store.Query(query.Filter, query.Columns, query.Sort, query.Range);
                 }
                 catch (Exception e)
                 {

+ 1 - 1
InABox.Server/RestService.cs

@@ -239,7 +239,7 @@ namespace InABox.API
             try
             {
                 var store = DbFactory.FindStore<TEntity>(userguid, userid, request.Credentials.Platform, request.Credentials.Version);
-                response.Items = store.Query(request.Filter, request.Columns, request.Sort);
+                response.Items = store.Query(request.Filter, request.Columns, request.Sort, request.Range);
                 response.Status = StatusCode.OK;
                 Logger.Send(LogType.Information, userid,
                     string.Format("[{0} {1}] [{2:D8}] Query{3} Complete: {4} records / {5} columns returned", request.Credentials.Platform,

+ 15 - 17
inabox.client.ipc/IPCClient.cs

@@ -64,7 +64,7 @@ namespace InABox.IPC
             Request.BeforeRequest?.Invoke(request);
         }
 
-        private IPCMessage? Send(IPCMessage request, int? timeout = null)
+        private IPCMessage Send(IPCMessage request, int? timeout = null)
         {
             return _pipe.Send(request, timeout ?? Convert.ToInt32(Timeout.TotalMilliseconds));
         }
@@ -75,7 +75,7 @@ namespace InABox.IPC
 
             PrepareRequest(request);
 
-            var response = Send(IPCMessage.Check2FA(request)).GetResponse<Check2FAResponse>();
+            var response = Send(IPCMessage.Check2FA(request))?.GetResponse<Check2FAResponse>();
             if (response != null)
             {
                 return response.Status switch
@@ -97,7 +97,7 @@ namespace InABox.IPC
 
                 PrepareRequest(request);
 
-                var response = Send(IPCMessage.Ping(request), 10_000).GetResponse<PingResponse>();
+                var response = Send(IPCMessage.Ping(request), 10_000)?.GetResponse<PingResponse>();
                 if (response != null)
                 {
                     return response.Status switch
@@ -152,12 +152,15 @@ namespace InABox.IPC
             var request = new QueryRequest<TEntity>(filter, null, sort, range);
             PrepareRequest(request);
 
-            var result = new List<TEntity>();
             var response = Send(IPCMessage.Query(request)).GetResponse<QueryResponse<TEntity>>();
             if (response.Items != null)
-                foreach (var row in response.Items.Rows)
-                    result.Add(row.ToObject<TEntity>());
-            return result.ToArray();
+            {
+                return response.Items.ToArray<TEntity>();
+            }
+            else
+            {
+                return [];
+            }
         }
 
         protected override CoreTable DoQuery(Filter<TEntity>? filter, Columns<TEntity>? columns, SortOrder<TEntity>? sort = null, CoreRange? range = null)
@@ -167,17 +170,12 @@ namespace InABox.IPC
 
             var response = Send(IPCMessage.Query(request)).GetResponse<QueryResponse<TEntity>>();
 
-            if (response != null)
+            return response.Status switch
             {
-                return response.Status switch
-                {
-                    StatusCode.OK => response.Items,
-                    StatusCode.Unauthenticated => throw new IPCException("Client not authenticated", StatusCode.Unauthenticated),
-                    _ => throw new IPCException(response.Messages),
-                };
-            }
-
-            return null;
+                StatusCode.OK => response.Items,
+                StatusCode.Unauthenticated => throw new IPCException("Client not authenticated", StatusCode.Unauthenticated),
+                _ => throw new IPCException(response.Messages),
+            };
         }
 
         protected override Dictionary<string, CoreTable> DoQueryMultiple(Dictionary<string, IQueryDef> queries)

+ 4 - 6
inabox.client.ipc/IPCClientTransport.cs

@@ -45,12 +45,11 @@ namespace InABox.Client.IPC
             Logger.Send(LogType.Error, "", $"Exception occured: {e.Exception.Message}");
         }
 
-        public IPCMessage? Send(IPCMessage request, int timeout = DefaultRequestTimeout)
+        public IPCMessage Send(IPCMessage request, int timeout = DefaultRequestTimeout)
         {
             var ev = Queue(request.RequestID);
             Client.WriteAsync(request);
-            var result = GetResult(request.RequestID, ev, timeout);
-            return result;
+            return GetResult(request.RequestID, ev, timeout);
         }
 
         public ManualResetEventSlim Queue(Guid id)
@@ -60,11 +59,10 @@ namespace InABox.Client.IPC
             return ev;
         }
 
-        public IPCMessage? GetResult(Guid id, ManualResetEventSlim ev, int timeout)
+        public IPCMessage GetResult(Guid id, ManualResetEventSlim ev, int timeout)
         {
-            if (Responses.TryGetValue(id, out var result))
+            if (Responses.Remove(id, out var result))
             {
-                Responses.Remove(id, out result);
                 Events.Remove(id, out ev);
                 return result;
             }

+ 1 - 0
inabox.wpf/DynamicGrid/DynamicGridCommon.cs

@@ -77,6 +77,7 @@ public class DynamicGridOptions
         RecordCount = false;
         HideDatabaseFilters = false;
         HideDirectEditButton = false;
+		PageSize = int.MaxValue;
         return EndUpdate();
     }