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); }
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); } } } }
protected void HandleEventMessages(EventMessageIdentifiers identifiers) { _messageNotifyHandler.HandleEventMessages(identifiers); }