コード例 #1
0
        void Send(Header h)
        {
            gotAck  = false;
            gotNack = false;
            gui.ShowMessage("Command " + Enum.GetName(typeof(OPCODE), h.Opcode) + " sent");
            log.Debug("Command " + Enum.GetName(typeof(OPCODE), h.Opcode) + " sent");
            switch (h.Opcode)
            {
            case OPCODE.RequestMonitoringReport:
            case OPCODE.IdentifyAndSeparate:
                monitorReportReceived = false;
                break;

            case OPCODE.ConfigureHwfe:
                hwStateReceived  = false;
                feStatusEeceived = false;
                break;

            case OPCODE.ConfigureSwfe:
                swStateReceived  = false;
                feStatusEeceived = false;
                break;

            case OPCODE.StartFe:
                feStatusEeceived = false;
                break;
            }
            client.Send(MessageExtensions.ToByteArray(h));
        }
コード例 #2
0
        public void GlobalSetup()
        {
            var marshaller = Marshallers.Create((arg) => MessageExtensions.ToByteArray(arg), bytes => new ChatMessage());
            var method     = new Method <ChatMessage, ChatMessage>(MethodType.Unary, typeof(TestService).FullName, nameof(TestService.SayHello), marshaller, marshaller);

            _callHandler = new UnaryServerCallHandler <ChatMessage, ChatMessage, TestService>(method);

            _trailers = new HeaderDictionary();

            var messageData = new ChatMessage
            {
                Name = "Joe"
            }.ToByteArray();

            _requestStream = new MemoryStream();
            MessageHelpers.WriteMessage(_requestStream, messageData);

            var services = new ServiceCollection();

            services.TryAddSingleton <IGrpcServiceActivator <TestService> >(new TestGrpcServiceActivator <TestService>(new TestService()));
            _requestServices = services.BuildServiceProvider();

            _httpContext = new DefaultHttpContext();
            _httpContext.RequestServices = _requestServices;
            _httpContext.Request.Body    = _requestStream;

            _httpContext.Features.Set <IHttpResponseTrailersFeature>(new TestHttpResponseTrailersFeature
            {
                Trailers = _trailers
            });
        }
コード例 #3
0
ファイル: CygnusDevice.cs プロジェクト: rotshtein/SatManager
 void Send(Header h)
 {
     gui.ShowMessage("Command " + Enum.GetName(typeof(OPCODE), h.Opcode) + " sent");
     log.Debug("Command " + Enum.GetName(typeof(OPCODE), h.Opcode) + " sent");
     gotAck  = false;
     gotNack = false;
     client.Send(MessageExtensions.ToByteArray(h));
 }
コード例 #4
0
    void OnConnectSucc()
    {
        UnityEngine.Debug.Log("connect success ");
        PBLoginReq req = new PBLoginReq();

        req.Token  = token;
        req.UserId = userId;
        Packet packet = new Packet(PACKET_TYPE.PACKET_CLLogin, MessageExtensions.ToByteArray(req));

        NetClient.Instance.PushPacket(packet);
    }
コード例 #5
0
        public void GlobalSetup()
        {
            var marshaller = Marshallers.Create((arg) => MessageExtensions.ToByteArray(arg), bytes => new ChatMessage());
            var method     = new Method <ChatMessage, ChatMessage>(MethodType.Unary, typeof(TestService).FullName, nameof(TestService.SayHello), marshaller, marshaller);

            _callHandler = new UnaryServerCallHandler <ChatMessage, ChatMessage, TestService>(method);

            var services = new ServiceCollection();

            services.TryAddSingleton <IGrpcServiceActivator <TestService> >(new TestGrpcServiceActivator <TestService>(new TestService()));
            _requestServices = services.BuildServiceProvider();
        }
コード例 #6
0
   static void __Helper_SerializeMessage(IMessage message, grpc.SerializationContext context)
   {
 #if !GRPC_DISABLE_PROTOBUF_BUFFER_SERIALIZATION
       if (message is IBufferMessage)
       {
           context.SetPayloadLength(message.CalculateSize());
           MessageExtensions.WriteTo(message, context.GetBufferWriter());
           context.Complete();
           return;
       }
 #endif
       context.Complete(MessageExtensions.ToByteArray(message));
   }
コード例 #7
0
        public void GlobalSetup()
        {
            var message = new ChatMessage
            {
                Name =
                    "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed at ligula nec orci placerat mollis. " +
                    "Interdum et malesuada fames ac ante ipsum primis in faucibus. Ut aliquet non nunc id lobortis. " +
                    "In tincidunt ac sapien sit amet consequat. Interdum et malesuada fames ac ante ipsum primis in faucibus. " +
                    "Duis vel tristique ipsum, eget hendrerit justo. Donec accumsan, purus quis cursus auctor, sapien nisi " +
                    "lacinia ligula, ut vehicula lorem augue vel est. Vestibulum finibus ornare vulputate."
            };

            var services = new ServiceCollection();

            services.TryAddSingleton <IGrpcInterceptorActivator <UnaryAwaitInterceptor> >(new TestGrpcInterceptorActivator <UnaryAwaitInterceptor>(new UnaryAwaitInterceptor()));
            var serviceProvider = services.BuildServiceProvider();

            var marshaller = Marshallers.Create((arg) => MessageExtensions.ToByteArray(arg), bytes => new ChatMessage());
            var method     = new Method <ChatMessage, ChatMessage>(MethodType.Unary, typeof(TestService).FullName, nameof(TestService.SayHello), marshaller, marshaller);
            var result     = Task.FromResult(new ChatMessage());

            _callHandler = new UnaryServerCallHandler <TestService, ChatMessage, ChatMessage>(
                method,
                (service, request, context) => result,
                ServiceOptions,
                NullLoggerFactory.Instance,
                new TestGrpcServiceActivator <TestService>(new TestService()),
                serviceProvider);

            _trailers = new HeaderDictionary();

            _requestMessage = GetMessageData(message);

            _requestPipe = new TestPipeReader();

            _requestServices = serviceProvider;

            _httpContext = new DefaultHttpContext();
            _httpContext.RequestServices     = _requestServices;
            _httpContext.Request.ContentType = GrpcProtocolConstants.GrpcContentType;
            _httpContext.Request.Protocol    = GrpcProtocolConstants.Http2Protocol;

            _httpContext.Features.Set <IRequestBodyPipeFeature>(new TestRequestBodyPipeFeature(_requestPipe));
            _httpContext.Features.Set <IHttpResponseBodyFeature>(new TestResponseBodyFeature(new TestPipeWriter()));
            _httpContext.Features.Set <IHttpResponseTrailersFeature>(new TestHttpResponseTrailersFeature
            {
                Trailers = _trailers
            });
            SetupHttpContext(_httpContext);
        }
コード例 #8
0
        static void Main(string[] args)
        {
            Con c = new Con();

            c.connect("127.0.0.1:6667");

            while (true)
            {
                Package.ChatMessage cm = new Package.ChatMessage {
                    Txt = Console.ReadLine(),
                    Tag = DateTime.Now.Ticks
                };
                c.sendPackage(MessageExtensions.ToByteArray(cm));
            }
        }
コード例 #9
0
        public void GlobalSetup()
        {
            var services = new ServiceCollection();

            services.TryAddSingleton <IGrpcInterceptorActivator <UnaryAwaitInterceptor> >(new TestGrpcInterceptorActivator <UnaryAwaitInterceptor>(new UnaryAwaitInterceptor()));
            var serviceProvider = services.BuildServiceProvider();

            var marshaller = Marshallers.Create((arg) => MessageExtensions.ToByteArray(arg), bytes => new ChatMessage());
            var method     = new Method <ChatMessage, ChatMessage>(MethodType.Unary, typeof(TestService).FullName, nameof(TestService.SayHello), marshaller, marshaller);
            var result     = Task.FromResult(new ChatMessage());

            _callHandler = new UnaryServerCallHandler <TestService, ChatMessage, ChatMessage>(
                method,
                (service, request, context) => result,
                new GrpcServiceMethodOptions(method.Name),
                ServiceOptions,
                NullLoggerFactory.Instance,
                new TestGrpcServiceActivator <TestService>(new TestService()),
                serviceProvider);

            _trailers = new HeaderDictionary();

            var message = new ChatMessage
            {
                Name = "Joe"
            };

            var ms = new MemoryStream();

            MessageHelpers.WriteMessage(ms, message);
            _requestMessage = ms.ToArray();

            _requestPipe = new TestPipeReader();

            _requestServices = serviceProvider;

            _httpContext = new DefaultHttpContext();
            _httpContext.RequestServices     = _requestServices;
            _httpContext.Request.ContentType = GrpcProtocolConstants.GrpcContentType;

            _httpContext.Features.Set <IRequestBodyPipeFeature>(new TestRequestBodyPipeFeature(_requestPipe));
            _httpContext.Features.Set <IHttpResponseBodyFeature>(new TestResponseBodyFeature(new TestPipeWriter()));
            _httpContext.Features.Set <IHttpResponseTrailersFeature>(new TestHttpResponseTrailersFeature
            {
                Trailers = _trailers
            });
            SetupHttpContext(_httpContext);
        }
コード例 #10
0
        /// <summary>
        /// Registers a method in GRPC service.
        /// </summary>
        /// <typeparam name="TRequest"></typeparam>
        /// <typeparam name="TResponse"></typeparam>
        /// <param name="name"></param>
        /// <param name="handler"></param>
        protected void RegisterMethod <TRequest, TResponse>(string name, UnaryServerMethod <TRequest, TResponse> handler)
            where TRequest : class, IMessage <TRequest>, new()
            where TResponse : class, IMessage <TResponse>, new()
        {
            var requestParser  = GetOrCreateMessageParser <TRequest>();
            var responseParser = GetOrCreateMessageParser <TResponse>();

            var method = new Method <TRequest, TResponse>(
                MethodType.Unary,
                _serviceName,
                name,
                Marshallers.Create((arg) => arg != null ? MessageExtensions.ToByteArray(arg) : Array.Empty <byte>(), requestParser.ParseFrom),
                Marshallers.Create((arg) => arg != null ? MessageExtensions.ToByteArray(arg) : Array.Empty <byte>(), responseParser.ParseFrom));

            _builder.AddMethod(method, handler);
        }
コード例 #11
0
        public bool TrySerialize(IMessage m, out byte[] result)
        {
            Type type = ((object)m).GetType();

            if (ProtocolMap.identifiers.TryGetValue(type, out int value))
            {
                MemoryStream memoryStream = new MemoryStream();
                memoryStream.WriteInt(value, 4, bigIndian: true);
                byte[] array = MessageExtensions.ToByteArray(m);
                memoryStream.Write(array, 0, array.Length);
                result = memoryStream.ToArray();
                return(true);
            }
            Debug.LogError((object)("Unable to serialize message " + type.Name + ": no known id for it"));
            result = new byte[0];
            return(false);
        }
コード例 #12
0
        /// <summary>
        /// Gets the client interceptor context for testing purposes.
        /// </summary>
        /// <returns>The client interceptor context.</returns>
        private ClientInterceptorContext <HelloRequest, HelloResponse> GetClientInterceptorContext()
        {
            Marshaller <HelloRequest> requestMarshaller = Marshallers.Create(
                (arg) => MessageExtensions.ToByteArray(arg),
                HelloRequest.Parser.ParseFrom);

            Marshaller <HelloResponse> responseMarshaller = Marshallers.Create(
                (arg) => MessageExtensions.ToByteArray(arg),
                HelloResponse.Parser.ParseFrom);

            Method <HelloRequest, HelloResponse> unaryMethod =
                new Method <HelloRequest, HelloResponse>(
                    MethodType.Unary, TEST_SERVICE, TEST_METHOD, requestMarshaller,
                    responseMarshaller);

            ClientInterceptorContext <HelloRequest, HelloResponse> context =
                new ClientInterceptorContext <HelloRequest, HelloResponse>(
                    unaryMethod, TEST_HOST, new CallOptions(TEST_REQUEST_METADATA));

            return(context);
        }
コード例 #13
0
        private async Task GenerateAndSendHeadersAsync(ServerCallContext context, int nrOfRows, int nrOfCols, List <ResultDataColumn> resultDataColumns, bool cacheResultInQlik)
        {
            //Send TableDescription header
            TableDescription tableDesc = new TableDescription
            {
                NumberOfRows = nrOfRows
            };

            for (int col = 0; col < nrOfCols; col++)
            {
                if (String.IsNullOrEmpty(resultDataColumns[col].Name))
                {
                    tableDesc.Fields.Add(new FieldDescription
                    {
                        DataType = resultDataColumns[col].DataType
                    });
                }
                else
                {
                    tableDesc.Fields.Add(new FieldDescription
                    {
                        DataType = resultDataColumns[col].DataType,
                        Name     = resultDataColumns[col].Name
                    });
                }
            }

            var tableMetadata = new Metadata
            {
                { new Metadata.Entry("qlik-tabledescription-bin", MessageExtensions.ToByteArray(tableDesc)) }
            };

            if (!cacheResultInQlik)
            {
                tableMetadata.Add("qlik-cache", "no-store");
            }

            await context.WriteResponseHeadersAsync(tableMetadata);
        }
コード例 #14
0
        /// <summary>
        /// Creates a method definition to be called using GRPC.
        /// </summary>
        /// <typeparam name="TRequest">type of request message</typeparam>
        /// <typeparam name="TResponse">type of response message</typeparam>
        /// <param name="name">name of gRPC method</param>
        protected Method <TRequest, TResponse> GetOrCreateMethod <TRequest, TResponse>(string name)
            where TRequest : class, IMessage <TRequest>, new()
            where TResponse : class, IMessage <TResponse>, new()
        {
            if (!_methods.TryGetValue(name, out object method))
            {
                var requestParser  = GetOrCreateMessageParser <TRequest>();
                var responseParser = GetOrCreateMessageParser <TResponse>();

                var clientMethod = new Method <TRequest, TResponse>(
                    MethodType.Unary,
                    _serviceName,
                    name,
                    Marshallers.Create((arg) => arg != null ? MessageExtensions.ToByteArray(arg) : Array.Empty <byte>(), requestParser.ParseFrom),
                    Marshallers.Create((arg) => arg != null ? MessageExtensions.ToByteArray(arg) : Array.Empty <byte>(), responseParser.ParseFrom));

                _methods.Add(name, clientMethod);
                return(clientMethod);
            }

            return((Method <TRequest, TResponse>)method);
        }
コード例 #15
0
ファイル: RServeEvaluator.cs プロジェクト: lilasintesMZ/AAI
        private async Task GenerateResult(Sexp RResult, IServerStreamWriter <global::Qlik.Sse.BundledRows> responseStream, ServerCallContext context,
                                          bool failIfWrongDataTypeInFirstCol = false, DataType expectedFirstDataType = DataType.Numeric, bool cacheResultInQlik = true)
        {
            int nrOfCols = 0;
            int nrOfRows = 0;

            ResultDataColumn[] resultDataColumns = null;
            var names = RResult.Names;

            if (names != null)
            {
                logger.Debug($"Rserve result column names: {String.Join(", ", names)}");
            }

            if (RResult is SexpList)
            {
                // Indicating this is a data.frame/matrix response structure. Figure out how many columns, names and data types
                nrOfCols = RResult.Count;
                logger.Debug($"Rserve result nrOfColumns: {nrOfCols}");
                if (RResult.Attributes != null && RResult.Attributes.Count > 0)
                {
                    Sexp resObjectNames;

                    if ((names == null || names.Length == 0) && RResult.Attributes.TryGetValue("names", out resObjectNames))
                    {
                        names = resObjectNames.AsStrings;
                        logger.Debug($"Rserve result column names: {String.Join(", ", names)}");
                    }

                    Sexp resObjectClass;

                    if (RResult.Attributes.TryGetValue("class", out resObjectClass))
                    {
                        logger.Debug($"Rserve result object class: {resObjectClass.ToString()}");
                    }
                }
                if (nrOfCols > 0)
                {
                    var columns = RResult.AsList;
                    resultDataColumns = GetResultDataColumns(ref nrOfRows, names, columns);
                }
            }
            else if (RResult is SexpArrayBool || RResult is SexpArrayDouble || RResult is SexpArrayInt)
            {
                nrOfCols = 1;
                var bundledRows = new BundledRows();
                var numerics    = RResult.AsDoubles;
                nrOfRows = numerics.Length;

                var c = new ResultDataColumn();
                c.Name               = "";
                c.DataType           = DataType.Numeric;
                c.Numerics           = numerics;
                resultDataColumns    = new ResultDataColumn[1];
                resultDataColumns[0] = c;

                if (logger.IsTraceEnabled)
                {
                    var logNumerics = String.Join(", ", numerics);
                    logger.Trace("Numeric result column data[0]: {0}", logNumerics);
                }
            }
            else if (RResult is SexpArrayString)
            {
                nrOfCols = 1;
                var bundledRows = new BundledRows();
                var strings     = RResult.AsStrings;
                nrOfRows = strings.Length;

                var c = new ResultDataColumn();
                c.Name               = "";
                c.DataType           = DataType.String;
                c.Strings            = strings;
                resultDataColumns    = new ResultDataColumn[1];
                resultDataColumns[0] = c;

                if (logger.IsTraceEnabled)
                {
                    var logStrings = String.Join(", ", strings);
                    logger.Trace("String result column data[0]: {0}", logStrings);
                }
            }
            else
            {
                logger.Warn($"Rserve result, column data type not recognized: {RResult.GetType().ToString()}");
                throw new NotImplementedException();
            }

            if (resultDataColumns != null)
            {
                if (failIfWrongDataTypeInFirstCol && expectedFirstDataType != resultDataColumns[0].DataType)
                {
                    string msg = $"Rserve result datatype mismatch in first column, expected {expectedFirstDataType}, got {resultDataColumns[0].DataType}";
                    logger.Warn($"{msg}");
                    throw new RpcException(new Status(StatusCode.InvalidArgument, $"{msg}"));
                }

                //Send TableDescription header
                TableDescription tableDesc = new TableDescription
                {
                    NumberOfRows = nrOfRows
                };

                for (int col = 0; col < nrOfCols; col++)
                {
                    if (String.IsNullOrEmpty(resultDataColumns[col].Name))
                    {
                        tableDesc.Fields.Add(new FieldDescription
                        {
                            DataType = resultDataColumns[col].DataType
                        });
                    }
                    else
                    {
                        tableDesc.Fields.Add(new FieldDescription
                        {
                            DataType = resultDataColumns[col].DataType,
                            Name     = resultDataColumns[col].Name
                        });
                    }
                }

                var tableMetadata = new Metadata
                {
                    { new Metadata.Entry("qlik-tabledescription-bin", MessageExtensions.ToByteArray(tableDesc)) }
                };

                if (!cacheResultInQlik)
                {
                    tableMetadata.Add("qlik-cache", "no-store");
                }

                await context.WriteResponseHeadersAsync(tableMetadata);

                // Send data
                var bundledRows = new BundledRows();

                for (int i = 0; i < nrOfRows; i++)
                {
                    var row = new Row();

                    for (int col = 0; col < nrOfCols; col++)
                    {
                        if (resultDataColumns[col].DataType == DataType.Numeric)
                        {
                            row.Duals.Add(new Dual()
                            {
                                NumData = resultDataColumns[col].Numerics[i]
                            });
                        }
                        else if (resultDataColumns[col].DataType == DataType.String)
                        {
                            row.Duals.Add(new Dual()
                            {
                                StrData = resultDataColumns[col].Strings[i] ?? ""
                            });
                        }
                    }
                    bundledRows.Rows.Add(row);
                    if (((i + 1) % 2000) == 0)
                    {
                        // Send a bundle
                        await responseStream.WriteAsync(bundledRows);

                        bundledRows = new BundledRows();
                    }
                }

                if (bundledRows.Rows.Count() > 0)
                {
                    // Send last bundle
                    await responseStream.WriteAsync(bundledRows);
                }
            }
        }
コード例 #16
0
        protected virtual Marshaller <ChatMessage> CreateMarshaller()
        {
            var marshaller = Marshallers.Create((arg) => MessageExtensions.ToByteArray(arg), bytes => new ChatMessage());

            return(marshaller);
        }
コード例 #17
0
        /// <summary>
        /// Return the results from connector to Qlik Engine
        /// </summary>
        private async Task GenerateResult(string request_type, MemoryStream returnedData, IServerStreamWriter <global::Qlik.Sse.BundledRows> responseStream, ServerCallContext context, int reqHash,
                                          bool failIfWrongDataTypeInFirstCol = false, DataType expectedFirstDataType = DataType.Numeric, bool cacheResultInQlik = true, ResultDataColumn keyField = null, string keyname = null, bool includeDetail = false, bool rawExplain = false)
        {
            int nrOfCols = 0;
            int nrOfRows = 0;
            List <ResultDataColumn> resultDataColumns = new List <ResultDataColumn>();

            Logger.Info($"{reqHash} - Generate Results");

            if (true)
            {
                Logger.Debug($"{reqHash} - Extract JSON");
                //Convert the stream (json) to dictionary
                Logger.Info($"{reqHash} - Returned Datasize: {returnedData.Length}");
                Logger.Info($"{reqHash} - Request Type: {request_type}");

                StreamReader sr = new StreamReader(returnedData);
                returnedData.Position = 0;
                var data = sr.ReadToEnd();
                Dictionary <string, dynamic> response = JsonConvert.DeserializeObject <Dictionary <string, dynamic> >(data);
                Logger.Trace($"{reqHash} - Returned Data: {data}");


                if (response.ContainsKey("data"))
                {
                    //Prediction Column
                    var a = new ResultDataColumn();
                    a.Name     = "Prediction";
                    a.DataType = DataType.String;
                    a.Strings  = new List <string>();

                    //Time Series Columns
                    var seriesId         = new ResultDataColumn();
                    var forecastPoint    = new ResultDataColumn();
                    var rowId            = new ResultDataColumn();
                    var timestamp        = new ResultDataColumn();
                    var forecastDistance = new ResultDataColumn();
                    if (request_type == "timeseries")
                    {
                        seriesId.Name     = "seriesId";
                        seriesId.DataType = DataType.String;
                        seriesId.Strings  = new List <string>();

                        forecastPoint.Name     = "forecastPoint";
                        forecastPoint.DataType = DataType.String;
                        forecastPoint.Strings  = new List <string>();

                        rowId.Name     = "rowId";
                        rowId.DataType = DataType.String;
                        rowId.Strings  = new List <string>();

                        timestamp.Name     = "timestamp";
                        timestamp.DataType = DataType.String;
                        timestamp.Strings  = new List <string>();

                        forecastDistance.Name     = "forecastDistance";
                        forecastDistance.DataType = DataType.String;
                        forecastDistance.Strings  = new List <string>();
                    }

                    var pe = new ResultDataColumn();
                    if (rawExplain == true)
                    {
                        pe.Name     = $"Prediction Explanations";
                        pe.DataType = DataType.String;
                        pe.Strings  = new List <string>();
                    }

                    //The first row will determine which fields to return in table for prediction values
                    bool fieldListAgreed = false;



                    //Loop through each response in array (one for each row of input data)
                    foreach (dynamic p in response["data"])
                    {
                        // **** For debug to display array data on console ****
                        Logger.Info($"{reqHash} {p}");

                        a.Strings.Add(Convert.ToString(p["prediction"]));

                        // Add Time Series Column Data
                        if (request_type == "timeseries")
                        {
                            seriesId.Strings.Add(Convert.ToString(p["seriesId"]));
                            forecastPoint.Strings.Add(Convert.ToString(p["forecastPoint"]));
                            rowId.Strings.Add(Convert.ToString(p["rowId"]));
                            timestamp.Strings.Add(Convert.ToString(p["timestamp"]));
                            forecastDistance.Strings.Add(Convert.ToString(p["forecastDistance"]));
                        }

                        if (includeDetail == true)
                        {
                            if (fieldListAgreed == false)
                            {
                                foreach (dynamic pv in p["predictionValues"])
                                {
                                    var pvi = new ResultDataColumn();
                                    pvi.Name     = $"Prediction value for label: {pv["label"]}";
                                    pvi.DataType = DataType.String;
                                    pvi.Strings  = new List <string>();
                                    resultDataColumns.Add(pvi);
                                }

                                fieldListAgreed = true;
                                Logger.Trace($"{reqHash} - Columns: {resultDataColumns.Count}");
                            }

                            //Loop through each predicted value and insert the row values to the column
                            int index = 0;

                            foreach (dynamic pv in p["predictionValues"])
                            {
                                resultDataColumns[index].Strings.Add(Convert.ToString(pv["value"]));
                                index++;
                            }
                        }

                        if (rawExplain == true)
                        {
                            pe.Strings.Add(Convert.ToString(p["predictionExplanations"]));
                        }
                    }

                    if (keyname != null)
                    {
                        resultDataColumns.Add(keyField);
                    }

                    if (rawExplain == true)
                    {
                        resultDataColumns.Add(pe);
                    }

                    // Add Time Series Columns to resultData
                    if (request_type == "timeseries")
                    {
                        resultDataColumns.Add(seriesId);
                        resultDataColumns.Add(forecastPoint);
                        resultDataColumns.Add(rowId);
                        resultDataColumns.Add(timestamp);
                        resultDataColumns.Add(forecastDistance);
                    }


                    resultDataColumns.Add(a);
                }
                else if (response.ContainsKey("response"))
                {
                    var a = new ResultDataColumn();
                    a.Name     = "Result";
                    a.DataType = DataType.String;
                    a.Strings  = new List <string>();
                    a.Strings.Add(Convert.ToString(response["response"]["id"]));

                    resultDataColumns.Add(a);
                }
                else
                {
                    if (response.ContainsKey("message"))
                    {
                        throw new Exception($"The following error message was returned from DataRobot: {response["message"]}");
                    }
                    else
                    {
                        throw new Exception($"An Unknown Error Occured: {data}");
                    }
                }

                nrOfRows = resultDataColumns[0].DataType == DataType.String ? resultDataColumns[0].Strings.Count : resultDataColumns[0].Numerics.Count;
                nrOfCols = resultDataColumns.Count;
                Logger.Debug($"{reqHash} - Result Number of Columns: {nrOfCols}");
            }


            if (resultDataColumns != null)
            {
                if (failIfWrongDataTypeInFirstCol && expectedFirstDataType != resultDataColumns[0].DataType)
                {
                    string msg = $"Result datatype mismatch in first column, expected {expectedFirstDataType}, got {resultDataColumns[0].DataType}";
                    Logger.Warn($"{reqHash} - {msg}");
                    throw new RpcException(new Status(StatusCode.InvalidArgument, $"{msg}"));
                }

                //Send TableDescription header
                TableDescription tableDesc = new TableDescription
                {
                    NumberOfRows = nrOfRows
                };

                for (int col = 0; col < nrOfCols; col++)
                {
                    if (String.IsNullOrEmpty(resultDataColumns[col].Name))
                    {
                        tableDesc.Fields.Add(new FieldDescription
                        {
                            DataType = resultDataColumns[col].DataType
                        });
                    }
                    else
                    {
                        tableDesc.Fields.Add(new FieldDescription
                        {
                            DataType = resultDataColumns[col].DataType,
                            Name     = resultDataColumns[col].Name
                        });
                    }
                }

                var tableMetadata = new Metadata
                {
                    { new Metadata.Entry("qlik-tabledescription-bin", MessageExtensions.ToByteArray(tableDesc)) }
                };

                if (!cacheResultInQlik)
                {
                    tableMetadata.Add("qlik-cache", "no-store");
                }

                await context.WriteResponseHeadersAsync(tableMetadata);

                // Send data
                var bundledRows = new BundledRows();

                for (int i = 0; i < nrOfRows; i++)
                {
                    var row = new Row();

                    for (int col = 0; col < nrOfCols; col++)
                    {
                        if (resultDataColumns[col].DataType == DataType.Numeric)
                        {
                            row.Duals.Add(new Dual()
                            {
                                NumData = resultDataColumns[col].Numerics[i]
                            });
                        }
                        else if (resultDataColumns[col].DataType == DataType.String)
                        {
                            row.Duals.Add(new Dual()
                            {
                                StrData = resultDataColumns[col].Strings[i] ?? ""
                            });
                        }
                    }
                    bundledRows.Rows.Add(row);
                    if (((i + 1) % 2000) == 0)
                    {
                        // Send a bundle
                        await responseStream.WriteAsync(bundledRows);

                        bundledRows = null;
                        bundledRows = new BundledRows();
                    }
                }

                if (bundledRows.Rows.Count() > 0)
                {
                    // Send last bundle
                    await responseStream.WriteAsync(bundledRows);

                    bundledRows = null;
                }
            }
        }
コード例 #18
0
 public static MessagePacket CreateQueryMessage(string userID, int contractID, IMessage body = null)
 {
     return(new MessagePacket(userID, GloblParams.CurrentClientType, MessageType.Query_Req, contractID, (body == null) ? null : MessageExtensions.ToByteArray(body)));
 }