コード例 #1
0
        /// <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();
            }
        }
コード例 #2
0
 /// <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);
     }
 }
コード例 #3
0
 /// <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);
     }
 }
コード例 #4
0
        /// <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);
                }
            }
        }
コード例 #5
0
        /// <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();
            }
        }