private static void WriteSnapshotTest(Snapshot source, string path, string jsonData)
 {
     try
     {
         source.EventSourceId.GetWriteLock("snapshot");
         File.WriteAllText(path, source.GetType().AssemblyQualifiedName + "\n\r" + jsonData);
     } finally
     {
         source.EventSourceId.ReleaseWriteLock("snapshot");
     }
 }
        /// <summary>Saves a snapshot of the specified event source.</summary>
        public void SaveSnapshot(Snapshot snapshot)
        {
            using (var connection = new NpgsqlConnection(_connectionString))
            {
                // Open connection and begin a transaction so we can
                // commit or rollback all the changes that has been made.
                connection.Open();
                using (NpgsqlTransaction transaction = connection.BeginTransaction())
                {
                    try
                    {
                        using (var dataStream = new MemoryStream())
                        {
                            var formatter = new BinaryFormatter();
                            formatter.Serialize(dataStream, snapshot.Payload);
                            byte[] data = dataStream.ToArray();

                            using (var command = new NpgsqlCommand(Queries.InsertSnapshot, transaction.Connection))
                            {
                                command.Transaction = transaction;
                                command.Parameters.AddWithValue("EventSourceId", snapshot.EventSourceId);
                                command.Parameters.AddWithValue("Version", snapshot.Version);
                                command.Parameters.AddWithValue("Type", snapshot.GetType().AssemblyQualifiedName);
                                command.Parameters.AddWithValue("Data", data);
                                command.ExecuteNonQuery();
                            }
                        }

                        // Everything is handled, commit transaction.
                        transaction.Commit();
                    }
                    catch
                    {
                        // Something went wrong, rollback transaction.
                        transaction.Rollback();
                        throw;
                    }
                }
            }
        }