예제 #1
0
        private bool ReadNotifyMessages(SqlConnection connection)
        {
            var identifiers = new EventMessageIdentifiers();
            var eventFilter = GetEventFilter();

            if (eventFilter == null)
            {
                GetMessageIdentifiers(connection, identifiers);
            }
            else
            {
                GetMessageIdentifiers(connection, identifiers, eventFilter);
            }

            // Unlike reading entire messages this method always reads all the identifiers, so we don't
            // need to wait until the next read to tell the client that all messages have been read.

            if (identifiers.Count > 0)
            {
                HandleEventMessages(identifiers);
                _raiseExistingRead = true;
            }

            if (_raiseExistingRead)
            {
                _raiseExistingRead = false;
                OnExistingMessagesRead(System.EventArgs.Empty);
            }

            return(false);
        }
예제 #2
0
        private void GetMessageIdentifiers(SqlConnection connection, EventMessageIdentifiers identifiers, Filter eventFilter)
        {
            using (var command = new SqlCommand(Sql.GetMessageIdentifierRangeFilter, connection))
            {
                command.CommandType = CommandType.StoredProcedure;

                // The stored procedure takes a time (in ticks) as parameter instead of message ID, because
                // messages in the database are not necessarily ordered by ID.

                command.Parameters.Add("@fromTime", SqlDbType.BigInt).Value     = _lastReadMessageTime;
                command.Parameters.Add("@eventFilter", SqlDbType.VarChar).Value = SqlUtil.RegexToSqlLike(eventFilter.Pattern.Value);

                using (SqlDataReader reader = command.ExecuteReader())
                {
                    while (reader.Read())
                    {
                        _lastReadMessageTime = reader.GetInt64(1);
                        int id = reader.GetInt32(0);

                        EventMessageIdentifier identifier = new SqlEventMessageIdentifier(id, _lastReadMessageTime);
                        identifiers.Add(identifier);
                    }
                }
            }
        }
예제 #3
0
 protected void HandleEventMessages(EventMessageIdentifiers identifiers)
 {
     _messageNotifyHandler.HandleEventMessages(identifiers);
 }