Index: /trunk/ippdb/configure.ac
===================================================================
--- /trunk/ippdb/configure.ac	(revision 8155)
+++ /trunk/ippdb/configure.ac	(revision 8156)
@@ -1,5 +1,5 @@
 AC_PREREQ(2.59)
 
-AC_INIT([ippdb], [0.0.14], [pan-starrs.ifa.hawaii.edu])
+AC_INIT([ippdb], [0.0.15], [pan-starrs.ifa.hawaii.edu])
 AC_CONFIG_SRCDIR([ippdb.pc.in])
 
Index: /trunk/ippdb/src/ippdb.c
===================================================================
--- /trunk/ippdb/src/ippdb.c	(revision 8155)
+++ /trunk/ippdb/src/ippdb.c	(revision 8156)
@@ -575,14 +575,38 @@
     return deleted;
 }
-/** Formats and prints an array of weatherRow objects
- *
- * @return A boolean - false on error
- */
-
-bool weatherPrintObjects(
-    FILE            *stream,            ///< a stream
-    psArray         *objects,           ///< An array of weatherRow objects
-    bool            mdconfigformat      ///< format as mdconfig or simple
-);
+bool weatherPrintObjects(FILE *stream, psArray *objects, bool mdconfigformat)
+{
+    PS_ASSERT_PTR_NON_NULL(objects, false);
+
+    psMetadata *output = psMetadataAlloc();
+    for (long i = 0; i < psArrayLength(objects); i++) {
+        psMetadata *md = weatherMetadataFromObject(objects->data[i]);
+        if (!psMetadataAddMetadata(
+            output,
+            PS_LIST_TAIL,
+            WEATHER_TABLE_NAME,
+            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;
+}
 static void skyp_transparencyRowFree(skyp_transparencyRow *object);
 
@@ -1084,14 +1108,38 @@
     return deleted;
 }
-/** Formats and prints an array of skyp_transparencyRow objects
- *
- * @return A boolean - false on error
- */
-
-bool skyp_transparencyPrintObjects(
-    FILE            *stream,            ///< a stream
-    psArray         *objects,           ///< An array of skyp_transparencyRow objects
-    bool            mdconfigformat      ///< format as mdconfig or simple
-);
+bool skyp_transparencyPrintObjects(FILE *stream, psArray *objects, bool mdconfigformat)
+{
+    PS_ASSERT_PTR_NON_NULL(objects, false);
+
+    psMetadata *output = psMetadataAlloc();
+    for (long i = 0; i < psArrayLength(objects); i++) {
+        psMetadata *md = skyp_transparencyMetadataFromObject(objects->data[i]);
+        if (!psMetadataAddMetadata(
+            output,
+            PS_LIST_TAIL,
+            SKYP_TRANSPARENCY_TABLE_NAME,
+            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;
+}
 static void skyp_absorptionRowFree(skyp_absorptionRow *object);
 
@@ -1651,14 +1699,38 @@
     return deleted;
 }
-/** Formats and prints an array of skyp_absorptionRow objects
- *
- * @return A boolean - false on error
- */
-
-bool skyp_absorptionPrintObjects(
-    FILE            *stream,            ///< a stream
-    psArray         *objects,           ///< An array of skyp_absorptionRow objects
-    bool            mdconfigformat      ///< format as mdconfig or simple
-);
+bool skyp_absorptionPrintObjects(FILE *stream, psArray *objects, bool mdconfigformat)
+{
+    PS_ASSERT_PTR_NON_NULL(objects, false);
+
+    psMetadata *output = psMetadataAlloc();
+    for (long i = 0; i < psArrayLength(objects); i++) {
+        psMetadata *md = skyp_absorptionMetadataFromObject(objects->data[i]);
+        if (!psMetadataAddMetadata(
+            output,
+            PS_LIST_TAIL,
+            SKYP_ABSORPTION_TABLE_NAME,
+            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;
+}
 static void skyp_emissionRowFree(skyp_emissionRow *object);
 
@@ -2131,14 +2203,38 @@
     return deleted;
 }
-/** Formats and prints an array of skyp_emissionRow objects
- *
- * @return A boolean - false on error
- */
-
-bool skyp_emissionPrintObjects(
-    FILE            *stream,            ///< a stream
-    psArray         *objects,           ///< An array of skyp_emissionRow objects
-    bool            mdconfigformat      ///< format as mdconfig or simple
-);
+bool skyp_emissionPrintObjects(FILE *stream, psArray *objects, bool mdconfigformat)
+{
+    PS_ASSERT_PTR_NON_NULL(objects, false);
+
+    psMetadata *output = psMetadataAlloc();
+    for (long i = 0; i < psArrayLength(objects); i++) {
+        psMetadata *md = skyp_emissionMetadataFromObject(objects->data[i]);
+        if (!psMetadataAddMetadata(
+            output,
+            PS_LIST_TAIL,
+            SKYP_EMISSION_TABLE_NAME,
+            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;
+}
 static void dimmRowFree(dimmRow *object);
 
@@ -2640,14 +2736,38 @@
     return deleted;
 }
-/** Formats and prints an array of dimmRow objects
- *
- * @return A boolean - false on error
- */
-
-bool dimmPrintObjects(
-    FILE            *stream,            ///< a stream
-    psArray         *objects,           ///< An array of dimmRow objects
-    bool            mdconfigformat      ///< format as mdconfig or simple
-);
+bool dimmPrintObjects(FILE *stream, psArray *objects, bool mdconfigformat)
+{
+    PS_ASSERT_PTR_NON_NULL(objects, false);
+
+    psMetadata *output = psMetadataAlloc();
+    for (long i = 0; i < psArrayLength(objects); i++) {
+        psMetadata *md = dimmMetadataFromObject(objects->data[i]);
+        if (!psMetadataAddMetadata(
+            output,
+            PS_LIST_TAIL,
+            DIMM_TABLE_NAME,
+            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;
+}
 static void skyp_irRowFree(skyp_irRow *object);
 
@@ -3119,14 +3239,38 @@
     return deleted;
 }
-/** Formats and prints an array of skyp_irRow objects
- *
- * @return A boolean - false on error
- */
-
-bool skyp_irPrintObjects(
-    FILE            *stream,            ///< a stream
-    psArray         *objects,           ///< An array of skyp_irRow objects
-    bool            mdconfigformat      ///< format as mdconfig or simple
-);
+bool skyp_irPrintObjects(FILE *stream, psArray *objects, bool mdconfigformat)
+{
+    PS_ASSERT_PTR_NON_NULL(objects, false);
+
+    psMetadata *output = psMetadataAlloc();
+    for (long i = 0; i < psArrayLength(objects); i++) {
+        psMetadata *md = skyp_irMetadataFromObject(objects->data[i]);
+        if (!psMetadataAddMetadata(
+            output,
+            PS_LIST_TAIL,
+            SKYP_IR_TABLE_NAME,
+            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;
+}
 static void domeRowFree(domeRow *object);
 
@@ -3540,14 +3684,38 @@
     return deleted;
 }
-/** Formats and prints an array of domeRow objects
- *
- * @return A boolean - false on error
- */
-
-bool domePrintObjects(
-    FILE            *stream,            ///< a stream
-    psArray         *objects,           ///< An array of domeRow objects
-    bool            mdconfigformat      ///< format as mdconfig or simple
-);
+bool domePrintObjects(FILE *stream, psArray *objects, bool mdconfigformat)
+{
+    PS_ASSERT_PTR_NON_NULL(objects, false);
+
+    psMetadata *output = psMetadataAlloc();
+    for (long i = 0; i < psArrayLength(objects); i++) {
+        psMetadata *md = domeMetadataFromObject(objects->data[i]);
+        if (!psMetadataAddMetadata(
+            output,
+            PS_LIST_TAIL,
+            DOME_TABLE_NAME,
+            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;
+}
 static void telescopeRowFree(telescopeRow *object);
 
@@ -3991,14 +4159,38 @@
     return deleted;
 }
-/** Formats and prints an array of telescopeRow objects
- *
- * @return A boolean - false on error
- */
-
-bool telescopePrintObjects(
-    FILE            *stream,            ///< a stream
-    psArray         *objects,           ///< An array of telescopeRow objects
-    bool            mdconfigformat      ///< format as mdconfig or simple
-);
+bool telescopePrintObjects(FILE *stream, psArray *objects, bool mdconfigformat)
+{
+    PS_ASSERT_PTR_NON_NULL(objects, false);
+
+    psMetadata *output = psMetadataAlloc();
+    for (long i = 0; i < psArrayLength(objects); i++) {
+        psMetadata *md = telescopeMetadataFromObject(objects->data[i]);
+        if (!psMetadataAddMetadata(
+            output,
+            PS_LIST_TAIL,
+            TELESCOPE_TABLE_NAME,
+            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;
+}
 static void summitExpRowFree(summitExpRow *object);
 
@@ -4446,14 +4638,38 @@
     return deleted;
 }
-/** Formats and prints an array of summitExpRow objects
- *
- * @return A boolean - false on error
- */
-
-bool summitExpPrintObjects(
-    FILE            *stream,            ///< a stream
-    psArray         *objects,           ///< An array of summitExpRow objects
-    bool            mdconfigformat      ///< format as mdconfig or simple
-);
+bool summitExpPrintObjects(FILE *stream, psArray *objects, bool mdconfigformat)
+{
+    PS_ASSERT_PTR_NON_NULL(objects, false);
+
+    psMetadata *output = psMetadataAlloc();
+    for (long i = 0; i < psArrayLength(objects); i++) {
+        psMetadata *md = summitExpMetadataFromObject(objects->data[i]);
+        if (!psMetadataAddMetadata(
+            output,
+            PS_LIST_TAIL,
+            SUMMITEXP_TABLE_NAME,
+            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;
+}
 static void pzPendingExpRowFree(pzPendingExpRow *object);
 
@@ -4900,14 +5116,38 @@
     return deleted;
 }
-/** Formats and prints an array of pzPendingExpRow objects
- *
- * @return A boolean - false on error
- */
-
-bool pzPendingExpPrintObjects(
-    FILE            *stream,            ///< a stream
-    psArray         *objects,           ///< An array of pzPendingExpRow objects
-    bool            mdconfigformat      ///< format as mdconfig or simple
-);
+bool pzPendingExpPrintObjects(FILE *stream, psArray *objects, bool mdconfigformat)
+{
+    PS_ASSERT_PTR_NON_NULL(objects, false);
+
+    psMetadata *output = psMetadataAlloc();
+    for (long i = 0; i < psArrayLength(objects); i++) {
+        psMetadata *md = pzPendingExpMetadataFromObject(objects->data[i]);
+        if (!psMetadataAddMetadata(
+            output,
+            PS_LIST_TAIL,
+            PZPENDINGEXP_TABLE_NAME,
+            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;
+}
 static void pzPendingImfileRowFree(pzPendingImfileRow *object);
 
@@ -5384,14 +5624,38 @@
     return deleted;
 }
-/** Formats and prints an array of pzPendingImfileRow objects
- *
- * @return A boolean - false on error
- */
-
-bool pzPendingImfilePrintObjects(
-    FILE            *stream,            ///< a stream
-    psArray         *objects,           ///< An array of pzPendingImfileRow objects
-    bool            mdconfigformat      ///< format as mdconfig or simple
-);
+bool pzPendingImfilePrintObjects(FILE *stream, psArray *objects, bool mdconfigformat)
+{
+    PS_ASSERT_PTR_NON_NULL(objects, false);
+
+    psMetadata *output = psMetadataAlloc();
+    for (long i = 0; i < psArrayLength(objects); i++) {
+        psMetadata *md = pzPendingImfileMetadataFromObject(objects->data[i]);
+        if (!psMetadataAddMetadata(
+            output,
+            PS_LIST_TAIL,
+            PZPENDINGIMFILE_TABLE_NAME,
+            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;
+}
 static void newExpRowFree(newExpRow *object);
 
@@ -5838,14 +6102,38 @@
     return deleted;
 }
-/** Formats and prints an array of newExpRow objects
- *
- * @return A boolean - false on error
- */
-
-bool newExpPrintObjects(
-    FILE            *stream,            ///< a stream
-    psArray         *objects,           ///< An array of newExpRow objects
-    bool            mdconfigformat      ///< format as mdconfig or simple
-);
+bool newExpPrintObjects(FILE *stream, psArray *objects, bool mdconfigformat)
+{
+    PS_ASSERT_PTR_NON_NULL(objects, false);
+
+    psMetadata *output = psMetadataAlloc();
+    for (long i = 0; i < psArrayLength(objects); i++) {
+        psMetadata *md = newExpMetadataFromObject(objects->data[i]);
+        if (!psMetadataAddMetadata(
+            output,
+            PS_LIST_TAIL,
+            NEWEXP_TABLE_NAME,
+            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;
+}
 static void newImfileRowFree(newImfileRow *object);
 
@@ -6263,14 +6551,38 @@
     return deleted;
 }
-/** Formats and prints an array of newImfileRow objects
- *
- * @return A boolean - false on error
- */
-
-bool newImfilePrintObjects(
-    FILE            *stream,            ///< a stream
-    psArray         *objects,           ///< An array of newImfileRow objects
-    bool            mdconfigformat      ///< format as mdconfig or simple
-);
+bool newImfilePrintObjects(FILE *stream, psArray *objects, bool mdconfigformat)
+{
+    PS_ASSERT_PTR_NON_NULL(objects, false);
+
+    psMetadata *output = psMetadataAlloc();
+    for (long i = 0; i < psArrayLength(objects); i++) {
+        psMetadata *md = newImfileMetadataFromObject(objects->data[i]);
+        if (!psMetadataAddMetadata(
+            output,
+            PS_LIST_TAIL,
+            NEWIMFILE_TABLE_NAME,
+            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;
+}
 static void rawDetrendExpRowFree(rawDetrendExpRow *object);
 
@@ -6892,14 +7204,38 @@
     return deleted;
 }
-/** Formats and prints an array of rawDetrendExpRow objects
- *
- * @return A boolean - false on error
- */
-
-bool rawDetrendExpPrintObjects(
-    FILE            *stream,            ///< a stream
-    psArray         *objects,           ///< An array of rawDetrendExpRow objects
-    bool            mdconfigformat      ///< format as mdconfig or simple
-);
+bool rawDetrendExpPrintObjects(FILE *stream, psArray *objects, bool mdconfigformat)
+{
+    PS_ASSERT_PTR_NON_NULL(objects, false);
+
+    psMetadata *output = psMetadataAlloc();
+    for (long i = 0; i < psArrayLength(objects); i++) {
+        psMetadata *md = rawDetrendExpMetadataFromObject(objects->data[i]);
+        if (!psMetadataAddMetadata(
+            output,
+            PS_LIST_TAIL,
+            RAWDETRENDEXP_TABLE_NAME,
+            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;
+}
 static void rawScienceExpRowFree(rawScienceExpRow *object);
 
@@ -7521,14 +7857,38 @@
     return deleted;
 }
-/** Formats and prints an array of rawScienceExpRow objects
- *
- * @return A boolean - false on error
- */
-
-bool rawScienceExpPrintObjects(
-    FILE            *stream,            ///< a stream
-    psArray         *objects,           ///< An array of rawScienceExpRow objects
-    bool            mdconfigformat      ///< format as mdconfig or simple
-);
+bool rawScienceExpPrintObjects(FILE *stream, psArray *objects, bool mdconfigformat)
+{
+    PS_ASSERT_PTR_NON_NULL(objects, false);
+
+    psMetadata *output = psMetadataAlloc();
+    for (long i = 0; i < psArrayLength(objects); i++) {
+        psMetadata *md = rawScienceExpMetadataFromObject(objects->data[i]);
+        if (!psMetadataAddMetadata(
+            output,
+            PS_LIST_TAIL,
+            RAWSCIENCEEXP_TABLE_NAME,
+            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;
+}
 static void rawImfileRowFree(rawImfileRow *object);
 
@@ -7946,14 +8306,38 @@
     return deleted;
 }
-/** Formats and prints an array of rawImfileRow objects
- *
- * @return A boolean - false on error
- */
-
-bool rawImfilePrintObjects(
-    FILE            *stream,            ///< a stream
-    psArray         *objects,           ///< An array of rawImfileRow objects
-    bool            mdconfigformat      ///< format as mdconfig or simple
-);
+bool rawImfilePrintObjects(FILE *stream, psArray *objects, bool mdconfigformat)
+{
+    PS_ASSERT_PTR_NON_NULL(objects, false);
+
+    psMetadata *output = psMetadataAlloc();
+    for (long i = 0; i < psArrayLength(objects); i++) {
+        psMetadata *md = rawImfileMetadataFromObject(objects->data[i]);
+        if (!psMetadataAddMetadata(
+            output,
+            PS_LIST_TAIL,
+            RAWIMFILE_TABLE_NAME,
+            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;
+}
 static void p1PendingExpRowFree(p1PendingExpRow *object);
 
@@ -8634,14 +9018,38 @@
     return deleted;
 }
-/** Formats and prints an array of p1PendingExpRow objects
- *
- * @return A boolean - false on error
- */
-
-bool p1PendingExpPrintObjects(
-    FILE            *stream,            ///< a stream
-    psArray         *objects,           ///< An array of p1PendingExpRow objects
-    bool            mdconfigformat      ///< format as mdconfig or simple
-);
+bool p1PendingExpPrintObjects(FILE *stream, psArray *objects, bool mdconfigformat)
+{
+    PS_ASSERT_PTR_NON_NULL(objects, false);
+
+    psMetadata *output = psMetadataAlloc();
+    for (long i = 0; i < psArrayLength(objects); i++) {
+        psMetadata *md = p1PendingExpMetadataFromObject(objects->data[i]);
+        if (!psMetadataAddMetadata(
+            output,
+            PS_LIST_TAIL,
+            P1PENDINGEXP_TABLE_NAME,
+            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;
+}
 static void p2PendingExpRowFree(p2PendingExpRow *object);
 
@@ -9351,14 +9759,38 @@
     return deleted;
 }
-/** Formats and prints an array of p2PendingExpRow objects
- *
- * @return A boolean - false on error
- */
-
-bool p2PendingExpPrintObjects(
-    FILE            *stream,            ///< a stream
-    psArray         *objects,           ///< An array of p2PendingExpRow objects
-    bool            mdconfigformat      ///< format as mdconfig or simple
-);
+bool p2PendingExpPrintObjects(FILE *stream, psArray *objects, bool mdconfigformat)
+{
+    PS_ASSERT_PTR_NON_NULL(objects, false);
+
+    psMetadata *output = psMetadataAlloc();
+    for (long i = 0; i < psArrayLength(objects); i++) {
+        psMetadata *md = p2PendingExpMetadataFromObject(objects->data[i]);
+        if (!psMetadataAddMetadata(
+            output,
+            PS_LIST_TAIL,
+            P2PENDINGEXP_TABLE_NAME,
+            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;
+}
 static void p2PendingImfileRowFree(p2PendingImfileRow *object);
 
@@ -9834,14 +10266,38 @@
     return deleted;
 }
-/** Formats and prints an array of p2PendingImfileRow objects
- *
- * @return A boolean - false on error
- */
-
-bool p2PendingImfilePrintObjects(
-    FILE            *stream,            ///< a stream
-    psArray         *objects,           ///< An array of p2PendingImfileRow objects
-    bool            mdconfigformat      ///< format as mdconfig or simple
-);
+bool p2PendingImfilePrintObjects(FILE *stream, psArray *objects, bool mdconfigformat)
+{
+    PS_ASSERT_PTR_NON_NULL(objects, false);
+
+    psMetadata *output = psMetadataAlloc();
+    for (long i = 0; i < psArrayLength(objects); i++) {
+        psMetadata *md = p2PendingImfileMetadataFromObject(objects->data[i]);
+        if (!psMetadataAddMetadata(
+            output,
+            PS_LIST_TAIL,
+            P2PENDINGIMFILE_TABLE_NAME,
+            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;
+}
 static void p2DoneExpRowFree(p2DoneExpRow *object);
 
@@ -10551,14 +11007,38 @@
     return deleted;
 }
-/** Formats and prints an array of p2DoneExpRow objects
- *
- * @return A boolean - false on error
- */
-
-bool p2DoneExpPrintObjects(
-    FILE            *stream,            ///< a stream
-    psArray         *objects,           ///< An array of p2DoneExpRow objects
-    bool            mdconfigformat      ///< format as mdconfig or simple
-);
+bool p2DoneExpPrintObjects(FILE *stream, psArray *objects, bool mdconfigformat)
+{
+    PS_ASSERT_PTR_NON_NULL(objects, false);
+
+    psMetadata *output = psMetadataAlloc();
+    for (long i = 0; i < psArrayLength(objects); i++) {
+        psMetadata *md = p2DoneExpMetadataFromObject(objects->data[i]);
+        if (!psMetadataAddMetadata(
+            output,
+            PS_LIST_TAIL,
+            P2DONEEXP_TABLE_NAME,
+            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;
+}
 static void p2DoneImfileRowFree(p2DoneImfileRow *object);
 
@@ -11034,14 +11514,38 @@
     return deleted;
 }
-/** Formats and prints an array of p2DoneImfileRow objects
- *
- * @return A boolean - false on error
- */
-
-bool p2DoneImfilePrintObjects(
-    FILE            *stream,            ///< a stream
-    psArray         *objects,           ///< An array of p2DoneImfileRow objects
-    bool            mdconfigformat      ///< format as mdconfig or simple
-);
+bool p2DoneImfilePrintObjects(FILE *stream, psArray *objects, bool mdconfigformat)
+{
+    PS_ASSERT_PTR_NON_NULL(objects, false);
+
+    psMetadata *output = psMetadataAlloc();
+    for (long i = 0; i < psArrayLength(objects); i++) {
+        psMetadata *md = p2DoneImfileMetadataFromObject(objects->data[i]);
+        if (!psMetadataAddMetadata(
+            output,
+            PS_LIST_TAIL,
+            P2DONEIMFILE_TABLE_NAME,
+            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;
+}
 static void p3PendingExpRowFree(p3PendingExpRow *object);
 
@@ -11721,14 +12225,38 @@
     return deleted;
 }
-/** Formats and prints an array of p3PendingExpRow objects
- *
- * @return A boolean - false on error
- */
-
-bool p3PendingExpPrintObjects(
-    FILE            *stream,            ///< a stream
-    psArray         *objects,           ///< An array of p3PendingExpRow objects
-    bool            mdconfigformat      ///< format as mdconfig or simple
-);
+bool p3PendingExpPrintObjects(FILE *stream, psArray *objects, bool mdconfigformat)
+{
+    PS_ASSERT_PTR_NON_NULL(objects, false);
+
+    psMetadata *output = psMetadataAlloc();
+    for (long i = 0; i < psArrayLength(objects); i++) {
+        psMetadata *md = p3PendingExpMetadataFromObject(objects->data[i]);
+        if (!psMetadataAddMetadata(
+            output,
+            PS_LIST_TAIL,
+            P3PENDINGEXP_TABLE_NAME,
+            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;
+}
 static void detRunRowFree(detRunRow *object);
 
@@ -12085,14 +12613,38 @@
     return deleted;
 }
-/** Formats and prints an array of detRunRow objects
- *
- * @return A boolean - false on error
- */
-
-bool detRunPrintObjects(
-    FILE            *stream,            ///< a stream
-    psArray         *objects,           ///< An array of detRunRow objects
-    bool            mdconfigformat      ///< format as mdconfig or simple
-);
+bool detRunPrintObjects(FILE *stream, psArray *objects, bool mdconfigformat)
+{
+    PS_ASSERT_PTR_NON_NULL(objects, false);
+
+    psMetadata *output = psMetadataAlloc();
+    for (long i = 0; i < psArrayLength(objects); i++) {
+        psMetadata *md = detRunMetadataFromObject(objects->data[i]);
+        if (!psMetadataAddMetadata(
+            output,
+            PS_LIST_TAIL,
+            DETRUN_TABLE_NAME,
+            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;
+}
 static void detInputExpRowFree(detInputExpRow *object);
 
@@ -12772,14 +13324,38 @@
     return deleted;
 }
-/** Formats and prints an array of detInputExpRow objects
- *
- * @return A boolean - false on error
- */
-
-bool detInputExpPrintObjects(
-    FILE            *stream,            ///< a stream
-    psArray         *objects,           ///< An array of detInputExpRow objects
-    bool            mdconfigformat      ///< format as mdconfig or simple
-);
+bool detInputExpPrintObjects(FILE *stream, psArray *objects, bool mdconfigformat)
+{
+    PS_ASSERT_PTR_NON_NULL(objects, false);
+
+    psMetadata *output = psMetadataAlloc();
+    for (long i = 0; i < psArrayLength(objects); i++) {
+        psMetadata *md = detInputExpMetadataFromObject(objects->data[i]);
+        if (!psMetadataAddMetadata(
+            output,
+            PS_LIST_TAIL,
+            DETINPUTEXP_TABLE_NAME,
+            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;
+}
 static void detProcessedImfileRowFree(detProcessedImfileRow *object);
 
@@ -13226,14 +13802,38 @@
     return deleted;
 }
-/** Formats and prints an array of detProcessedImfileRow objects
- *
- * @return A boolean - false on error
- */
-
-bool detProcessedImfilePrintObjects(
-    FILE            *stream,            ///< a stream
-    psArray         *objects,           ///< An array of detProcessedImfileRow objects
-    bool            mdconfigformat      ///< format as mdconfig or simple
-);
+bool detProcessedImfilePrintObjects(FILE *stream, psArray *objects, bool mdconfigformat)
+{
+    PS_ASSERT_PTR_NON_NULL(objects, false);
+
+    psMetadata *output = psMetadataAlloc();
+    for (long i = 0; i < psArrayLength(objects); i++) {
+        psMetadata *md = detProcessedImfileMetadataFromObject(objects->data[i]);
+        if (!psMetadataAddMetadata(
+            output,
+            PS_LIST_TAIL,
+            DETPROCESSEDIMFILE_TABLE_NAME,
+            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;
+}
 static void detStackedImfileRowFree(detStackedImfileRow *object);
 
@@ -13679,14 +14279,38 @@
     return deleted;
 }
-/** Formats and prints an array of detStackedImfileRow objects
- *
- * @return A boolean - false on error
- */
-
-bool detStackedImfilePrintObjects(
-    FILE            *stream,            ///< a stream
-    psArray         *objects,           ///< An array of detStackedImfileRow objects
-    bool            mdconfigformat      ///< format as mdconfig or simple
-);
+bool detStackedImfilePrintObjects(FILE *stream, psArray *objects, bool mdconfigformat)
+{
+    PS_ASSERT_PTR_NON_NULL(objects, false);
+
+    psMetadata *output = psMetadataAlloc();
+    for (long i = 0; i < psArrayLength(objects); i++) {
+        psMetadata *md = detStackedImfileMetadataFromObject(objects->data[i]);
+        if (!psMetadataAddMetadata(
+            output,
+            PS_LIST_TAIL,
+            DETSTACKEDIMFILE_TABLE_NAME,
+            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;
+}
 static void detNormalizedImfileRowFree(detNormalizedImfileRow *object);
 
@@ -14132,14 +14756,38 @@
     return deleted;
 }
-/** Formats and prints an array of detNormalizedImfileRow objects
- *
- * @return A boolean - false on error
- */
-
-bool detNormalizedImfilePrintObjects(
-    FILE            *stream,            ///< a stream
-    psArray         *objects,           ///< An array of detNormalizedImfileRow objects
-    bool            mdconfigformat      ///< format as mdconfig or simple
-);
+bool detNormalizedImfilePrintObjects(FILE *stream, psArray *objects, bool mdconfigformat)
+{
+    PS_ASSERT_PTR_NON_NULL(objects, false);
+
+    psMetadata *output = psMetadataAlloc();
+    for (long i = 0; i < psArrayLength(objects); i++) {
+        psMetadata *md = detNormalizedImfileMetadataFromObject(objects->data[i]);
+        if (!psMetadataAddMetadata(
+            output,
+            PS_LIST_TAIL,
+            DETNORMALIZEDIMFILE_TABLE_NAME,
+            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;
+}
 static void detMasterFrameRowFree(detMasterFrameRow *object);
 
@@ -14525,14 +15173,38 @@
     return deleted;
 }
-/** Formats and prints an array of detMasterFrameRow objects
- *
- * @return A boolean - false on error
- */
-
-bool detMasterFramePrintObjects(
-    FILE            *stream,            ///< a stream
-    psArray         *objects,           ///< An array of detMasterFrameRow objects
-    bool            mdconfigformat      ///< format as mdconfig or simple
-);
+bool detMasterFramePrintObjects(FILE *stream, psArray *objects, bool mdconfigformat)
+{
+    PS_ASSERT_PTR_NON_NULL(objects, false);
+
+    psMetadata *output = psMetadataAlloc();
+    for (long i = 0; i < psArrayLength(objects); i++) {
+        psMetadata *md = detMasterFrameMetadataFromObject(objects->data[i]);
+        if (!psMetadataAddMetadata(
+            output,
+            PS_LIST_TAIL,
+            DETMASTERFRAME_TABLE_NAME,
+            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;
+}
 static void detMasterImfileRowFree(detMasterImfileRow *object);
 
@@ -14949,14 +15621,38 @@
     return deleted;
 }
-/** Formats and prints an array of detMasterImfileRow objects
- *
- * @return A boolean - false on error
- */
-
-bool detMasterImfilePrintObjects(
-    FILE            *stream,            ///< a stream
-    psArray         *objects,           ///< An array of detMasterImfileRow objects
-    bool            mdconfigformat      ///< format as mdconfig or simple
-);
+bool detMasterImfilePrintObjects(FILE *stream, psArray *objects, bool mdconfigformat)
+{
+    PS_ASSERT_PTR_NON_NULL(objects, false);
+
+    psMetadata *output = psMetadataAlloc();
+    for (long i = 0; i < psArrayLength(objects); i++) {
+        psMetadata *md = detMasterImfileMetadataFromObject(objects->data[i]);
+        if (!psMetadataAddMetadata(
+            output,
+            PS_LIST_TAIL,
+            DETMASTERIMFILE_TABLE_NAME,
+            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;
+}
 static void detResidImfileAnalysisRowFree(detResidImfileAnalysisRow *object);
 
@@ -15492,14 +16188,38 @@
     return deleted;
 }
-/** Formats and prints an array of detResidImfileAnalysisRow objects
- *
- * @return A boolean - false on error
- */
-
-bool detResidImfileAnalysisPrintObjects(
-    FILE            *stream,            ///< a stream
-    psArray         *objects,           ///< An array of detResidImfileAnalysisRow objects
-    bool            mdconfigformat      ///< format as mdconfig or simple
-);
+bool detResidImfileAnalysisPrintObjects(FILE *stream, psArray *objects, bool mdconfigformat)
+{
+    PS_ASSERT_PTR_NON_NULL(objects, false);
+
+    psMetadata *output = psMetadataAlloc();
+    for (long i = 0; i < psArrayLength(objects); i++) {
+        psMetadata *md = detResidImfileAnalysisMetadataFromObject(objects->data[i]);
+        if (!psMetadataAddMetadata(
+            output,
+            PS_LIST_TAIL,
+            DETRESIDIMFILEANALYSIS_TABLE_NAME,
+            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;
+}
 static void detResidExpAnalysisRowFree(detResidExpAnalysisRow *object);
 
@@ -15944,12 +16664,36 @@
     return deleted;
 }
-/** Formats and prints an array of detResidExpAnalysisRow objects
- *
- * @return A boolean - false on error
- */
-
-bool detResidExpAnalysisPrintObjects(
-    FILE            *stream,            ///< a stream
-    psArray         *objects,           ///< An array of detResidExpAnalysisRow objects
-    bool            mdconfigformat      ///< format as mdconfig or simple
-);
+bool detResidExpAnalysisPrintObjects(FILE *stream, psArray *objects, bool mdconfigformat)
+{
+    PS_ASSERT_PTR_NON_NULL(objects, false);
+
+    psMetadata *output = psMetadataAlloc();
+    for (long i = 0; i < psArrayLength(objects); i++) {
+        psMetadata *md = detResidExpAnalysisMetadataFromObject(objects->data[i]);
+        if (!psMetadataAddMetadata(
+            output,
+            PS_LIST_TAIL,
+            DETRESIDEXPANALYSIS_TABLE_NAME,
+            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;
+}
