/// <summary>
        /// Saves the data from the given source stream under the given ID
        /// </summary>
        public async Task Save(string id, Stream source, Dictionary <string, string> metadata = null)
        {
            var metadataToWrite = new Dictionary <string, string>(metadata ?? new Dictionary <string, string>())
            {
                [MetadataKeys.SaveTime] = _rebusTime.Now.ToString("O")
            };

            try
            {
                using (var connection = await _connectionProvider.GetConnection())
                {
                    using (var command = connection.CreateCommand())
                    {
                        var metadataBytes = TextEncoding.GetBytes(_dictionarySerializer.SerializeToString(metadataToWrite));

                        command.CommandTimeout = _commandTimeout;
                        command.CommandText    = $"INSERT INTO {_tableName.QualifiedName} ([Id], [Meta], [Data], [CreationTime]) VALUES (@id, @meta, @data, @now)";
                        command.Parameters.Add("id", SqlDbType.VarChar, 200).Value = id;
                        command.Parameters.Add("meta", SqlDbType.VarBinary, MathUtil.GetNextPowerOfTwo(metadataBytes.Length)).Value = metadataBytes;
                        command.Parameters.Add("data", SqlDbType.VarBinary, MathUtil.GetNextPowerOfTwo((int)source.Length)).Value   = source;
                        command.Parameters.Add("now", SqlDbType.DateTimeOffset).Value = _rebusTime.Now;

                        await command.ExecuteNonQueryAsync().ConfigureAwait(false);
                    }

                    await connection.Complete();
                }
            }
            catch (Exception exception)
            {
                throw new RebusApplicationException(exception, $"Could not save data with ID {id}");
            }
        }
Beispiel #2
0
        public async Task Save(ISagaData sagaData, Dictionary <string, string> sagaAuditMetadata)
        {
            using (var connection = await _connectionHelper.GetConnection())
            {
                using (var command = connection.CreateCommand())
                {
                    command.CommandText =
                        $@"

INSERT
    INTO ""{_tableName}"" (""id"", ""revision"", ""data"", ""metadata"")
    VALUES (@id, @revision, @data, @metadata);

";
                    command.Parameters.Add("id", NpgsqlDbType.Uuid).Value          = sagaData.Id;
                    command.Parameters.Add("revision", NpgsqlDbType.Integer).Value = sagaData.Revision;
                    command.Parameters.Add("data", NpgsqlDbType.Bytea).Value       = _objectSerializer.Serialize(sagaData);
                    command.Parameters.Add("metadata", NpgsqlDbType.Jsonb).Value   =
                        _dictionarySerializer.SerializeToString(sagaAuditMetadata);

                    await command.ExecuteNonQueryAsync();
                }

                connection.Complete();
            }
        }
        /// <summary>
        /// Saves the <paramref name="sagaData"/> snapshot and the accompanying <paramref name="sagaAuditMetadata"/>
        /// </summary>
        public Task Save(ISagaData sagaData, Dictionary <string, string> sagaAuditMetadata)
        {
            using (var connection = _connectionHelper.GetConnection())
            {
                using (var command = connection.CreateCommand())
                {
                    command.CommandText =
                        $@"
                        INSERT
                            INTO {_tableName} (id, revision, data, metadata)
                            VALUES (:id, :revision, :data, :metadata)
                        ";
                    command.Parameters.Add("id", OracleDbType.Raw).Value         = sagaData.Id;
                    command.Parameters.Add("revision", OracleDbType.Int64).Value = sagaData.Revision;
                    command.Parameters.Add("data", OracleDbType.Blob).Value      = _objectSerializer.Serialize(sagaData);
                    command.Parameters.Add("metadata", OracleDbType.Clob).Value  =
                        _dictionarySerializer.SerializeToString(sagaAuditMetadata);

                    command.ExecuteNonQuery();
                }

                connection.Complete();
                return(Task.CompletedTask);
            }
        }
        /// <summary>
        /// Saves the data from the given source stream under the given ID
        /// </summary>
        public Task Save(string id, Stream source, Dictionary <string, string> metadata = null)
        {
            try
            {
                using (var connection = _connectionHelper.Open())
                {
                    using (var blob = connection.CreateBlob())
                    {
                        source.CopyTo(blob);

                        using (var command = connection.CreateCommand())
                        {
                            var metadataBytes = metadata == null ?
                                                null :
                                                TextEncoding.GetBytes(_dictionarySerializer.SerializeToString(metadata));

                            command.CommandText = $"INSERT INTO {_table} (id, meta, data, creationTime) VALUES (:id, :meta, :data, :now)";
                            command.Parameters.Add("id", id);
                            command.Parameters.Add("meta", (object)metadataBytes ?? DBNull.Value);
                            command.Parameters.Add("data", blob);
                            command.Parameters.Add("now", _rebusTime.Now.ToOracleTimeStamp());

                            command.ExecuteNonQuery();
                        }
                    }

                    connection.Complete();
                    return(Task.CompletedTask);
                }
            }
            catch (Exception exception)
            {
                throw new RebusApplicationException(exception, $"Could not save data with ID {id}");
            }
        }
        /// <summary>
        /// Saves the data from the given strea under the given ID
        /// </summary>
        public async Task Save(string id, Stream source, Dictionary <string, string> metadata = null)
        {
            var filePath = GetFilePath(id, DataFileExtension);

            using (var destination = File.Create(filePath))
            {
                await source.CopyToAsync(destination);
            }

            var metadataToSave = new Dictionary <string, string>(metadata ?? new Dictionary <string, string>())
            {
                [MetadataKeys.SaveTime] = RebusTime.Now.ToString("O")
            };
            var metadataFilePath = GetFilePath(id, MetadataFileExtension);

            using (var destination = File.Create(metadataFilePath))
                using (var writer = new StreamWriter(destination, Encoding.UTF8))
                {
                    var text = _dictionarySerializer.SerializeToString(metadataToSave);
                    await writer.WriteAsync(text);
                }
        }
        /// <summary>
        /// Saves the data from the given source stream under the given ID
        /// </summary>
        public async Task Save(string id, Stream source, Dictionary <string, string> metadata = null)
        {
            var metadataToWrite = new Dictionary <string, string>(metadata ?? new Dictionary <string, string>())
            {
                [MetadataKeys.SaveTime] = _rebusTime.Now.ToString("O")
            };

            try
            {
                using (var connection = await _connectionProvider.GetConnectionAsync().ConfigureAwait(false))
                {
                    using (var command = connection.CreateCommand())
                    {
                        var metadataBytes = TextEncoding.GetBytes(_dictionarySerializer.SerializeToString(metadataToWrite));
                        using (var memoryStream = new MemoryStream())
                        {
                            await source.CopyToAsync(memoryStream);

                            var sourceBytes = memoryStream.ToArray();
                            command.CommandTimeout = _commandTimeout;
                            command.CommandText    = $@"
                                INSERT INTO {_tableName.QualifiedName} (
                                    `id`, 
                                    `meta`,
                                    `data`, 
                                    `creation_time`,
                                    `last_read_time`) 
                                VALUES (
                                    @id, 
                                    @meta, 
                                    @data, 
                                    @now,
                                    null
                                )";
                            command.Parameters.Add("id", MySqlDbType.VarChar, 200).Value = id;
                            command.Parameters.Add("meta", MySqlDbType.VarBinary, MathUtil.GetNextPowerOfTwo(metadataBytes.Length)).Value = metadataBytes;
                            command.Parameters.Add("data", MySqlDbType.VarBinary, MathUtil.GetNextPowerOfTwo(sourceBytes.Length)).Value   = sourceBytes;
                            command.Parameters.Add("now", MySqlDbType.DateTime).Value = _rebusTime.Now.DateTime;
                            await command.ExecuteNonQueryAsync().ConfigureAwait(false);
                        }
                    }
                    await connection.CompleteAsync().ConfigureAwait(false);
                }
            }
            catch (Exception exception)
            {
                throw new RebusApplicationException(exception, $"Could not save data with ID {id}");
            }
        }
Beispiel #7
0
        /// <summary>
        /// Stores the message with the given headers and body data, delaying it until the specified <paramref name="approximateDueTime" />
        /// </summary>
        public async Task Defer(DateTimeOffset approximateDueTime, Dictionary <string, string> headers, byte[] body)
        {
            using (var connection = await _connectionHelper.GetConnection())
            {
                using (var command = connection.CreateCommand())
                {
                    command.CommandText =
                        $@"INSERT INTO `{_tableName}` (`due_time`, `headers`, `body`) VALUES (@due_time, @headers, @body)";

                    command.Parameters.Add(command.CreateParameter("due_time", DbType.DateTime, approximateDueTime.ToUniversalTime().DateTime.AddSeconds(-1)));
                    command.Parameters.Add(command.CreateParameter("headers", DbType.String, _dictionarySerializer.SerializeToString(headers)));
                    command.Parameters.Add(command.CreateParameter("body", DbType.Binary, body));

                    await command.ExecuteNonQueryAsync().ConfigureAwait(false);
                }

                connection.Complete();
            }
        }
        /// <summary>
        /// Stores the message with the given headers and body data, delaying it until the specified <paramref name="approximateDueTime" />
        /// </summary>
        public async Task Defer(DateTimeOffset approximateDueTime, Dictionary <string, string> headers, byte[] body)
        {
            using (var connection = _connectionHelper.GetConnection())
            {
                using (var command = connection.CreateCommand())
                {
                    command.CommandText =
                        $@"INSERT INTO {_tableName} (due_time, headers, body) VALUES (:due_time, :headers, :body)";
                    command.BindByName = true;
                    command.Parameters.Add(new OracleParameter("due_time", OracleDbType.TimeStampTZ, approximateDueTime.ToUniversalTime().DateTime, ParameterDirection.Input));
                    command.Parameters.Add(new OracleParameter("headers", OracleDbType.Clob, _dictionarySerializer.SerializeToString(headers), ParameterDirection.Input));
                    command.Parameters.Add(new OracleParameter("body", OracleDbType.Blob, body, ParameterDirection.Input));
                    await command.ExecuteNonQueryAsync();
                }

                connection.Complete();
            }
        }
        /// <summary>
        /// Stores the message with the given headers and body data, delaying it until the specified <paramref name="approximateDueTime" />
        /// </summary>
        public Task Defer(DateTimeOffset approximateDueTime, Dictionary <string, string> headers, byte[] body)
        {
            using (var connection = _connectionHelper.Open())
            {
                using (var command = connection.CreateCommand())
                {
                    command.CommandText =
                        $@"INSERT INTO {_table} (due_time, headers, body) VALUES (:due_time, :headers, :body)";
                    command.Parameters.Add(new OracleParameter("due_time", OracleDbType.TimeStampTZ, approximateDueTime.ToOracleTimeStamp(), ParameterDirection.Input));
                    command.Parameters.Add(new OracleParameter("headers", OracleDbType.Clob, _dictionarySerializer.SerializeToString(headers), ParameterDirection.Input));
                    command.Parameters.Add(new OracleParameter("body", OracleDbType.Blob, body, ParameterDirection.Input));
                    command.ExecuteNonQuery();
                }

                connection.Complete();
                return(Task.CompletedTask);
            }
        }
Beispiel #10
0
        /// <summary>
        /// Stores the message with the given headers and body data, delaying it until the specified <paramref name="approximateDueTime" />
        /// </summary>
        public async Task Defer(DateTimeOffset approximateDueTime, Dictionary <string, string> headers, byte[] body)
        {
            using (var connection = await _connectionHelper.GetConnection())
            {
                using (var command = connection.CreateCommand())
                {
                    command.CommandText =
                        $@"
INSERT INTO ""{_tableName}"" (""due_time"", ""headers"", ""body"") VALUES (@due_time, @headers, @body)";

                    command.Parameters.Add("due_time", NpgsqlDbType.Timestamp).Value = approximateDueTime.ToUniversalTime().DateTime;
                    command.Parameters.Add("headers", NpgsqlDbType.Text).Value       = _dictionarySerializer.SerializeToString(headers);
                    command.Parameters.Add("body", NpgsqlDbType.Bytea).Value         = body;

                    await command.ExecuteNonQueryAsync();
                }

                await connection.Complete();
            }
        }
Beispiel #11
0
        /// <summary>
        /// Saves the data from the given source stream under the given ID
        /// </summary>
        public async Task Save(string id, Stream source, Dictionary <string, string> metadata = null)
        {
            var metadataToWrite = new Dictionary <string, string>(metadata ?? new Dictionary <string, string>())
            {
                [MetadataKeys.SaveTime] = RebusTime.Now.ToString("O")
            };

            try
            {
                using (var connection = await _connectionProvider.GetConnection())
                {
                    using (var command = connection.CreateCommand())
                    {
                        command.CommandText = $"INSERT INTO [{_tableName}] ([Id], [Meta], [Data]) VALUES (@id, @meta, @data)";
                        command.Parameters.Add("id", SqlDbType.VarChar, 200).Value = id;
                        command.Parameters.Add("meta", SqlDbType.VarBinary).Value  = TextEncoding.GetBytes(_dictionarySerializer.SerializeToString(metadataToWrite));
                        command.Parameters.Add("data", SqlDbType.VarBinary).Value  = source;

                        await command.ExecuteNonQueryAsync();
                    }

                    await connection.Complete();
                }
            }
            catch (Exception exception)
            {
                throw new RebusApplicationException(exception, $"Could not save data with ID {id}");
            }
        }
        /// <summary>
        /// Archives the given saga data in MySql under its current ID and revision
        /// </summary>
        public async Task Save(ISagaData sagaData, Dictionary <string, string> sagaAuditMetadata)
        {
            using (var connection = await _connectionHelper.GetConnection())
            {
                using (var command = connection.CreateCommand())
                {
                    command.CommandText =
                        $@"
                            INSERT
                                INTO `{_tableName}` (`id`, `revision`, `data`, `metadata`)
                                VALUES (@id, @revision, @data, @metadata);

                            ";
                    command.Parameters.Add(command.CreateParameter("id", DbType.Guid, sagaData.Id));
                    command.Parameters.Add(command.CreateParameter("revision", DbType.Int32, sagaData.Revision));
                    command.Parameters.Add(command.CreateParameter("data", DbType.Binary, _objectSerializer.Serialize(sagaData)));
                    command.Parameters.Add(command.CreateParameter("metadata", DbType.String, _dictionarySerializer.SerializeToString(sagaAuditMetadata)));

                    await command.ExecuteNonQueryAsync();
                }

                connection.Complete();
            }
        }