Index: /trunk/ippdb/configure.ac
===================================================================
--- /trunk/ippdb/configure.ac	(revision 8203)
+++ /trunk/ippdb/configure.ac	(revision 8204)
@@ -1,5 +1,5 @@
 AC_PREREQ(2.59)
 
-AC_INIT([ippdb], [0.0.18], [pan-starrs.ifa.hawaii.edu])
+AC_INIT([ippdb], [0.0.19], [pan-starrs.ifa.hawaii.edu])
 AC_CONFIG_SRCDIR([ippdb.pc.in])
 
Index: /trunk/ippdb/src/ippdb.c
===================================================================
--- /trunk/ippdb/src/ippdb.c	(revision 8203)
+++ /trunk/ippdb/src/ippdb.c	(revision 8204)
@@ -3,66 +3,67 @@
 #include "ippdb.h"
 
+#define IPPDB_DEFAULT_INDEX_NAME "position"
 #define WEATHER_TABLE_NAME "weather"
-#define WEATHER_INDEX_NAME "position"
+#define WEATHER_INDEX_NAME IPPDB_DEFAULT_INDEX_NAME
 #define SKYP_TRANSPARENCY_TABLE_NAME "skyp_transparency"
-#define SKYP_TRANSPARENCY_INDEX_NAME "position"
+#define SKYP_TRANSPARENCY_INDEX_NAME IPPDB_DEFAULT_INDEX_NAME
 #define SKYP_ABSORPTION_TABLE_NAME "skyp_absorption"
-#define SKYP_ABSORPTION_INDEX_NAME "position"
+#define SKYP_ABSORPTION_INDEX_NAME IPPDB_DEFAULT_INDEX_NAME
 #define SKYP_EMISSION_TABLE_NAME "skyp_emission"
-#define SKYP_EMISSION_INDEX_NAME "position"
+#define SKYP_EMISSION_INDEX_NAME IPPDB_DEFAULT_INDEX_NAME
 #define DIMM_TABLE_NAME "dimm"
-#define DIMM_INDEX_NAME "position"
+#define DIMM_INDEX_NAME IPPDB_DEFAULT_INDEX_NAME
 #define SKYP_IR_TABLE_NAME "skyp_ir"
-#define SKYP_IR_INDEX_NAME "position"
+#define SKYP_IR_INDEX_NAME IPPDB_DEFAULT_INDEX_NAME
 #define DOME_TABLE_NAME "dome"
-#define DOME_INDEX_NAME "position"
+#define DOME_INDEX_NAME IPPDB_DEFAULT_INDEX_NAME
 #define TELESCOPE_TABLE_NAME "telescope"
-#define TELESCOPE_INDEX_NAME "position"
+#define TELESCOPE_INDEX_NAME IPPDB_DEFAULT_INDEX_NAME
 #define SUMMITEXP_TABLE_NAME "summitExp"
-#define SUMMITEXP_INDEX_NAME "position"
+#define SUMMITEXP_INDEX_NAME IPPDB_DEFAULT_INDEX_NAME
 #define PZPENDINGEXP_TABLE_NAME "pzPendingExp"
-#define PZPENDINGEXP_INDEX_NAME "position"
+#define PZPENDINGEXP_INDEX_NAME IPPDB_DEFAULT_INDEX_NAME
 #define PZPENDINGIMFILE_TABLE_NAME "pzPendingImfile"
-#define PZPENDINGIMFILE_INDEX_NAME "position"
+#define PZPENDINGIMFILE_INDEX_NAME IPPDB_DEFAULT_INDEX_NAME
 #define NEWEXP_TABLE_NAME "newExp"
-#define NEWEXP_INDEX_NAME "position"
+#define NEWEXP_INDEX_NAME IPPDB_DEFAULT_INDEX_NAME
 #define NEWIMFILE_TABLE_NAME "newImfile"
-#define NEWIMFILE_INDEX_NAME "position"
+#define NEWIMFILE_INDEX_NAME IPPDB_DEFAULT_INDEX_NAME
 #define RAWDETRENDEXP_TABLE_NAME "rawDetrendExp"
-#define RAWDETRENDEXP_INDEX_NAME "position"
+#define RAWDETRENDEXP_INDEX_NAME IPPDB_DEFAULT_INDEX_NAME
 #define RAWSCIENCEEXP_TABLE_NAME "rawScienceExp"
-#define RAWSCIENCEEXP_INDEX_NAME "position"
+#define RAWSCIENCEEXP_INDEX_NAME IPPDB_DEFAULT_INDEX_NAME
 #define RAWIMFILE_TABLE_NAME "rawImfile"
-#define RAWIMFILE_INDEX_NAME "position"
+#define RAWIMFILE_INDEX_NAME IPPDB_DEFAULT_INDEX_NAME
 #define P1PENDINGEXP_TABLE_NAME "p1PendingExp"
-#define P1PENDINGEXP_INDEX_NAME "position"
+#define P1PENDINGEXP_INDEX_NAME IPPDB_DEFAULT_INDEX_NAME
 #define P2PENDINGEXP_TABLE_NAME "p2PendingExp"
-#define P2PENDINGEXP_INDEX_NAME "position"
+#define P2PENDINGEXP_INDEX_NAME IPPDB_DEFAULT_INDEX_NAME
 #define P2PENDINGIMFILE_TABLE_NAME "p2PendingImfile"
-#define P2PENDINGIMFILE_INDEX_NAME "position"
+#define P2PENDINGIMFILE_INDEX_NAME IPPDB_DEFAULT_INDEX_NAME
 #define P2DONEEXP_TABLE_NAME "p2DoneExp"
-#define P2DONEEXP_INDEX_NAME "position"
+#define P2DONEEXP_INDEX_NAME IPPDB_DEFAULT_INDEX_NAME
 #define P2DONEIMFILE_TABLE_NAME "p2DoneImfile"
-#define P2DONEIMFILE_INDEX_NAME "position"
+#define P2DONEIMFILE_INDEX_NAME IPPDB_DEFAULT_INDEX_NAME
 #define P3PENDINGEXP_TABLE_NAME "p3PendingExp"
-#define P3PENDINGEXP_INDEX_NAME "position"
+#define P3PENDINGEXP_INDEX_NAME IPPDB_DEFAULT_INDEX_NAME
 #define DETRUN_TABLE_NAME "detRun"
-#define DETRUN_INDEX_NAME "position"
+#define DETRUN_INDEX_NAME IPPDB_DEFAULT_INDEX_NAME
 #define DETINPUTEXP_TABLE_NAME "detInputExp"
-#define DETINPUTEXP_INDEX_NAME "position"
+#define DETINPUTEXP_INDEX_NAME IPPDB_DEFAULT_INDEX_NAME
 #define DETPROCESSEDIMFILE_TABLE_NAME "detProcessedImfile"
-#define DETPROCESSEDIMFILE_INDEX_NAME "position"
+#define DETPROCESSEDIMFILE_INDEX_NAME IPPDB_DEFAULT_INDEX_NAME
 #define DETSTACKEDIMFILE_TABLE_NAME "detStackedImfile"
-#define DETSTACKEDIMFILE_INDEX_NAME "position"
+#define DETSTACKEDIMFILE_INDEX_NAME IPPDB_DEFAULT_INDEX_NAME
 #define DETNORMALIZEDIMFILE_TABLE_NAME "detNormalizedImfile"
-#define DETNORMALIZEDIMFILE_INDEX_NAME "position"
+#define DETNORMALIZEDIMFILE_INDEX_NAME IPPDB_DEFAULT_INDEX_NAME
 #define DETMASTERFRAME_TABLE_NAME "detMasterFrame"
-#define DETMASTERFRAME_INDEX_NAME "position"
+#define DETMASTERFRAME_INDEX_NAME IPPDB_DEFAULT_INDEX_NAME
 #define DETMASTERIMFILE_TABLE_NAME "detMasterImfile"
-#define DETMASTERIMFILE_INDEX_NAME "position"
+#define DETMASTERIMFILE_INDEX_NAME IPPDB_DEFAULT_INDEX_NAME
 #define DETRESIDIMFILEANALYSIS_TABLE_NAME "detResidImfileAnalysis"
-#define DETRESIDIMFILEANALYSIS_INDEX_NAME "position"
+#define DETRESIDIMFILEANALYSIS_INDEX_NAME IPPDB_DEFAULT_INDEX_NAME
 #define DETRESIDEXPANALYSIS_TABLE_NAME "detResidExpAnalysis"
-#define DETRESIDEXPANALYSIS_INDEX_NAME "position"
+#define DETRESIDEXPANALYSIS_INDEX_NAME IPPDB_DEFAULT_INDEX_NAME
 #define MAX_STRING_LENGTH 1024
 
@@ -75,4 +76,40 @@
 {
     psDBCleanup(dbh);
+}
+
+bool ippdbPrintMetadata(FILE *stream, psMetadata *md, bool mdconfigformat)
+{
+    PS_ASSERT_PTR_NON_NULL(md, false);
+
+    psMetadata *clean = psMetadataCopy(NULL, md);
+
+    // don't bother to check the return status as the key we are trying to
+    // remove may or may not be there
+    // XXX someday psErr should be checked -- the only acceptable error is key
+    // not found
+    psMetadataRemoveKey(clean, IPPDB_DEFAULT_INDEX_NAME);
+    
+    if (!ippdbPrintMetadataRaw(stream, clean, mdconfigformat)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to print metadata");
+        psFree(clean);
+        return false;
+    }
+    psFree(clean);
+
+    return true;
+}
+
+bool ippdbPrintMetadataRaw(FILE *stream, psMetadata *md, bool mdconfigformat)
+{
+    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");
+    }
+    fprintf(stream, "%s\n", str);
+    psFree(str);
+
+    return true;
 }
 
@@ -82,29 +119,27 @@
     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(output);
+        if (!ippdbPrintMetadata(stream, md, mdconfigformat)) {
+            psError(PS_ERR_UNKNOWN, false, "failed to print metadata");
             return false;
         }
     }
 
-    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;
+}
+
+bool ippdbPrintMetadatasRaw(FILE *stream, psArray *mds, const char *mdname, bool mdconfigformat)
+{
+    PS_ASSERT_PTR_NON_NULL(mds, false);
+    PS_ASSERT_PTR_NON_NULL(mdname, false);
+
+    for (long i = 0; i < psArrayLength(mds); i++) {
+        psMetadata *md = mds->data[i];
+        if (!ippdbPrintMetadataRaw(stream, md, mdconfigformat)) {
+            psError(PS_ERR_UNKNOWN, false, "failed to print metadata");
+            return false;
+        }
+    }
 
     return true;
Index: /trunk/ippdb/src/ippdb.h
===================================================================
--- /trunk/ippdb/src/ippdb.h	(revision 8203)
+++ /trunk/ippdb/src/ippdb.h	(revision 8204)
@@ -31,5 +31,7 @@
 );
 
-/** Formats and prints an array of metadata
+/** Formats and prints a metadata
+ *
+ * Any internal use fields are stripped.
  *
  * When mdconfigformat is set the formated output is in psMetadataConfig
@@ -39,5 +41,54 @@
  */
 
+bool ippdbPrintMetadata(
+    FILE            *stream,            ///< a stream
+    psMetadata      *md,                ///< An array of metadata
+    bool            mdconfigformat      ///< format as mdconfig or simple
+);
+
+/** Formats and prints a metadata
+ *
+ * The metadata is printed verbatium without removing any fields.
+ *
+ * When mdconfigformat is set the formated output is in psMetadataConfig
+ * format, otherwise it is in a simple tabular format.
+ *
+ * @return true on success
+ */
+
+bool ippdbPrintMetadataRaw(
+    FILE            *stream,            ///< a stream
+    psMetadata      *md,                ///< An array of metadata
+    bool            mdconfigformat      ///< format as mdconfig or simple
+);
+
+/** Formats and prints an array of metadata
+ *
+ * Any internal use fields are stripped.
+ *
+ * When mdconfigformat is set the formated output is in psMetadataConfig
+ * format, otherwise it is in a simple tabular format.
+ *
+ * @return true on success
+ */
+
 bool ippdbPrintMetadatas(
+    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
+);
+
+/** Formats and prints an array of metadata
+ *
+ * The metadatas are printed verbatium without removing any fields.
+ *
+ * When mdconfigformat is set the formated output is in psMetadataConfig
+ * format, otherwise it is in a simple tabular format.
+ *
+ * @return true on success
+ */
+
+bool ippdbPrintMetadatasRaw(
     FILE            *stream,            ///< a stream
     psArray         *mds,               ///< An array of metadata
