Files
Umbraco-CMS/src/Umbraco.Web/PublishedCache/NuCache/DataSource/BTree.cs

205 lines
9.0 KiB
C#
Raw Normal View History

2016-05-27 14:26:28 +02:00
using System;
using System.Collections.Generic;
using System.IO;
using CSharpTest.Net.Collections;
using CSharpTest.Net.Serialization;
namespace Umbraco.Web.PublishedCache.NuCache.DataSource
{
class BTree
{
public static BPlusTree<int, ContentNodeKit> GetTree(string filepath, bool exists)
{
var keySerializer = new PrimitiveSerializer();
var valueSerializer = new ContentNodeKitSerializer();
var options = new BPlusTree<int, ContentNodeKit>.OptionsV2(keySerializer, valueSerializer)
{
CreateFile = exists ? CreatePolicy.IfNeeded : CreatePolicy.Always,
FileName = filepath,
// other options?
};
var tree = new BPlusTree<int, ContentNodeKit>(options);
// anything?
//btree.
return tree;
}
class ContentNodeKitSerializer : ISerializer<ContentNodeKit>
{
static readonly ContentDataSerializer DataSerializer = new ContentDataSerializer();
//static readonly ListOfIntSerializer ChildContentIdsSerializer = new ListOfIntSerializer();
public ContentNodeKit ReadFrom(Stream stream)
{
var kit = new ContentNodeKit
{
Node = new ContentNode(
PrimitiveSerializer.Int32.ReadFrom(stream), // id
PrimitiveSerializer.Guid.ReadFrom(stream), // uid
PrimitiveSerializer.Int32.ReadFrom(stream), // level
PrimitiveSerializer.String.ReadFrom(stream), // path
PrimitiveSerializer.Int32.ReadFrom(stream), // sort order
PrimitiveSerializer.Int32.ReadFrom(stream), // parent id
PrimitiveSerializer.DateTime.ReadFrom(stream), // date created
PrimitiveSerializer.Int32.ReadFrom(stream) // creator id
),
ContentTypeId = PrimitiveSerializer.Int32.ReadFrom(stream)
};
var hasDraft = PrimitiveSerializer.Boolean.ReadFrom(stream);
if (hasDraft)
kit.DraftData = DataSerializer.ReadFrom(stream);
var hasPublished = PrimitiveSerializer.Boolean.ReadFrom(stream);
if (hasPublished)
kit.PublishedData = DataSerializer.ReadFrom(stream);
return kit;
}
public void WriteTo(ContentNodeKit value, Stream stream)
{
PrimitiveSerializer.Int32.WriteTo(value.Node.Id, stream);
PrimitiveSerializer.Guid.WriteTo(value.Node.Uid, stream);
PrimitiveSerializer.Int32.WriteTo(value.Node.Level, stream);
PrimitiveSerializer.String.WriteTo(value.Node.Path, stream);
PrimitiveSerializer.Int32.WriteTo(value.Node.SortOrder, stream);
PrimitiveSerializer.Int32.WriteTo(value.Node.ParentContentId, stream);
PrimitiveSerializer.DateTime.WriteTo(value.Node.CreateDate, stream);
PrimitiveSerializer.Int32.WriteTo(value.Node.CreatorId, stream);
PrimitiveSerializer.Int32.WriteTo(value.ContentTypeId, stream);
PrimitiveSerializer.Boolean.WriteTo(value.DraftData != null, stream);
if (value.DraftData != null)
DataSerializer.WriteTo(value.DraftData, stream);
PrimitiveSerializer.Boolean.WriteTo(value.PublishedData != null, stream);
if (value.PublishedData != null)
DataSerializer.WriteTo(value.PublishedData, stream);
}
}
class ContentDataSerializer : ISerializer<ContentData>
{
private readonly static DictionaryOfValuesSerializer PropertiesSerializer = new DictionaryOfValuesSerializer();
public ContentData ReadFrom(Stream stream)
{
return new ContentData
{
Published = PrimitiveSerializer.Boolean.ReadFrom(stream),
Name = PrimitiveSerializer.String.ReadFrom(stream),
Version = PrimitiveSerializer.Guid.ReadFrom(stream),
VersionDate = PrimitiveSerializer.DateTime.ReadFrom(stream),
WriterId = PrimitiveSerializer.Int32.ReadFrom(stream),
TemplateId = PrimitiveSerializer.Int32.ReadFrom(stream),
Properties = PropertiesSerializer.ReadFrom(stream)
};
}
public void WriteTo(ContentData value, Stream stream)
{
PrimitiveSerializer.Boolean.WriteTo(value.Published, stream);
PrimitiveSerializer.String.WriteTo(value.Name, stream);
PrimitiveSerializer.Guid.WriteTo(value.Version, stream);
PrimitiveSerializer.DateTime.WriteTo(value.VersionDate, stream);
PrimitiveSerializer.Int32.WriteTo(value.WriterId, stream);
PrimitiveSerializer.Int32.WriteTo(value.TemplateId, stream);
PropertiesSerializer.WriteTo(value.Properties, stream);
}
}
/*
class ListOfIntSerializer : ISerializer<List<int>>
{
public List<int> ReadFrom(Stream stream)
{
var list = new List<int>();
var count = PrimitiveSerializer.Int32.ReadFrom(stream);
for (var i = 0; i < count; i++)
list.Add(PrimitiveSerializer.Int32.ReadFrom(stream));
return list;
}
public void WriteTo(List<int> value, Stream stream)
{
PrimitiveSerializer.Int32.WriteTo(value.Count, stream);
foreach (var item in value)
PrimitiveSerializer.Int32.WriteTo(item, stream);
}
}
*/
class DictionaryOfValuesSerializer : ISerializer<IDictionary<string, object>>
{
public IDictionary<string, object> ReadFrom(Stream stream)
{
var dict = new Dictionary<string, object>();
var count = PrimitiveSerializer.Int32.ReadFrom(stream);
for (var i = 0; i < count; i++)
{
var key = PrimitiveSerializer.String.ReadFrom(stream);
var type = PrimitiveSerializer.Char.ReadFrom(stream);
switch (type)
{
case 'N':
dict.Add(key, null);
break;
case 'S':
dict.Add(key, PrimitiveSerializer.String.ReadFrom(stream));
break;
case 'I':
dict.Add(key, PrimitiveSerializer.Int32.ReadFrom(stream));
break;
case 'L':
dict.Add(key, PrimitiveSerializer.Int64.ReadFrom(stream));
break;
case 'D':
dict.Add(key, PrimitiveSerializer.DateTime.ReadFrom(stream));
break;
default:
throw new NotSupportedException("Cannot deserialize '" + type + "' value.");
}
}
return dict;
}
public void WriteTo(IDictionary<string, object> value, Stream stream)
{
PrimitiveSerializer.Int32.WriteTo(value.Count, stream);
foreach (var kvp in value)
{
PrimitiveSerializer.String.WriteTo(kvp.Key, stream);
if (kvp.Value == null)
{
PrimitiveSerializer.Char.WriteTo('N', stream);
}
else if (kvp.Value is string)
{
PrimitiveSerializer.Char.WriteTo('S', stream);
PrimitiveSerializer.String.WriteTo((string) kvp.Value, stream);
}
else if (kvp.Value is int)
{
PrimitiveSerializer.Char.WriteTo('I', stream);
PrimitiveSerializer.Int32.WriteTo((int) kvp.Value, stream);
}
else if (kvp.Value is long)
{
PrimitiveSerializer.Char.WriteTo('L', stream);
PrimitiveSerializer.Int64.WriteTo((long) kvp.Value, stream);
}
else if (kvp.Value is DateTime)
{
PrimitiveSerializer.Char.WriteTo('D', stream);
PrimitiveSerializer.DateTime.WriteTo((DateTime) kvp.Value, stream);
}
else
throw new NotSupportedException("Value type " + kvp.Value.GetType().FullName + " cannot be serialized.");
}
}
}
}
}