protected override void WriteEvent(DbCommand command, IPersistentRepresentation e, IImmutableSet <string> tags)
        {
            var manifest = string.IsNullOrEmpty(e.Manifest) ? QualifiedName(e) : e.Manifest;
            var t        = _serialize(e);

            AddParameter(command, "@PersistenceId", DbType.String, e.PersistenceId);
            AddParameter(command, "@SequenceNr", DbType.Int64, e.SequenceNr);
            AddParameter(command, "@Timestamp", DbType.Int64, TimestampProvider.GenerateTimestamp(e));
            AddParameter(command, "@IsDeleted", DbType.Boolean, false);
            AddParameter(command, "@Manifest", DbType.String, manifest);
            command.Parameters.Add(new NpgsqlParameter("@Payload", t.Key)
            {
                Value = t.Value
            });

            if (tags.Count != 0)
            {
                var tagBuilder = new StringBuilder(";", tags.Sum(x => x.Length) + tags.Count + 1);
                foreach (var tag in tags)
                {
                    tagBuilder.Append(tag).Append(';');
                }

                AddParameter(command, "@Tag", DbType.String, tagBuilder.ToString());
            }
            else
            {
                AddParameter(command, "@Tag", DbType.String, DBNull.Value);
            }
        }
        protected override void WriteEvent(DbCommand command, IPersistentRepresentation e, IImmutableSet <string> tags)
        {
            var serializationResult = _serialize(e);
            var serializer          = serializationResult.Serializer;
            var hasSerializer       = serializer != null;

            string manifest = "";

            if (hasSerializer && serializer is SerializerWithStringManifest)
            {
                manifest = ((SerializerWithStringManifest)serializer).Manifest(e.Payload);
            }
            else if (hasSerializer && serializer.IncludeManifest)
            {
                manifest = QualifiedName(e);
            }
            else
            {
                manifest = string.IsNullOrEmpty(e.Manifest) ? QualifiedName(e) : e.Manifest;
            }

            AddParameter(command, "@PersistenceId", DbType.String, e.PersistenceId);
            AddParameter(command, "@SequenceNr", DbType.Int64, e.SequenceNr);
            AddParameter(command, "@Timestamp", DbType.Int64, TimestampProvider.GenerateTimestamp(e));
            AddParameter(command, "@IsDeleted", DbType.Boolean, false);
            AddParameter(command, "@Manifest", DbType.String, manifest);

            if (hasSerializer)
            {
                AddParameter(command, "@SerializerId", DbType.Int32, serializer.Identifier);
            }
            else
            {
                AddParameter(command, "@SerializerId", DbType.Int32, DBNull.Value);
            }

            command.Parameters.Add(new NpgsqlParameter("@Payload", serializationResult.DbType)
            {
                Value = serializationResult.Payload
            });

            if (tags.Count != 0)
            {
                var tagBuilder = new StringBuilder(";", tags.Sum(x => x.Length) + tags.Count + 1);
                foreach (var tag in tags)
                {
                    tagBuilder.Append(tag).Append(';');
                }

                AddParameter(command, "@Tag", DbType.String, tagBuilder.ToString());
            }
            else
            {
                AddParameter(command, "@Tag", DbType.String, DBNull.Value);
            }
        }
        protected override void WriteEvent(DbCommand command, IPersistentRepresentation e, IImmutableSet <string> tags)
        {
            var payloadType = e.Payload.GetType();
            var serializer  = Serialization.FindSerializerForType(payloadType, Configuration.DefaultSerializer);

            var manifest = " "; // HACK

            if (serializer is SerializerWithStringManifest stringManifest)
            {
                manifest = stringManifest.Manifest(e.Payload);
            }
            else
            {
                if (serializer.IncludeManifest)
                {
                    manifest = payloadType.TypeQualifiedName();
                }
            }

            var binary = serializer.ToBinary(e.Payload);

            AddParameter(command, ":PersistenceId", OracleDbType.NVarchar2, e.PersistenceId);
            AddParameter(command, ":SequenceNr", OracleDbType.Int64, e.SequenceNr);
            AddParameter(command, ":Timestamp", OracleDbType.Int64, TimestampProvider.GenerateTimestamp(e));
            AddParameter(command, ":IsDeleted", OracleDbType.Int16, e.IsDeleted);
            AddParameter(command, ":Manifest", OracleDbType.NVarchar2, manifest);
            AddParameter(command, ":Payload", OracleDbType.Blob, binary);
            AddParameter(command, ":SerializerId", OracleDbType.Int32, serializer.Identifier);

            if (tags.Count != 0)
            {
                var tagBuilder = new StringBuilder(";", tags.Sum(x => x.Length) + tags.Count + 1);
                foreach (var tag in tags)
                {
                    tagBuilder.Append(tag).Append(';');
                }
                AddParameter(command, ":Tag", OracleDbType.NVarchar2, tagBuilder.ToString());
            }
            else
            {
                AddParameter(command, ":Tag", OracleDbType.NVarchar2, DBNull.Value);
            }
        }