diff options
author | crupest <crupest@outlook.com> | 2020-03-05 21:33:00 +0800 |
---|---|---|
committer | crupest <crupest@outlook.com> | 2020-03-05 21:33:00 +0800 |
commit | f44209e20d3379a9dda6f3b6b780c83616348b26 (patch) | |
tree | 365b40aabd2acb29c099f167fa89b8dc5391358d /Timeline/Services/DataManager.cs | |
parent | 3f5b4840ff863bed5fd11beb775d02447f022030 (diff) | |
download | timeline-f44209e20d3379a9dda6f3b6b780c83616348b26.tar.gz timeline-f44209e20d3379a9dda6f3b6b780c83616348b26.tar.bz2 timeline-f44209e20d3379a9dda6f3b6b780c83616348b26.zip |
Design the data manager interface.
Diffstat (limited to 'Timeline/Services/DataManager.cs')
-rw-r--r-- | Timeline/Services/DataManager.cs | 79 |
1 files changed, 79 insertions, 0 deletions
diff --git a/Timeline/Services/DataManager.cs b/Timeline/Services/DataManager.cs new file mode 100644 index 00000000..005ad23c --- /dev/null +++ b/Timeline/Services/DataManager.cs @@ -0,0 +1,79 @@ +using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading.Tasks;
+
+namespace Timeline.Services
+{
+ public class DataEntry
+ {
+#pragma warning disable CA1819 // Properties should not return arrays
+ public byte[] Data { get; set; } = default!;
+#pragma warning restore CA1819 // Properties should not return arrays
+ public DataInfo Info { get; set; } = default!;
+ }
+
+ public class DataInfo
+ {
+ public DateTime Time { get; set; }
+ public string Type { get; set; } = default!;
+ }
+
+ /// <summary>
+ /// A data manager controling data.
+ /// </summary>
+ /// <remarks>
+ /// All data to be saved will be checked identity.
+ /// Identical data will be saved as one copy and return the same tag.
+ /// Every data has a ref count. When data is saved, ref count increase.
+ /// When data is removed, ref count decease. If ref count is decreased
+ /// to 0, the data entry will be destroyed and no longer occupy space.
+ ///
+ /// Type is just an attached attribute for convenience and not participate
+ /// in identity verification. This should be only used to save blobs but not
+ /// strings. It will be rare for identity blob with different type, I think.
+ /// </remarks>
+ public interface IDataManager
+ {
+ /// <summary>
+ /// Saves the data to a new entry if it does not exist,
+ /// increases its ref count and returns a tag to the entry.
+ /// </summary>
+ /// <param name="data">The data. Can't be null.</param>
+ /// <param name="type">The type of the data. Can't be null.</param>
+ /// <returns>The tag of the created entry.</returns>
+ /// <exception cref="ArgumentNullException">Thrown when <paramref name="data"/> or <paramref name="type"/> is null.</exception>
+ /// <exception cref="InvalidOperationException">Thrown when a saved copy of data already exists but type is different.</exception>
+ public Task<string> RetainEntry(byte[] data, string type);
+
+ /// <summary>
+ /// Decrease the the ref count of the entry.
+ /// Remove it if ref count is zero.
+ /// </summary>
+ /// <param name="tag">The tag of the entry.</param>
+ /// <exception cref="ArgumentNullException">Thrown when <paramref name="tag"/> is null.</exception>
+ /// <remarks>
+ /// It's no-op if entry with tag does not exist.
+ /// </remarks>
+ public Task FreeEntry(string tag);
+
+ /// <summary>
+ /// Retrieve the entry with given tag.
+ /// </summary>
+ /// <param name="tag">The tag of the entry.</param>
+ /// <returns>The entry.</returns>
+ /// <exception cref="ArgumentNullException">Thrown when <paramref name="tag"/> is null.</exception>
+ /// <exception cref="InvalidOperationException">Thrown when entry with given tag does not exist.</exception>
+ public Task<DataEntry> GetEntry(string tag);
+
+ /// <summary>
+ /// Retrieve info of the entry with given tag.
+ /// </summary>
+ /// <param name="tag">The tag of the entry.</param>
+ /// <returns>The entry info.</returns>
+ /// <exception cref="ArgumentNullException">Thrown when <paramref name="tag"/> is null.</exception>
+ /// <exception cref="InvalidOperationException">Thrown when entry with given tag does not exist.</exception>
+ public Task<DataInfo> GetEntryInfo(string tag);
+ }
+
+}
|