Skip to content
This repository was archived by the owner on Mar 20, 2025. It is now read-only.

Commit 5d372f0

Browse files
authored
Merge pull request #49 from pmorelli92/dev
Save manifest on snapshots when using default json serializer and using manifest to get deserialization type
2 parents bc406bd + 9a2e540 commit 5d372f0

File tree

1 file changed

+36
-17
lines changed

1 file changed

+36
-17
lines changed

src/Akka.Persistence.PostgreSql/Snapshot/PostgreSqlQueryExecutor.cs

Lines changed: 36 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
//-----------------------------------------------------------------------
77

88
using Akka.Persistence.Sql.Common.Snapshot;
9+
using Akka.Serialization;
10+
using Akka.Util;
911
using Newtonsoft.Json;
1012
using Npgsql;
1113
using NpgsqlTypes;
@@ -99,7 +101,7 @@ WITH upsert AS (
99101

100102
protected override DbCommand CreateCommand(DbConnection connection)
101103
{
102-
return ((NpgsqlConnection) connection).CreateCommand();
104+
return ((NpgsqlConnection)connection).CreateCommand();
103105
}
104106

105107
protected override void SetTimestampParameter(DateTime timestamp, DbCommand command) => AddParameter(command, "@Timestamp", DbType.Int64, timestamp.Ticks);
@@ -109,6 +111,25 @@ protected override void SetPayloadParameter(object snapshot, DbCommand command)
109111
command.Parameters.Add(new NpgsqlParameter("@Payload", serializationResult.DbType) { Value = serializationResult.Payload });
110112
}
111113

114+
protected override void SetManifestParameters(object snapshot, DbCommand command)
115+
{
116+
var snapshotType = snapshot.GetType();
117+
var serializer = Serialization.FindSerializerForType(snapshotType, Configuration.DefaultSerializer);
118+
119+
string manifest = "";
120+
if (serializer is SerializerWithStringManifest)
121+
{
122+
manifest = ((SerializerWithStringManifest)serializer).Manifest(snapshot);
123+
}
124+
else if (!serializer.IncludeManifest)
125+
{
126+
manifest = snapshotType.TypeQualifiedName();
127+
}
128+
129+
AddParameter(command, "@Manifest", DbType.String, manifest);
130+
AddParameter(command, "@SerializerId", DbType.Int32, serializer.Identifier);
131+
}
132+
112133
protected override SelectedSnapshot ReadSnapshot(DbDataReader reader)
113134
{
114135
var persistenceId = reader.GetString(0);
@@ -118,14 +139,12 @@ protected override SelectedSnapshot ReadSnapshot(DbDataReader reader)
118139

119140
int? serializerId = null;
120141
Type type = null;
121-
if (reader.IsDBNull(5))
122-
{
123-
type = Type.GetType(manifest, true);
124-
}
125-
else
126-
{
142+
143+
if (!string.IsNullOrEmpty(manifest))
144+
type = Type.GetType(manifest, throwOnError: true);
145+
146+
if (!reader.IsDBNull(5))
127147
serializerId = reader.GetInt32(5);
128-
}
129148

130149
var snapshot = _deserialize(type, reader[4], manifest, serializerId);
131150

@@ -143,18 +162,18 @@ public class PostgreSqlQueryConfiguration : QueryConfiguration
143162
public readonly JsonSerializerSettings JsonSerializerSettings;
144163

145164
public PostgreSqlQueryConfiguration(
146-
string schemaName,
147-
string snapshotTableName,
148-
string persistenceIdColumnName,
149-
string sequenceNrColumnName,
150-
string payloadColumnName,
151-
string manifestColumnName,
152-
string timestampColumnName,
165+
string schemaName,
166+
string snapshotTableName,
167+
string persistenceIdColumnName,
168+
string sequenceNrColumnName,
169+
string payloadColumnName,
170+
string manifestColumnName,
171+
string timestampColumnName,
153172
string serializerIdColumnName,
154-
TimeSpan timeout,
173+
TimeSpan timeout,
155174
StoredAsType storedAs,
156175
string defaultSerializer,
157-
JsonSerializerSettings jsonSerializerSettings = null)
176+
JsonSerializerSettings jsonSerializerSettings = null)
158177
: base(schemaName, snapshotTableName, persistenceIdColumnName, sequenceNrColumnName, payloadColumnName, manifestColumnName, timestampColumnName, serializerIdColumnName, timeout, defaultSerializer)
159178
{
160179
StoredAs = storedAs;

0 commit comments

Comments
 (0)