changeset 46:d6fbd0b3586e

Issue 8: Wrong results for array of arrays. (Temporary fix).
author Jacob Carlborg <doob@me.com>
date Tue, 09 Aug 2011 11:38:50 +0200
parents 3cd22957e411
children 9c9bbef6bf5e
files orange/serialization/Serializer.d orange/serialization/archives/XMLArchive.d
diffstat 2 files changed, 23 insertions(+), 16 deletions(-) [+]
line wrap: on
line diff
--- a/orange/serialization/Serializer.d	Tue Aug 09 10:13:29 2011 +0200
+++ b/orange/serialization/Serializer.d	Tue Aug 09 11:38:50 2011 +0200
@@ -551,7 +551,7 @@
 	private T deserializeArray (T) (string key)
 	{
 		auto slice = deserializeSlice(key);
-		
+
 		if (auto tmp = getDeserializedSlice!(T)(slice))
 			return *tmp;
 		
@@ -563,7 +563,7 @@
 			foreach (i, ref e ; value)
 				e = deserializeInternal!(typeof(e))(toData(i));
 		};
-		
+
 		if (slice.id != size_t.max)
 		{
 			archive.unarchiveArray(slice.id, dg);
@@ -578,7 +578,7 @@
 			
 			if (auto a = slice.id in deserializedSlices)
 				return cast(T) *a;
-			
+
 			addDeserializedSlice(value, slice.id);
 			
 			return value;
--- a/orange/serialization/archives/XMLArchive.d	Tue Aug 09 10:13:29 2011 +0200
+++ b/orange/serialization/archives/XMLArchive.d	Tue Aug 09 11:38:50 2011 +0200
@@ -773,7 +773,7 @@
 			auto length = fromData!(size_t)(getValueOfAttribute(Attributes.lengthAttribute, element));
 			auto offset = fromData!(size_t)(getValueOfAttribute(Attributes.offsetAttribute, element));
 			auto id = toId(element.value);
-			
+
 			return Slice(length, offset, id);
 		}
 		
@@ -1051,7 +1051,7 @@
 	}
 	
 	private doc.Node getElement (Data tag, string key, Data attribute = Attributes.keyAttribute, bool throwOnError = true)
-	{		
+	{
 		auto set = lastElement.query[tag].attribute((doc.Node node) {
 			if (node.name == attribute && node.value == key)
 				return true;
@@ -1059,22 +1059,29 @@
 			return false;
 		});
 
-		if (set.nodes.length == 1)
-			return set.nodes[0].parent;
+		version (Tango)
+		{
+			if (set.nodes.length == 1)
+				return set.nodes[0].parent;
+		}
 		
 		else
+		{	// Temporary fix, this is probably a problem in the Phobos
+			// implementation of the XML query function
+			if (set.nodes.length > 0)
+				return set.nodes[set.nodes.length - 1].parent;
+		}
+
+		if (throwOnError && errorCallback)
 		{
-			if (throwOnError && errorCallback)
-			{
-				if (set.nodes.length == 0)					
-					errorCallback(new ArchiveException(`Could not find an element "` ~ to!(string)(tag) ~ `" with the attribute "` ~ to!(string)(Attributes.keyAttribute) ~ `" with the value "` ~ to!(string)(key) ~ `".`, __FILE__, __LINE__), [tag, Attributes.keyAttribute, key]);
-				
-				else
-					errorCallback(new ArchiveException(`Could not unarchive the value with the key "` ~ to!(string)(key) ~ `" due to malformed data.`, __FILE__, __LINE__), [tag, Attributes.keyAttribute, key]);
-			}
+			if (set.nodes.length == 0)
+				errorCallback(new ArchiveException(`Could not find an element "` ~ to!(string)(tag) ~ `" with the attribute "` ~ to!(string)(Attributes.keyAttribute) ~ `" with the value "` ~ to!(string)(key) ~ `".`, __FILE__, __LINE__), [tag, Attributes.keyAttribute, key]);
 
-			return doc.Node.invalid;
+			else
+				errorCallback(new ArchiveException(`Could not unarchive the value with the key "` ~ to!(string)(key) ~ `" due to malformed data.`, __FILE__, __LINE__), [tag, Attributes.keyAttribute, key]);
 		}
+
+		return doc.Node.invalid;
 	}
 	
 	private Data getValueOfAttribute (Data attribute, doc.Node element = doc.Node.invalid)