/// <summary> /// Saves a snapshot of the saga data along with the given metadata /// </summary> public async Task Save(ISagaData sagaData, Dictionary <string, string> sagaAuditMetadata) { using (var connection = await _connectionProvider.GetConnection()) { using (var command = connection.CreateCommand()) { command.CommandText = $@" INSERT INTO {_tableName.QualifiedName} ( [id], [revision], [data], [metadata] ) VALUES ( @id, @revision, @data, @metadata ) "; command.Parameters.Add("id", SqlDbType.UniqueIdentifier).Value = sagaData.Id; command.Parameters.Add("revision", SqlDbType.Int).Value = sagaData.Revision; command.Parameters.Add("data", SqlDbType.NVarChar).Value = DataSerializer.SerializeToString(sagaData); command.Parameters.Add("metadata", SqlDbType.NVarChar).Value = MetadataSerializer.SerializeToString(sagaAuditMetadata); await command.ExecuteNonQueryAsync(); } await connection.Complete(); } }
/// <summary> /// Defers the message to the time specified by <paramref name="approximateDueTime"/> at which point in time the message will be /// returned to whoever calls <see cref="GetDueMessages"/> /// </summary> public async Task Defer(DateTimeOffset approximateDueTime, Dictionary <string, string> headers, byte[] body) { using (var connection = await _connectionProvider.GetConnectionAsync().ConfigureAwait(false)) { using (var command = connection.CreateCommand()) { command.CommandText = $@" INSERT INTO {_tableName.QualifiedName} ( `due_time`, `headers`, `body` ) VALUES ( @due_time, @headers, @body );"; var headersString = HeaderSerializer.SerializeToString(headers); command.Parameters.Add("due_time", MySqlDbType.DateTime).Value = approximateDueTime.UtcDateTime; command.Parameters.Add("headers", MySqlDbType.VarChar, MathUtil.GetNextPowerOfTwo(headersString.Length)).Value = headersString; command.Parameters.Add("body", MySqlDbType.VarBinary, MathUtil.GetNextPowerOfTwo(body.Length)).Value = body; await command.ExecuteNonQueryAsync().ConfigureAwait(false); } await connection.CompleteAsync().ConfigureAwait(false); } }
/// <summary> /// Saves a snapshot of the saga data along with the given metadata /// </summary> public async Task Save(ISagaData sagaData, Dictionary <string, string> sagaAuditMetadata) { using (var connection = await _connectionProvider.GetConnectionAsync()) { using (var command = connection.CreateCommand()) { command.CommandText = $@" INSERT INTO {_tableName.QualifiedName} ( `id`, `revision`, `data`, `metadata` ) VALUES ( @id, @revision, @data, @metadata )"; var dataString = DataSerializer.SerializeToString(sagaData); var metadataString = MetadataSerializer.SerializeToString(sagaAuditMetadata); command.Parameters.Add("id", MySqlDbType.Guid).Value = sagaData.Id; command.Parameters.Add("revision", MySqlDbType.Int32).Value = sagaData.Revision; command.Parameters.Add("data", MySqlDbType.VarChar, MathUtil.GetNextPowerOfTwo(dataString.Length)).Value = dataString; command.Parameters.Add("metadata", MySqlDbType.VarChar, MathUtil.GetNextPowerOfTwo(metadataString.Length)).Value = metadataString; Console.WriteLine($"OK WE'RE SAVING SAGA SNAPSHOT {sagaData.Id} rev. {sagaData.Revision} NOW"); await command.ExecuteNonQueryAsync().ConfigureAwait(false); } await connection.CompleteAsync().ConfigureAwait(false); } }
/// <summary> /// <inheritdoc /> /// </summary> public async Task Store(TransportMessage message) { using (var connection = await _connectionFactory().ConfigureAwait(false)) { if (connection.State != ConnectionState.Open) { await connection.OpenAsync().ConfigureAwait(false); } using (var command = connection.CreateCommand()) { command.CommandText = $@"INSERT INTO {_tableName} ([headers], [body]) VALUES (@headers, @body)"; var headersString = _headerSerializer.SerializeToString(message.Headers); var headersParam = command.CreateParameter(); headersParam.ParameterName = "headers"; headersParam.DbType = DbType.String; headersParam.Size = -1; headersParam.Value = headersString; command.Parameters.Add(headersParam); var bodyParam = command.CreateParameter(); bodyParam.ParameterName = "body"; bodyParam.DbType = DbType.Binary; bodyParam.Size = -1; bodyParam.Value = message.Body; command.Parameters.Add(bodyParam); await command.ExecuteNonQueryAsync().ConfigureAwait(false); } } }
/// <summary> /// Defers the message to the time specified by <paramref name="approximateDueTime"/> at which point in time the message will be /// returned to whoever calls <see cref="GetDueMessages"/> /// </summary> public async Task Defer(DateTimeOffset approximateDueTime, Dictionary <string, string> headers, byte[] body) { var headersString = HeaderSerializer.SerializeToString(headers); using (var connection = await _connectionProvider.GetConnection()) { using (var command = connection.CreateCommand()) { command.CommandText = $@"INSERT INTO {_tableName.QualifiedName} ([due_time], [headers], [body]) VALUES (@due_time, @headers, @body)"; command.Parameters.Add("due_time", SqlDbType.DateTime2).Value = approximateDueTime.UtcDateTime; command.Parameters.Add("headers", SqlDbType.NVarChar).Value = headersString; command.Parameters.Add("body", SqlDbType.VarBinary).Value = body; await command.ExecuteNonQueryAsync(); } await connection.Complete(); } }