Index: /trunk/glueforge/templates/psdb/printmetadataraw.tt
===================================================================
--- /trunk/glueforge/templates/psdb/printmetadataraw.tt	(revision 8206)
+++ /trunk/glueforge/templates/psdb/printmetadataraw.tt	(revision 8207)
@@ -3,10 +3,74 @@
     PS_ASSERT_PTR_NON_NULL(md, false);
 
-    psString str = psMetadataConfigFormat(md);
-    if (!str) {
-        psError(PS_ERR_UNKNOWN, false, "failed to format data into a string");
+    if (mdcf) {
+        psString str = psMetadataConfigFormat(md);
+        if (!str) {
+            psError(PS_ERR_UNKNOWN, false, "failed to format data into a string");
+            psFree(str);
+            return false;
+        }
+        fprintf(stream, "%s\n", str);
+        psFree(str);
+
+        return true;
     }
-    fprintf(stream, "%s\n", str);
-    psFree(str);
+
+#define METADATAITEM_STRIFY_CASE(ptype, format, type) \
+case ptype: \
+    psStringAppend(&str, #format, item->data.type); \
+    break;
+
+    // else
+    // flatten the metadata into | separated values
+    psString str = NULL;
+    psMetadataItem *item = NULL;
+    psMetadataIterator *iter = psMetadataIteratorAlloc(md, 0, NULL);
+    while ((item = psMetadataGetAndIncrement(iter))) {
+        switch (item->type) {
+            METADATAITEM_STRIFY_CASE(PS_DATA_S8, %d, S8);
+            METADATAITEM_STRIFY_CASE(PS_DATA_S16, %d, S16);
+            METADATAITEM_STRIFY_CASE(PS_DATA_S32, %d, S32);
+            METADATAITEM_STRIFY_CASE(PS_DATA_S64, %lld, S64);
+            METADATAITEM_STRIFY_CASE(PS_DATA_U8, %u, U8);
+            METADATAITEM_STRIFY_CASE(PS_DATA_U16, %u, U16);
+            METADATAITEM_STRIFY_CASE(PS_DATA_U32, %u, U32);
+            METADATAITEM_STRIFY_CASE(PS_DATA_U64, %llu, U64);
+            METADATAITEM_STRIFY_CASE(PS_DATA_F32, %f, F32);
+            METADATAITEM_STRIFY_CASE(PS_DATA_F64, %f, F64);
+            case PS_DATA_STRING:
+                psStringAppend(&str, "%s", (char*)(item->data.V));
+                break;
+            case PS_DATA_BOOL:
+                if (item->data.B) {
+                    psStringAppend(&str, "T");
+                } else {
+                    psStringAppend(&str, "F");
+                }
+                break;
+            case PS_DATA_METADATA:
+                if (![% pkg_namespace %]PrintMetadataRaw(stream, item->data.md, mdcf)) {
+                    psError(PS_ERR_UNKNOWN, false ,"failed to print nested metadata");
+                }
+                // a metadata is a special case. We don't want a | seperating
+                // the metadata from any other output so we need to skip the
+                // !->offEnd test
+                continue;
+            default:
+                psError(PS_ERR_UNKNOWN, true,"unsupported psMetadataItem type");
+                psFree(iter);
+                psFree(str);
+                return false;
+        }
+        if (!iter->iter->offEnd) {
+            psStringAppend(&str, "|");
+        }
+    }
+    psFree(iter);
+
+    // if we did nothing but handle recursive metadatas str will be NULL
+    if (str) {
+        fprintf(stream, "%s\n", str);
+        psFree(str);
+    }
 
     return true;
Index: /trunk/glueforge/templates/psdb/printobjects.tt
===================================================================
--- /trunk/glueforge/templates/psdb/printobjects.tt	(revision 8206)
+++ /trunk/glueforge/templates/psdb/printobjects.tt	(revision 8207)
@@ -22,12 +22,9 @@
     }
 
-    psString str = psMetadataConfigFormat(output);
-    if (!str) {
-        psError(PS_ERR_UNKNOWN, false, "failed to format data into a string");
+    if (![% pkg_namespace %]PrintMetadataRaw(stream, output, mdcf)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to print metadata");
         psFree(output);
     }
     psFree(output);
-    fprintf(stream, "%s\n", str);
-    psFree(str);
 
     return true;
