source: trunk/CrypPlugins/KeySearcher/P2P/Storage/StorageHelper.cs @ 1674

Last change on this file since 1674 was 1674, checked in by Paul Lelgemann, 12 years ago

o Refactored distributed KeySearcher: updated directory structure and variable names

File size: 4.3 KB
Line 
1using System;
2using System.IO;
3using Cryptool.P2P;
4using Cryptool.P2P.Internal;
5using KeySearcher.P2P.Tree;
6
7namespace KeySearcher.P2P.Storage
8{
9    class StorageHelper
10    {
11        private readonly KeySearcher keySearcher;
12
13        public StorageHelper(KeySearcher keySearcher)
14        {
15            this.keySearcher = keySearcher;
16        }
17
18        internal static RequestResult UpdateInDht(NodeBase nodeToUpdate)
19        {
20            var memoryStream = new MemoryStream();
21            var binaryWriter = new BinaryWriter(memoryStream);
22
23            if (nodeToUpdate is Node)
24            {
25                UpdateNodeInDht((Node) nodeToUpdate, binaryWriter);
26            } else
27            {
28                UpdateLeafInDht((Leaf) nodeToUpdate, binaryWriter);
29            }
30
31            // Append results
32            binaryWriter.Write(nodeToUpdate.Result.Count);
33            foreach (var valueKey in nodeToUpdate.Result)
34            {
35                binaryWriter.Write(valueKey.key);
36                binaryWriter.Write(valueKey.value);
37                binaryWriter.Write(valueKey.decryption.Length);
38                binaryWriter.Write(valueKey.decryption);
39            }
40
41            return P2PManager.Store(KeyInDht(nodeToUpdate), memoryStream.ToArray());
42        }
43
44        private static void UpdateNodeInDht(Node nodeToUpdate, BinaryWriter binaryWriter)
45        {
46            binaryWriter.Write(nodeToUpdate.LeftChildFinished);
47            binaryWriter.Write(nodeToUpdate.RightChildFinished);
48        }
49
50        private static void UpdateLeafInDht(Leaf nodeToUpdate, BinaryWriter binaryWriter)
51        {
52            var buffer = nodeToUpdate.LastReservationDate.ToBinary();
53            binaryWriter.Write(buffer);
54        }
55
56        internal RequestResult UpdateFromDht(NodeBase nodeToUpdate, bool forceUpdate = false)
57        {
58            if (!forceUpdate && nodeToUpdate.LastUpdate > DateTime.Now.Subtract(new TimeSpan(0, 0, 5)))
59            {
60                return new RequestResult { Status = RequestResultType.Success };
61            }
62
63            nodeToUpdate.LastUpdate = DateTime.Now;
64
65            var requestResult = P2PManager.Retrieve(KeyInDht(nodeToUpdate));
66            var nodeBytes = requestResult.Data;
67
68            if (nodeBytes == null)
69            {
70                return requestResult;
71            }
72
73            var binaryReader = new BinaryReader(new MemoryStream(nodeBytes));
74
75            if (nodeToUpdate is Node)
76            {
77                UpdateNodeFromDht((Node) nodeToUpdate, binaryReader);
78            } else
79            {
80                UpdateLeafFromDht((Leaf) nodeToUpdate, binaryReader);
81            }
82
83            // Load results
84            var resultCount = binaryReader.ReadInt32();
85            for (var i = 0; i < resultCount; i++)
86            {
87                var newResult = new KeySearcher.ValueKey
88                                    {
89                                        key = binaryReader.ReadString(),
90                                        value = binaryReader.ReadDouble(),
91                                        decryption = binaryReader.ReadBytes(binaryReader.ReadInt32())
92                                    };
93                nodeToUpdate.Result.AddLast(newResult);
94            }
95
96            if (resultCount > 0)
97            {
98                keySearcher.IntegrateNewResults(nodeToUpdate.Result);
99            }
100
101            return requestResult;
102        }
103
104        private static void UpdateNodeFromDht(Node nodeToUpdate, BinaryReader binaryReader)
105        {
106            nodeToUpdate.LeftChildFinished = binaryReader.ReadBoolean() || nodeToUpdate.LeftChildFinished;
107            nodeToUpdate.RightChildFinished = binaryReader.ReadBoolean() || nodeToUpdate.RightChildFinished;
108        }
109
110        private static void UpdateLeafFromDht(Leaf nodeToUpdate, BinaryReader binaryReader)
111        {
112            var date = DateTime.FromBinary(binaryReader.ReadInt64());
113            if (date > nodeToUpdate.LastReservationDate)
114            {
115                nodeToUpdate.LastReservationDate = date;
116            }
117        }
118
119        internal static string KeyInDht(NodeBase node)
120        {
121            return string.Format("{0}_node_{1}_{2}", node.DistributedJobIdentifier, node.From, node.To);
122        }
123    }
124}
Note: See TracBrowser for help on using the repository browser.