Example #1
0
        protected void AssertDataRow(int columnCount, DataRow[] rows)
        {
            var found = PostgresMessage.ReadMessage(
                Buffer, ref Offset, ref Length,
                ref ReadState, ref ClientState, out var message);

            Assert.IsTrue(found);
            Assert.IsTrue(message is DataRowMessage);
            var dataMessage = (DataRowMessage)message;

            // If used to generate test code, verify the data against known
            // values from wireshark or the like.
            //var description = string.Join(",\n", dataMessage.Rows.Select(t =>
            //    $"new DataRow({t.Length}, new byte[] {{{string.Join(",", t.Data.Select(q => $"0x{q:X2}"))}}})"));

            Assert.AreEqual(columnCount, dataMessage.ColumnCount);
            Assert.AreEqual(columnCount, rows.Length);

            for (var i = 0; i < columnCount; ++i)
            {
                var expected = rows[i];
                var actual   = dataMessage.Rows[i];

                Assert.AreEqual(expected.Length, actual.Length);
                AssertArray(expected.Data, actual.Data, actual.Length);
            }
        }
        private bool PostgresMessageRead(out IPostgresMessage message)
        {
            while (true)
            {
                var foundMessage = PostgresMessage.ReadMessage(
                    _buffer, ref _bufferOffset, ref _bufferCount,
                    ref _readState, ref ClientState, out message);

                if (foundMessage)
                {
                    // https://www.postgresql.org/docs/10/static/protocol-flow.html#PROTOCOL-ASYNC
                    // TODO: Handle 'LISTEN'
                    switch (message)
                    {
                    case ErrorResponseMessage errorMessage:
                        throw new PostgresErrorException(errorMessage);

                    case NoticeResponseMessage noticeMessage:
                        NoticeResponse?.Invoke(
                            this, noticeMessage.PublicCloneNotices());
                        continue;

                    case ParameterStatusMessage paramMessage:
                        ClientState.SetParameter(paramMessage);
                        continue;
                    }
                }

                return(foundMessage);
            }
        }
Example #3
0
        protected void AssertReadNeedsMoreData()
        {
            var found = PostgresMessage.ReadMessage(
                Buffer, ref Offset, ref Length,
                ref ReadState, ref ClientState, out var message);

            Assert.IsFalse(found);
        }
Example #4
0
        protected void AssertBindComplete()
        {
            var found = PostgresMessage.ReadMessage(
                Buffer, ref Offset, ref Length,
                ref ReadState, ref ClientState, out var message);

            Assert.IsTrue(found);
            Assert.IsTrue(message is BindCompleteMessage);
        }
Example #5
0
        protected void AssertReadyForQuery(TransactionIndicatorType type)
        {
            var found = PostgresMessage.ReadMessage(
                Buffer, ref Offset, ref Length,
                ref ReadState, ref ClientState, out var message);

            Assert.IsTrue(found);
            Assert.IsTrue(message is ReadyForQueryMessage);
            var dataMessage = (ReadyForQueryMessage)message;

            Assert.AreEqual(type, dataMessage.TransactionIndicatorType);
        }
Example #6
0
        protected void AssertCommandComplete(string tag)
        {
            var found = PostgresMessage.ReadMessage(
                Buffer, ref Offset, ref Length,
                ref ReadState, ref ClientState, out var message);

            Assert.IsTrue(found);
            Assert.IsTrue(message is CommandCompleteMessage);
            var dataMessage = (CommandCompleteMessage)message;

            Assert.AreEqual(tag, dataMessage.Tag);
        }
Example #7
0
        protected void FastForwardDataRow(int count)
        {
            for (var i = 0; i < count; ++i)
            {
                var found = PostgresMessage.ReadMessage(
                    Buffer, ref Offset, ref Length,
                    ref ReadState, ref ClientState, out var message);

                Assert.IsTrue(found);
                Assert.IsTrue(message is DataRowMessage);
            }
        }
Example #8
0
        protected void AssertBackendKeyData(int pid, int key)
        {
            var found = PostgresMessage.ReadMessage(
                Buffer, ref Offset, ref Length,
                ref ReadState, ref ClientState, out var message);

            Assert.IsTrue(found);
            Assert.IsTrue(message is BackendKeyDataMessage);
            var dataMessage = (BackendKeyDataMessage)message;

            Assert.AreEqual(pid, dataMessage.ProcessId);
            Assert.AreEqual(key, dataMessage.SecretKey);
        }
Example #9
0
        protected void AssertParameterStatus(string name, string key)
        {
            var found = PostgresMessage.ReadMessage(
                Buffer, ref Offset, ref Length,
                ref ReadState, ref ClientState, out var message);

            Assert.IsTrue(found);
            Assert.IsTrue(message is ParameterStatusMessage);
            var parameterMessage = (ParameterStatusMessage)message;

            Assert.AreEqual(name, parameterMessage.ParameterName);
            Assert.AreEqual(key, parameterMessage.Value);
        }
Example #10
0
        protected void AssertAuthorizationOk()
        {
            var found = PostgresMessage.ReadMessage(
                Buffer, ref Offset, ref Length,
                ref ReadState, ref ClientState, out var message);

            Assert.IsTrue(found);
            Assert.IsTrue(message is AuthenticationMessage);
            using (var authMessage = (AuthenticationMessage)message)
            {
                Assert.AreEqual(AuthenticationMessageType.Ok, authMessage.AuthenticationMessageType);
                Assert.IsNull(authMessage.MD5PasswordSalt);
                Assert.IsNull(authMessage.GSSAuthenticationData);
            }
        }
Example #11
0
        protected void AssertRowDescription(
            int fieldCount,
            ColumnDescription[] descriptions)
        {
            var found = PostgresMessage.ReadMessage(
                Buffer, ref Offset, ref Length,
                ref ReadState, ref ClientState, out var message);

            Assert.IsTrue(found);
            Assert.IsTrue(message is RowDescriptionMessage);
            var dataMessage = (RowDescriptionMessage)message;

            // If used to generate test code, verify the data against known
            // values from wireshark or the like.
            var fields = string.Join(", ", dataMessage.Fields.Select(t =>
                                                                     $@"new RowDescriptionField {{
                    Name = ""{t.Name}"",
                    TableObjectId = {t.TableObjectId},
                    AttributeNumber = {t.ColumnIndex},
                    DataTypeObjectId = {t.DataTypeObjectId},
                    DataTypeSize = {t.DataTypeSize},
                    TypeModifier = {t.TypeModifier},
                    FormatCode = {t.FormatCode}
                }}"));

            Assert.AreEqual(fieldCount, dataMessage.FieldCount);

            for (var i = 0; i < fieldCount; ++i)
            {
                var expected = descriptions[i];
                var actual   = dataMessage.Fields[i];

                Assert.AreEqual(expected.Name, actual.Name);
                Assert.AreEqual(expected.TableObjectId, actual.TableObjectId);
                Assert.AreEqual(expected.ColumnIndex, actual.ColumnIndex);
                Assert.AreEqual(expected.DataTypeObjectId, actual.DataTypeObjectId);
                Assert.AreEqual(expected.DataTypeSize, actual.DataTypeSize);
                Assert.AreEqual(expected.TypeModifier, actual.TypeModifier);
                Assert.AreEqual(expected.FormatCode, actual.FormatCode);
            }
        }
        public async Task <JsonResult> ReadWebTrafficByClientID()
        {
            try
            {
                List <PostgresMessage> postgresMessages = new List <PostgresMessage>();
                using (var sqlCon = new NpgsqlConnection(ConfigVars.Instance.PostgresDBConnectionString))
                {
                    sqlCon.Open();
                    using (NpgsqlCommand cmd = new NpgsqlCommand(string.Format("select \"Offset\",\"Message\",\"Topic\",\"Partition\" from fxvip where \"Message\" like '%{0}%';", ConfigVars.Instance.clientID), sqlCon))
                    {
                        using (NpgsqlDataReader reader = cmd.ExecuteReader())
                        {
                            while (reader.HasRows)
                            {
                                while (reader.Read())
                                {
                                    PostgresMessage kafkaMessage = new PostgresMessage();
                                    kafkaMessage.offset    = (int)reader["offset"];
                                    kafkaMessage.partition = (int)reader["partition"];
                                    kafkaMessage.topic     = (string)reader["topic"];
                                    kafkaMessage.message   = (string)reader["message"];
                                    postgresMessages.Add(kafkaMessage);
                                }

                                if (reader.NextResult() == false)
                                {
                                    break;
                                }
                            }
                        }
                    }

                    return(Json(postgresMessages));
                }
            }
            catch (Exception exception)
            {
                return(Json(null));
            }
        }