Esempio n. 1
0
        private SnapshotEntry ToSnapshotEntry(SnapshotMetadata metadata, object snapshot)
        {
            var snapshotRep = new Akka.Persistence.Serialization.Snapshot(snapshot);
            var serializer  = _serialization.FindSerializerFor(snapshotRep);
            var binary      = serializer.ToBinary(snapshotRep);

            var manifest = "";

            if (serializer is SerializerWithStringManifest stringManifest)
            {
                manifest = stringManifest.Manifest(snapshotRep);
            }
            else
            {
                manifest = snapshotRep.GetType().TypeQualifiedName();
            }

            return(new SnapshotEntry
            {
                Id = metadata.PersistenceId + "_" + metadata.SequenceNr,
                PersistenceId = metadata.PersistenceId,
                SequenceNr = metadata.SequenceNr,
                Snapshot = binary,
                Timestamp = metadata.Timestamp.Ticks,
                Manifest = manifest,
                SerializerId = serializer?.Identifier
            });
        }
        private SnapshotEntry ToSnapshotEntry(SnapshotMetadata metadata, object snapshot)
        {
            if (_settings.LegacySerialization)
            {
                var manifest = snapshot.GetType().TypeQualifiedName();

                return(new SnapshotEntry
                {
                    Id = metadata.PersistenceId + "_" + metadata.SequenceNr,
                    PersistenceId = metadata.PersistenceId,
                    SequenceNr = metadata.SequenceNr,
                    Snapshot = snapshot,
                    Timestamp = metadata.Timestamp.Ticks,
                    Manifest = manifest,
                    SerializerId = null
                });
            }

            var snapshotRep    = new Akka.Persistence.Serialization.Snapshot(snapshot);
            var serializer     = _serialization.FindSerializerFor(snapshotRep);
            var binary         = serializer.ToBinary(snapshotRep);
            var binaryManifest = Akka.Serialization.Serialization.ManifestFor(serializer, snapshotRep);

            return(new SnapshotEntry
            {
                Id = metadata.PersistenceId + "_" + metadata.SequenceNr,
                PersistenceId = metadata.PersistenceId,
                SequenceNr = metadata.SequenceNr,
                Snapshot = binary,
                Timestamp = metadata.Timestamp.Ticks,
                Manifest = binaryManifest,
                SerializerId = serializer?.Identifier
            });
        }
        public SnapshotEntry(SnapshotMetadata metadata, object snapshot, Akka.Serialization.Serialization serialization)
        {
            Snapshot      = snapshot;
            Id            = $"{DocumentType}-{metadata.PersistenceId}-{metadata.SequenceNr}";
            SequenceNr    = metadata.SequenceNr;
            Timestamp     = new DateTimeJsonObject(metadata.Timestamp);
            PersistenceId = metadata.PersistenceId;
            Manifest      = snapshot.GetType().AssemblyQualifiedName;
            Serializer serializer = serialization.FindSerializerFor(snapshot);

            if (serializer != null)
            {
                SerializerId = serializer.Identifier;
                if (serializer is SerializerWithStringManifest)
                {
                    Manifest = ((SerializerWithStringManifest)serializer).Manifest(snapshot);
                }
                if (SerializerId.HasValue && SerializerId.Value == 1)
                {
                    Snapshot = snapshot;
                }
                else
                {
                    Snapshot = Convert.ToBase64String(serializer.ToBinary(snapshot));
                }
            }
        }
        internal JournalEntry(IPersistentRepresentation message, Akka.Serialization.Serialization serialization)
        {
            Id            = $"{DocumentType}-{message.PersistenceId}-{message.SequenceNr}";
            IsDeleted     = message.IsDeleted;
            Payload       = message.Payload;
            PersistenceId = message.PersistenceId;
            SequenceNr    = message.SequenceNr;
            Manifest      = message.Manifest;
            if (string.IsNullOrWhiteSpace(message.Manifest))
            {
                Manifest = message.Payload.GetType().AssemblyQualifiedName;
            }
            Serializer serializer = serialization.FindSerializerFor(Payload);

            if (serializer != null)
            {
                SerializerId = serializer.Identifier;
                if (serializer is SerializerWithStringManifest)
                {
                    Manifest = ((SerializerWithStringManifest)serializer).Manifest(message.Payload);
                }
                if (SerializerId.HasValue && SerializerId.Value == 1)
                {
                    Payload = message.Payload;
                }
                else
                {
                    Payload = Convert.ToBase64String(serializer.ToBinary(message.Payload));
                }
            }
        }
        private JournalEntry ToJournalEntry(IPersistentRepresentation message)
        {
            object payload = message.Payload;

            if (message.Payload is Tagged tagged)
            {
                payload = tagged.Payload;
                message = message.WithPayload(payload); // need to update the internal payload when working with tags
            }


            var serializer = _serialization.FindSerializerFor(message);
            var binary     = serializer.ToBinary(message);


            return(new JournalEntry
            {
                Id = message.PersistenceId + "_" + message.SequenceNr,
                Ordering = new BsonTimestamp(0), // Auto-populates with timestamp
                IsDeleted = message.IsDeleted,
                Payload = binary,
                PersistenceId = message.PersistenceId,
                SequenceNr = message.SequenceNr,
                Manifest = string.Empty, // don't need a manifest here - it's embedded inside the PersistentMessage
                Tags = tagged.Tags?.ToList(),
                SerializerId = null      // don't need a serializer ID here either; only for backwards-comat
            });
        }
Esempio n. 6
0
        private JournalEntry ToJournalEntry(IPersistentRepresentation message)
        {
            object payload = message.Payload;

            if (message.Payload is Tagged tagged)
            {
                payload = tagged.Payload;
                message = message.WithPayload(payload); // need to update the internal payload when working with tags
            }

            // per https://github.com/akkadotnet/Akka.Persistence.MongoDB/issues/107
            // BSON serialization
            if (_settings.LegacySerialization)
            {
                var manifest = string.IsNullOrEmpty(message.Manifest) ? payload.GetType().TypeQualifiedName() : message.Manifest;
                return(new JournalEntry
                {
                    Id = message.PersistenceId + "_" + message.SequenceNr,
                    Ordering = new BsonTimestamp(0), // Auto-populates with timestamp
                    IsDeleted = message.IsDeleted,
                    Payload = payload,
                    PersistenceId = message.PersistenceId,
                    SequenceNr = message.SequenceNr,
                    Manifest = manifest,
                    Tags = tagged.Tags?.ToList(),
                    SerializerId = null // don't need a serializer ID here either; only for backwards-compat
                });
            }

            // default serialization
            var serializer = _serialization.FindSerializerFor(message);
            var binary     = serializer.ToBinary(message);


            return(new JournalEntry
            {
                Id = message.PersistenceId + "_" + message.SequenceNr,
                Ordering = new BsonTimestamp(0), // Auto-populates with timestamp
                IsDeleted = message.IsDeleted,
                Payload = binary,
                PersistenceId = message.PersistenceId,
                SequenceNr = message.SequenceNr,
                Manifest = string.Empty, // don't need a manifest here - it's embedded inside the PersistentMessage
                Tags = tagged.Tags?.ToList(),
                SerializerId = null      // don't need a serializer ID here either; only for backwards-compat
            });
        }
Esempio n. 7
0
        private ByteString SerializeSequencedOnNext(SequencedOnNext onNext)
        {
            var payload    = onNext.Payload;
            var serializer = _serialization.FindSerializerFor(payload);
            var manifest   = Akka.Serialization.Serialization.ManifestFor(serializer, payload);

            var p = new Payload
            {
                EnclosedMessage = ByteString.CopyFrom(serializer.ToBinary(payload)),
                SerializerId    = serializer.Identifier
            };

            if (!string.IsNullOrEmpty(manifest))
            {
                p.MessageManifest = ByteString.CopyFromUtf8(manifest);
            }

            return(new Proto.Msg.SequencedOnNext
            {
                SeqNr = onNext.SeqNr,
                Payload = p
            }.ToByteString());
        }
Esempio n. 8
0
        private static string SerializedToString <T>(T evt)
        {
            //XmlSerializer xmlSerializer = new XmlSerializer(evt.GetType());
            //using (StringWriter textWriter = new StringWriter())
            //{
            //    xmlSerializer.Serialize(textWriter, evt);
            //    return textWriter.ToString();
            //}
            ActorSystem system = ActorSystem.Create("example", new AutoTestAkkaConfiguration().ToStandAloneInMemorySystemConfig());

            // Get the Serialization Extension
            Akka.Serialization.Serialization serialization = system.Serialization;

            // Find the Serializer for it
            Serializer serializer = serialization.FindSerializerFor(evt);

            //var serializedString = JsonConvert.SerializeObject(evt, new JsonSerializerSettings
            //{
            //    TypeNameHandling = TypeNameHandling.All
            //});

            return(serializer.ToBinary(evt).ToString());
        }
Esempio n. 9
0
        public PostgreSqlQueryExecutor(PostgreSqlQueryConfiguration configuration, Akka.Serialization.Serialization serialization) : base(configuration, serialization)
        {
            CreateSnapshotTableSql = $@"
                DO
                $do$
                BEGIN
                IF NOT EXISTS (SELECT 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = '{Configuration.SchemaName}' AND TABLE_NAME = '{Configuration.SnapshotTableName}') THEN
                    CREATE TABLE {Configuration.FullSnapshotTableName} (
                        {Configuration.PersistenceIdColumnName} VARCHAR(255) NOT NULL,
                        {Configuration.SequenceNrColumnName} BIGINT NOT NULL,
                        {Configuration.TimestampColumnName} BIGINT NOT NULL,
                        {Configuration.ManifestColumnName} VARCHAR(500) NOT NULL,
                        {Configuration.PayloadColumnName} {configuration.StoredAs.ToString().ToUpperInvariant()} NOT NULL,
                        CONSTRAINT {Configuration.SnapshotTableName}_pk PRIMARY KEY ({Configuration.PersistenceIdColumnName}, {Configuration.SequenceNrColumnName})
                    );
                    CREATE INDEX {Configuration.SnapshotTableName}_{Configuration.SequenceNrColumnName}_idx ON {Configuration.FullSnapshotTableName}({Configuration.SequenceNrColumnName});
                    CREATE INDEX {Configuration.SnapshotTableName}_{Configuration.TimestampColumnName}_idx ON {Configuration.FullSnapshotTableName}({Configuration.TimestampColumnName});
                END IF;
                END
                $do$";

            InsertSnapshotSql = $@"
                WITH upsert AS (
                    UPDATE {Configuration.FullSnapshotTableName} 
                    SET 
                        {Configuration.TimestampColumnName} = @Timestamp, 
                        {Configuration.PayloadColumnName} = @Payload 
                    WHERE {Configuration.PersistenceIdColumnName} = @PersistenceId
                    AND {Configuration.SequenceNrColumnName} = @SequenceNr 
                    RETURNING *) 
                INSERT INTO {Configuration.FullSnapshotTableName} (
                    {Configuration.PersistenceIdColumnName}, 
                    {Configuration.SequenceNrColumnName}, 
                    {Configuration.TimestampColumnName}, 
                    {Configuration.ManifestColumnName}, 
                    {Configuration.PayloadColumnName})
                SELECT @PersistenceId, @SequenceNr, @Timestamp, @Manifest, @Payload
                WHERE NOT EXISTS (SELECT * FROM upsert)";

            switch (configuration.StoredAs)
            {
            case StoredAsType.ByteA:
                _serialize   = e => new KeyValuePair <NpgsqlDbType, object>(NpgsqlDbType.Bytea, serialization.FindSerializerFor(e).ToBinary(e));
                _deserialize = (type, serialized) => serialization.FindSerializerForType(type).FromBinary((byte[])serialized, type);
                break;

            case StoredAsType.JsonB:
                _serialize   = e => new KeyValuePair <NpgsqlDbType, object>(NpgsqlDbType.Jsonb, JsonConvert.SerializeObject(e, configuration.JsonSerializerSettings));
                _deserialize = (type, serialized) => JsonConvert.DeserializeObject((string)serialized, type, configuration.JsonSerializerSettings);
                break;

            case StoredAsType.Json:
                _serialize   = e => new KeyValuePair <NpgsqlDbType, object>(NpgsqlDbType.Json, JsonConvert.SerializeObject(e, configuration.JsonSerializerSettings));
                _deserialize = (type, serialized) => JsonConvert.DeserializeObject((string)serialized, type, configuration.JsonSerializerSettings);
                break;

            default:
                throw new NotSupportedException($"{configuration.StoredAs} is not supported Db type for a payload");
            }
        }