Index: /trunk/glueforge/templates/psdb/Makefile.am
===================================================================
--- /trunk/glueforge/templates/psdb/Makefile.am	(revision 8158)
+++ /trunk/glueforge/templates/psdb/Makefile.am	(revision 8159)
@@ -68,6 +68,8 @@
     popobject_c.tt \
     popobject_h.tt \
-	printobjects.tt \
-	printobjects_h.tt \
+    printmetadatas.tt \
+    printmetadatas_h.tt \
+    printobjects.tt \
+    printobjects_h.tt \
     selectrowobjects.tt \
     selectrowobjects_h.tt \
Index: /trunk/glueforge/templates/psdb/code.tt
===================================================================
--- /trunk/glueforge/templates/psdb/code.tt	(revision 8158)
+++ /trunk/glueforge/templates/psdb/code.tt	(revision 8159)
@@ -11,4 +11,5 @@
 [% INCLUDE init.tt %]
 [% INCLUDE cleanup.tt %]
+[% INCLUDE printmetadatas.tt %]
 [% FOREACH table = tables -%]
 [% INCLUDE alloc.tt %]
Index: /trunk/glueforge/templates/psdb/header.tt
===================================================================
--- /trunk/glueforge/templates/psdb/header.tt	(revision 8158)
+++ /trunk/glueforge/templates/psdb/header.tt	(revision 8159)
@@ -13,4 +13,5 @@
 [% INCLUDE init_h.tt %]
 [% INCLUDE cleanup_h.tt %]
+[% INCLUDE printmetadatas_h.tt %]
 [% FOREACH table = tables -%]
 [% INCLUDE object_h.tt %]
Index: /trunk/glueforge/templates/psdb/printmetadatas.tt
===================================================================
--- /trunk/glueforge/templates/psdb/printmetadatas.tt	(revision 8159)
+++ /trunk/glueforge/templates/psdb/printmetadatas.tt	(revision 8159)
@@ -0,0 +1,35 @@
+bool [% pkg_namespace %]PrintMetadatas(FILE *stream, psArray *mds, const char *mdname, bool mdconfigformat)
+{
+    PS_ASSERT_PTR_NON_NULL(mds, false);
+    PS_ASSERT_PTR_NON_NULL(mdname, false);
+
+    psMetadata *output = psMetadataAlloc();
+    for (long i = 0; i < psArrayLength(mds); i++) {
+        psMetadata *md = mds->data[i];
+        if (!psMetadataAddMetadata(
+            output,
+            PS_LIST_TAIL,
+            mdname,
+            PS_META_DUPLICATE_OK,
+            NULL,
+            md
+        )) {
+            psError(PS_ERR_UNKNOWN, false, "failed to add metadata");
+            psFree(md);
+            psFree(output);
+            return false;
+        }
+        psFree(md);
+    }
+
+    psString str = psMetadataConfigFormat(output);
+    if (!str) {
+        psError(PS_ERR_UNKNOWN, false, "failed to format data into a string");
+        psFree(output);
+    }
+    psFree(output);
+    fprintf(stream, "%s\n", str);
+    psFree(str);
+
+    return true;
+}
Index: /trunk/glueforge/templates/psdb/printmetadatas_h.tt
===================================================================
--- /trunk/glueforge/templates/psdb/printmetadatas_h.tt	(revision 8159)
+++ /trunk/glueforge/templates/psdb/printmetadatas_h.tt	(revision 8159)
@@ -0,0 +1,14 @@
+/** Formats and prints an array of metadata
+ *
+ * When mdconfigformat is set the formated output is in psMetadataConfig
+ * format, otherwise it is in a simple tabular format.
+ *
+ * @return true on success
+ */
+
+bool [% pkg_namespace %]PrintMetadatas(
+    FILE            *stream,            ///< a stream
+    psArray         *mds,               ///< An array of metadata
+    const char      *mdname,            ///< name of the metadata(s)
+    bool            mdconfigformat      ///< format as mdconfig or simple
+);
