Index: /branches/jhoblitt/ippdb/src/ippdb.c
===================================================================
--- /branches/jhoblitt/ippdb/src/ippdb.c	(revision 8005)
+++ /branches/jhoblitt/ippdb/src/ippdb.c	(revision 8006)
@@ -531,5 +531,7 @@
 
     for (i = 0; i < rowSet->n; i++) {
-        psArrayAdd(returnSet, 0, weatherObjectFromMetadata(rowSet->data[i]));
+        weatherRow *object = weatherObjectFromMetadata(rowSet->data[i]);
+        psArrayAdd(returnSet, 0, object);
+        psFree(object);
     }
 
@@ -647,5 +649,5 @@
 
     md = psMetadataAlloc();
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "filter", 0, NULL, psStringCopy(filter))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "filter", 0, NULL, filter)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item filter");
         psFree(md);
@@ -900,5 +902,5 @@
 
     md = psMetadataAlloc();
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "filter", 0, NULL, psStringCopy(object->filter))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "filter", 0, NULL, object->filter)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item filter");
         psFree(md);
@@ -1014,5 +1016,7 @@
 
     for (i = 0; i < rowSet->n; i++) {
-        psArrayAdd(returnSet, 0, skyp_transparencyObjectFromMetadata(rowSet->data[i]));
+        skyp_transparencyRow *object = skyp_transparencyObjectFromMetadata(rowSet->data[i]);
+        psArrayAdd(returnSet, 0, object);
+        psFree(object);
     }
 
@@ -1142,5 +1146,5 @@
 
     md = psMetadataAlloc();
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "disperser_id", 0, NULL, psStringCopy(disperser_id))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "disperser_id", 0, NULL, disperser_id)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item disperser_id");
         psFree(md);
@@ -1419,5 +1423,5 @@
 
     md = psMetadataAlloc();
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "disperser_id", 0, NULL, psStringCopy(object->disperser_id))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "disperser_id", 0, NULL, object->disperser_id)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item disperser_id");
         psFree(md);
@@ -1555,5 +1559,7 @@
 
     for (i = 0; i < rowSet->n; i++) {
-        psArrayAdd(returnSet, 0, skyp_absorptionObjectFromMetadata(rowSet->data[i]));
+        skyp_absorptionRow *object = skyp_absorptionObjectFromMetadata(rowSet->data[i]);
+        psArrayAdd(returnSet, 0, object);
+        psFree(object);
     }
 
@@ -1665,5 +1671,5 @@
 
     md = psMetadataAlloc();
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "disperser_id", 0, NULL, psStringCopy(disperser_id))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "disperser_id", 0, NULL, disperser_id)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item disperser_id");
         psFree(md);
@@ -1906,5 +1912,5 @@
 
     md = psMetadataAlloc();
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "disperser_id", 0, NULL, psStringCopy(object->disperser_id))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "disperser_id", 0, NULL, object->disperser_id)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item disperser_id");
         psFree(md);
@@ -2009,5 +2015,7 @@
 
     for (i = 0; i < rowSet->n; i++) {
-        psArrayAdd(returnSet, 0, skyp_emissionObjectFromMetadata(rowSet->data[i]));
+        skyp_emissionRow *object = skyp_emissionObjectFromMetadata(rowSet->data[i]);
+        psArrayAdd(returnSet, 0, object);
+        psFree(object);
     }
 
@@ -2155,5 +2163,5 @@
         return false;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "telescope_id", 0, NULL, psStringCopy(telescope_id))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "telescope_id", 0, NULL, telescope_id)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item telescope_id");
         psFree(md);
@@ -2408,5 +2416,5 @@
         return NULL;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "telescope_id", 0, NULL, psStringCopy(object->telescope_id))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "telescope_id", 0, NULL, object->telescope_id)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item telescope_id");
         psFree(md);
@@ -2492,5 +2500,7 @@
 
     for (i = 0; i < rowSet->n; i++) {
-        psArrayAdd(returnSet, 0, dimmObjectFromMetadata(rowSet->data[i]));
+        dimmRow *object = dimmObjectFromMetadata(rowSet->data[i]);
+        psArrayAdd(returnSet, 0, object);
+        psFree(object);
     }
 
@@ -2945,5 +2955,7 @@
 
     for (i = 0; i < rowSet->n; i++) {
-        psArrayAdd(returnSet, 0, skyp_irObjectFromMetadata(rowSet->data[i]));
+        skyp_irRow *object = skyp_irObjectFromMetadata(rowSet->data[i]);
+        psArrayAdd(returnSet, 0, object);
+        psFree(object);
     }
 
@@ -3340,5 +3352,7 @@
 
     for (i = 0; i < rowSet->n; i++) {
-        psArrayAdd(returnSet, 0, domeObjectFromMetadata(rowSet->data[i]));
+        domeRow *object = domeObjectFromMetadata(rowSet->data[i]);
+        psArrayAdd(returnSet, 0, object);
+        psFree(object);
     }
 
@@ -3444,5 +3458,5 @@
 
     md = psMetadataAlloc();
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "guide", 0, NULL, psStringCopy(guide))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "guide", 0, NULL, guide)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item guide");
         psFree(md);
@@ -3673,5 +3687,5 @@
 
     md = psMetadataAlloc();
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "guide", 0, NULL, psStringCopy(object->guide))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "guide", 0, NULL, object->guide)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item guide");
         psFree(md);
@@ -3765,5 +3779,7 @@
 
     for (i = 0; i < rowSet->n; i++) {
-        psArrayAdd(returnSet, 0, telescopeObjectFromMetadata(rowSet->data[i]));
+        telescopeRow *object = telescopeObjectFromMetadata(rowSet->data[i]);
+        psArrayAdd(returnSet, 0, object);
+        psFree(object);
     }
 
@@ -3873,25 +3889,25 @@
 
     md = psMetadataAlloc();
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "exp_id", 0, NULL, psStringCopy(exp_id))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "exp_id", 0, NULL, exp_id)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id");
         psFree(md);
         return false;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "camera", 0, NULL, psStringCopy(camera))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "camera", 0, NULL, camera)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item camera");
         psFree(md);
         return false;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "telescope", 0, NULL, psStringCopy(telescope))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "telescope", 0, NULL, telescope)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item telescope");
         psFree(md);
         return false;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "exp_type", 0, NULL, psStringCopy(exp_type))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "exp_type", 0, NULL, exp_type)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item exp_type");
         psFree(md);
         return false;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "uri", 0, NULL, psStringCopy(uri))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "uri", 0, NULL, uri)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item uri");
         psFree(md);
@@ -4102,25 +4118,25 @@
 
     md = psMetadataAlloc();
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "exp_id", 0, NULL, psStringCopy(object->exp_id))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "exp_id", 0, NULL, object->exp_id)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id");
         psFree(md);
         return NULL;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "camera", 0, NULL, psStringCopy(object->camera))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "camera", 0, NULL, object->camera)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item camera");
         psFree(md);
         return NULL;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "telescope", 0, NULL, psStringCopy(object->telescope))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "telescope", 0, NULL, object->telescope)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item telescope");
         psFree(md);
         return NULL;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "exp_type", 0, NULL, psStringCopy(object->exp_type))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "exp_type", 0, NULL, object->exp_type)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item exp_type");
         psFree(md);
         return NULL;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "uri", 0, NULL, psStringCopy(object->uri))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "uri", 0, NULL, object->uri)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item uri");
         psFree(md);
@@ -4194,5 +4210,7 @@
 
     for (i = 0; i < rowSet->n; i++) {
-        psArrayAdd(returnSet, 0, summitExpObjectFromMetadata(rowSet->data[i]));
+        summitExpRow *object = summitExpObjectFromMetadata(rowSet->data[i]);
+        psArrayAdd(returnSet, 0, object);
+        psFree(object);
     }
 
@@ -4301,20 +4319,20 @@
 
     md = psMetadataAlloc();
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "exp_id", 0, NULL, psStringCopy(exp_id))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "exp_id", 0, NULL, exp_id)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id");
         psFree(md);
         return false;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "camera", 0, NULL, psStringCopy(camera))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "camera", 0, NULL, camera)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item camera");
         psFree(md);
         return false;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "telescope", 0, NULL, psStringCopy(telescope))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "telescope", 0, NULL, telescope)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item telescope");
         psFree(md);
         return false;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "exp_type", 0, NULL, psStringCopy(exp_type))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "exp_type", 0, NULL, exp_type)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item exp_type");
         psFree(md);
@@ -4530,20 +4548,20 @@
 
     md = psMetadataAlloc();
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "exp_id", 0, NULL, psStringCopy(object->exp_id))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "exp_id", 0, NULL, object->exp_id)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id");
         psFree(md);
         return NULL;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "camera", 0, NULL, psStringCopy(object->camera))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "camera", 0, NULL, object->camera)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item camera");
         psFree(md);
         return NULL;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "telescope", 0, NULL, psStringCopy(object->telescope))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "telescope", 0, NULL, object->telescope)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item telescope");
         psFree(md);
         return NULL;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "exp_type", 0, NULL, psStringCopy(object->exp_type))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "exp_type", 0, NULL, object->exp_type)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item exp_type");
         psFree(md);
@@ -4622,5 +4640,7 @@
 
     for (i = 0; i < rowSet->n; i++) {
-        psArrayAdd(returnSet, 0, pzPendingExpObjectFromMetadata(rowSet->data[i]));
+        pzPendingExpRow *object = pzPendingExpObjectFromMetadata(rowSet->data[i]);
+        psArrayAdd(returnSet, 0, object);
+        psFree(object);
     }
 
@@ -4736,5 +4756,5 @@
 
     md = psMetadataAlloc();
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "exp_id", 0, NULL, psStringCopy(exp_id))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "exp_id", 0, NULL, exp_id)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id");
         psFree(md);
@@ -4746,20 +4766,20 @@
         return false;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "md5sum", 0, NULL, psStringCopy(md5sum))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "md5sum", 0, NULL, md5sum)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item md5sum");
         psFree(md);
         return false;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "class", 0, NULL, psStringCopy(class))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "class", 0, NULL, class)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item class");
         psFree(md);
         return false;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "class_id", 0, NULL, psStringCopy(class_id))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "class_id", 0, NULL, class_id)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item class_id");
         psFree(md);
         return false;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "uri", 0, NULL, psStringCopy(uri))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "uri", 0, NULL, uri)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item uri");
         psFree(md);
@@ -4977,5 +4997,5 @@
 
     md = psMetadataAlloc();
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "exp_id", 0, NULL, psStringCopy(object->exp_id))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "exp_id", 0, NULL, object->exp_id)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id");
         psFree(md);
@@ -4987,20 +5007,20 @@
         return NULL;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "md5sum", 0, NULL, psStringCopy(object->md5sum))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "md5sum", 0, NULL, object->md5sum)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item md5sum");
         psFree(md);
         return NULL;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "class", 0, NULL, psStringCopy(object->class))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "class", 0, NULL, object->class)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item class");
         psFree(md);
         return NULL;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "class_id", 0, NULL, psStringCopy(object->class_id))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "class_id", 0, NULL, object->class_id)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item class_id");
         psFree(md);
         return NULL;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "uri", 0, NULL, psStringCopy(object->uri))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "uri", 0, NULL, object->uri)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item uri");
         psFree(md);
@@ -5080,5 +5100,7 @@
 
     for (i = 0; i < rowSet->n; i++) {
-        psArrayAdd(returnSet, 0, pzPendingImfileObjectFromMetadata(rowSet->data[i]));
+        pzPendingImfileRow *object = pzPendingImfileObjectFromMetadata(rowSet->data[i]);
+        psArrayAdd(returnSet, 0, object);
+        psFree(object);
     }
 
@@ -5187,20 +5209,20 @@
 
     md = psMetadataAlloc();
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "exp_id", 0, NULL, psStringCopy(exp_id))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "exp_id", 0, NULL, exp_id)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id");
         psFree(md);
         return false;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "camera", 0, NULL, psStringCopy(camera))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "camera", 0, NULL, camera)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item camera");
         psFree(md);
         return false;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "telescope", 0, NULL, psStringCopy(telescope))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "telescope", 0, NULL, telescope)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item telescope");
         psFree(md);
         return false;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "exp_type", 0, NULL, psStringCopy(exp_type))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "exp_type", 0, NULL, exp_type)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item exp_type");
         psFree(md);
@@ -5416,20 +5438,20 @@
 
     md = psMetadataAlloc();
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "exp_id", 0, NULL, psStringCopy(object->exp_id))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "exp_id", 0, NULL, object->exp_id)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id");
         psFree(md);
         return NULL;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "camera", 0, NULL, psStringCopy(object->camera))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "camera", 0, NULL, object->camera)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item camera");
         psFree(md);
         return NULL;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "telescope", 0, NULL, psStringCopy(object->telescope))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "telescope", 0, NULL, object->telescope)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item telescope");
         psFree(md);
         return NULL;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "exp_type", 0, NULL, psStringCopy(object->exp_type))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "exp_type", 0, NULL, object->exp_type)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item exp_type");
         psFree(md);
@@ -5508,5 +5530,7 @@
 
     for (i = 0; i < rowSet->n; i++) {
-        psArrayAdd(returnSet, 0, newExpObjectFromMetadata(rowSet->data[i]));
+        newExpRow *object = newExpObjectFromMetadata(rowSet->data[i]);
+        psArrayAdd(returnSet, 0, object);
+        psFree(object);
     }
 
@@ -5609,20 +5633,20 @@
 
     md = psMetadataAlloc();
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "exp_id", 0, NULL, psStringCopy(exp_id))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "exp_id", 0, NULL, exp_id)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id");
         psFree(md);
         return false;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "class", 0, NULL, psStringCopy(class))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "class", 0, NULL, class)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item class");
         psFree(md);
         return false;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "class_id", 0, NULL, psStringCopy(class_id))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "class_id", 0, NULL, class_id)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item class_id");
         psFree(md);
         return false;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "uri", 0, NULL, psStringCopy(uri))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "uri", 0, NULL, uri)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item uri");
         psFree(md);
@@ -5826,20 +5850,20 @@
 
     md = psMetadataAlloc();
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "exp_id", 0, NULL, psStringCopy(object->exp_id))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "exp_id", 0, NULL, object->exp_id)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id");
         psFree(md);
         return NULL;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "class", 0, NULL, psStringCopy(object->class))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "class", 0, NULL, object->class)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item class");
         psFree(md);
         return NULL;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "class_id", 0, NULL, psStringCopy(object->class_id))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "class_id", 0, NULL, object->class_id)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item class_id");
         psFree(md);
         return NULL;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "uri", 0, NULL, psStringCopy(object->uri))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "uri", 0, NULL, object->uri)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item uri");
         psFree(md);
@@ -5907,5 +5931,7 @@
 
     for (i = 0; i < rowSet->n; i++) {
-        psArrayAdd(returnSet, 0, newImfileObjectFromMetadata(rowSet->data[i]));
+        newImfileRow *object = newImfileObjectFromMetadata(rowSet->data[i]);
+        psArrayAdd(returnSet, 0, object);
+        psFree(object);
     }
 
@@ -6028,20 +6054,20 @@
 
     md = psMetadataAlloc();
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "exp_id", 0, NULL, psStringCopy(exp_id))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "exp_id", 0, NULL, exp_id)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id");
         psFree(md);
         return false;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "camera", 0, NULL, psStringCopy(camera))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "camera", 0, NULL, camera)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item camera");
         psFree(md);
         return false;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "telescope", 0, NULL, psStringCopy(telescope))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "telescope", 0, NULL, telescope)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item telescope");
         psFree(md);
         return false;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "exp_type", 0, NULL, psStringCopy(exp_type))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "exp_type", 0, NULL, exp_type)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item exp_type");
         psFree(md);
@@ -6053,10 +6079,10 @@
         return false;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "filter", 0, NULL, psStringCopy(filter))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "filter", 0, NULL, filter)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item filter");
         psFree(md);
         return false;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "stats", 0, NULL, psStringCopy(stats))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "stats", 0, NULL, stats)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item stats");
         psFree(md);
@@ -6281,20 +6307,20 @@
 
     md = psMetadataAlloc();
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "exp_id", 0, NULL, psStringCopy(object->exp_id))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "exp_id", 0, NULL, object->exp_id)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id");
         psFree(md);
         return NULL;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "camera", 0, NULL, psStringCopy(object->camera))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "camera", 0, NULL, object->camera)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item camera");
         psFree(md);
         return NULL;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "telescope", 0, NULL, psStringCopy(object->telescope))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "telescope", 0, NULL, object->telescope)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item telescope");
         psFree(md);
         return NULL;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "exp_type", 0, NULL, psStringCopy(object->exp_type))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "exp_type", 0, NULL, object->exp_type)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item exp_type");
         psFree(md);
@@ -6306,10 +6332,10 @@
         return NULL;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "filter", 0, NULL, psStringCopy(object->filter))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "filter", 0, NULL, object->filter)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item filter");
         psFree(md);
         return NULL;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "stats", 0, NULL, psStringCopy(object->stats))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "stats", 0, NULL, object->stats)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item stats");
         psFree(md);
@@ -6395,5 +6421,7 @@
 
     for (i = 0; i < rowSet->n; i++) {
-        psArrayAdd(returnSet, 0, rawDetrendExpObjectFromMetadata(rowSet->data[i]));
+        rawDetrendExpRow *object = rawDetrendExpObjectFromMetadata(rowSet->data[i]);
+        psArrayAdd(returnSet, 0, object);
+        psFree(object);
     }
 
@@ -6516,20 +6544,20 @@
 
     md = psMetadataAlloc();
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "exp_id", 0, NULL, psStringCopy(exp_id))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "exp_id", 0, NULL, exp_id)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id");
         psFree(md);
         return false;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "camera", 0, NULL, psStringCopy(camera))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "camera", 0, NULL, camera)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item camera");
         psFree(md);
         return false;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "telescope", 0, NULL, psStringCopy(telescope))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "telescope", 0, NULL, telescope)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item telescope");
         psFree(md);
         return false;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "exp_type", 0, NULL, psStringCopy(exp_type))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "exp_type", 0, NULL, exp_type)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item exp_type");
         psFree(md);
@@ -6541,10 +6569,10 @@
         return false;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "filter", 0, NULL, psStringCopy(filter))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "filter", 0, NULL, filter)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item filter");
         psFree(md);
         return false;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "stats", 0, NULL, psStringCopy(stats))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "stats", 0, NULL, stats)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item stats");
         psFree(md);
@@ -6769,20 +6797,20 @@
 
     md = psMetadataAlloc();
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "exp_id", 0, NULL, psStringCopy(object->exp_id))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "exp_id", 0, NULL, object->exp_id)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id");
         psFree(md);
         return NULL;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "camera", 0, NULL, psStringCopy(object->camera))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "camera", 0, NULL, object->camera)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item camera");
         psFree(md);
         return NULL;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "telescope", 0, NULL, psStringCopy(object->telescope))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "telescope", 0, NULL, object->telescope)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item telescope");
         psFree(md);
         return NULL;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "exp_type", 0, NULL, psStringCopy(object->exp_type))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "exp_type", 0, NULL, object->exp_type)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item exp_type");
         psFree(md);
@@ -6794,10 +6822,10 @@
         return NULL;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "filter", 0, NULL, psStringCopy(object->filter))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "filter", 0, NULL, object->filter)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item filter");
         psFree(md);
         return NULL;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "stats", 0, NULL, psStringCopy(object->stats))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "stats", 0, NULL, object->stats)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item stats");
         psFree(md);
@@ -6883,5 +6911,7 @@
 
     for (i = 0; i < rowSet->n; i++) {
-        psArrayAdd(returnSet, 0, rawScienceExpObjectFromMetadata(rowSet->data[i]));
+        rawScienceExpRow *object = rawScienceExpObjectFromMetadata(rowSet->data[i]);
+        psArrayAdd(returnSet, 0, object);
+        psFree(object);
     }
 
@@ -6984,20 +7014,20 @@
 
     md = psMetadataAlloc();
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "exp_id", 0, NULL, psStringCopy(exp_id))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "exp_id", 0, NULL, exp_id)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id");
         psFree(md);
         return false;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "class_id", 0, NULL, psStringCopy(class_id))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "class_id", 0, NULL, class_id)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item class_id");
         psFree(md);
         return false;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "uri", 0, NULL, psStringCopy(uri))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "uri", 0, NULL, uri)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item uri");
         psFree(md);
         return false;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "stats", 0, NULL, psStringCopy(stats))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "stats", 0, NULL, stats)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item stats");
         psFree(md);
@@ -7201,20 +7231,20 @@
 
     md = psMetadataAlloc();
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "exp_id", 0, NULL, psStringCopy(object->exp_id))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "exp_id", 0, NULL, object->exp_id)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id");
         psFree(md);
         return NULL;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "class_id", 0, NULL, psStringCopy(object->class_id))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "class_id", 0, NULL, object->class_id)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item class_id");
         psFree(md);
         return NULL;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "uri", 0, NULL, psStringCopy(object->uri))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "uri", 0, NULL, object->uri)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item uri");
         psFree(md);
         return NULL;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "stats", 0, NULL, psStringCopy(object->stats))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "stats", 0, NULL, object->stats)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item stats");
         psFree(md);
@@ -7282,5 +7312,7 @@
 
     for (i = 0; i < rowSet->n; i++) {
-        psArrayAdd(returnSet, 0, rawImfileObjectFromMetadata(rowSet->data[i]));
+        rawImfileRow *object = rawImfileObjectFromMetadata(rowSet->data[i]);
+        psArrayAdd(returnSet, 0, object);
+        psFree(object);
     }
 
@@ -7416,20 +7448,20 @@
 
     md = psMetadataAlloc();
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "exp_id", 0, NULL, psStringCopy(exp_id))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "exp_id", 0, NULL, exp_id)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id");
         psFree(md);
         return false;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "camera", 0, NULL, psStringCopy(camera))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "camera", 0, NULL, camera)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item camera");
         psFree(md);
         return false;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "telescope", 0, NULL, psStringCopy(telescope))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "telescope", 0, NULL, telescope)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item telescope");
         psFree(md);
         return false;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "exp_type", 0, NULL, psStringCopy(exp_type))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "exp_type", 0, NULL, exp_type)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item exp_type");
         psFree(md);
@@ -7441,15 +7473,15 @@
         return false;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "filter", 0, NULL, psStringCopy(filter))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "filter", 0, NULL, filter)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item filter");
         psFree(md);
         return false;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "stats", 0, NULL, psStringCopy(stats))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "stats", 0, NULL, stats)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item stats");
         psFree(md);
         return false;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "recipe", 0, NULL, psStringCopy(recipe))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "recipe", 0, NULL, recipe)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item recipe");
         psFree(md);
@@ -7693,20 +7725,20 @@
 
     md = psMetadataAlloc();
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "exp_id", 0, NULL, psStringCopy(object->exp_id))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "exp_id", 0, NULL, object->exp_id)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id");
         psFree(md);
         return NULL;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "camera", 0, NULL, psStringCopy(object->camera))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "camera", 0, NULL, object->camera)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item camera");
         psFree(md);
         return NULL;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "telescope", 0, NULL, psStringCopy(object->telescope))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "telescope", 0, NULL, object->telescope)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item telescope");
         psFree(md);
         return NULL;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "exp_type", 0, NULL, psStringCopy(object->exp_type))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "exp_type", 0, NULL, object->exp_type)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item exp_type");
         psFree(md);
@@ -7718,15 +7750,15 @@
         return NULL;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "filter", 0, NULL, psStringCopy(object->filter))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "filter", 0, NULL, object->filter)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item filter");
         psFree(md);
         return NULL;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "stats", 0, NULL, psStringCopy(object->stats))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "stats", 0, NULL, object->stats)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item stats");
         psFree(md);
         return NULL;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "recipe", 0, NULL, psStringCopy(object->recipe))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "recipe", 0, NULL, object->recipe)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item recipe");
         psFree(md);
@@ -7829,5 +7861,7 @@
 
     for (i = 0; i < rowSet->n; i++) {
-        psArrayAdd(returnSet, 0, p1PendingExpObjectFromMetadata(rowSet->data[i]));
+        p1PendingExpRow *object = p1PendingExpObjectFromMetadata(rowSet->data[i]);
+        psArrayAdd(returnSet, 0, object);
+        psFree(object);
     }
 
@@ -7969,20 +8003,20 @@
 
     md = psMetadataAlloc();
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "exp_id", 0, NULL, psStringCopy(exp_id))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "exp_id", 0, NULL, exp_id)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id");
         psFree(md);
         return false;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "camera", 0, NULL, psStringCopy(camera))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "camera", 0, NULL, camera)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item camera");
         psFree(md);
         return false;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "telescope", 0, NULL, psStringCopy(telescope))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "telescope", 0, NULL, telescope)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item telescope");
         psFree(md);
         return false;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "exp_type", 0, NULL, psStringCopy(exp_type))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "exp_type", 0, NULL, exp_type)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item exp_type");
         psFree(md);
@@ -7994,15 +8028,15 @@
         return false;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "filter", 0, NULL, psStringCopy(filter))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "filter", 0, NULL, filter)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item filter");
         psFree(md);
         return false;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "stats", 0, NULL, psStringCopy(stats))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "stats", 0, NULL, stats)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item stats");
         psFree(md);
         return false;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "recipe", 0, NULL, psStringCopy(recipe))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "recipe", 0, NULL, recipe)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item recipe");
         psFree(md);
@@ -8258,20 +8292,20 @@
 
     md = psMetadataAlloc();
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "exp_id", 0, NULL, psStringCopy(object->exp_id))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "exp_id", 0, NULL, object->exp_id)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id");
         psFree(md);
         return NULL;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "camera", 0, NULL, psStringCopy(object->camera))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "camera", 0, NULL, object->camera)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item camera");
         psFree(md);
         return NULL;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "telescope", 0, NULL, psStringCopy(object->telescope))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "telescope", 0, NULL, object->telescope)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item telescope");
         psFree(md);
         return NULL;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "exp_type", 0, NULL, psStringCopy(object->exp_type))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "exp_type", 0, NULL, object->exp_type)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item exp_type");
         psFree(md);
@@ -8283,15 +8317,15 @@
         return NULL;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "filter", 0, NULL, psStringCopy(object->filter))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "filter", 0, NULL, object->filter)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item filter");
         psFree(md);
         return NULL;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "stats", 0, NULL, psStringCopy(object->stats))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "stats", 0, NULL, object->stats)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item stats");
         psFree(md);
         return NULL;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "recipe", 0, NULL, psStringCopy(object->recipe))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "recipe", 0, NULL, object->recipe)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item recipe");
         psFree(md);
@@ -8405,5 +8439,7 @@
 
     for (i = 0; i < rowSet->n; i++) {
-        psArrayAdd(returnSet, 0, p2PendingExpObjectFromMetadata(rowSet->data[i]));
+        p2PendingExpRow *object = p2PendingExpObjectFromMetadata(rowSet->data[i]);
+        psArrayAdd(returnSet, 0, object);
+        psFree(object);
     }
 
@@ -8525,25 +8561,25 @@
 
     md = psMetadataAlloc();
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "exp_id", 0, NULL, psStringCopy(exp_id))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "exp_id", 0, NULL, exp_id)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id");
         psFree(md);
         return false;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "class_id", 0, NULL, psStringCopy(class_id))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "class_id", 0, NULL, class_id)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item class_id");
         psFree(md);
         return false;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "uri", 0, NULL, psStringCopy(uri))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "uri", 0, NULL, uri)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item uri");
         psFree(md);
         return false;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "stats", 0, NULL, psStringCopy(stats))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "stats", 0, NULL, stats)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item stats");
         psFree(md);
         return false;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "recipe", 0, NULL, psStringCopy(recipe))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "recipe", 0, NULL, recipe)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item recipe");
         psFree(md);
@@ -8778,25 +8814,25 @@
 
     md = psMetadataAlloc();
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "exp_id", 0, NULL, psStringCopy(object->exp_id))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "exp_id", 0, NULL, object->exp_id)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id");
         psFree(md);
         return NULL;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "class_id", 0, NULL, psStringCopy(object->class_id))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "class_id", 0, NULL, object->class_id)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item class_id");
         psFree(md);
         return NULL;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "uri", 0, NULL, psStringCopy(object->uri))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "uri", 0, NULL, object->uri)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item uri");
         psFree(md);
         return NULL;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "stats", 0, NULL, psStringCopy(object->stats))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "stats", 0, NULL, object->stats)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item stats");
         psFree(md);
         return NULL;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "recipe", 0, NULL, psStringCopy(object->recipe))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "recipe", 0, NULL, object->recipe)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item recipe");
         psFree(md);
@@ -8892,5 +8928,7 @@
 
     for (i = 0; i < rowSet->n; i++) {
-        psArrayAdd(returnSet, 0, p2PendingImfileObjectFromMetadata(rowSet->data[i]));
+        p2PendingImfileRow *object = p2PendingImfileObjectFromMetadata(rowSet->data[i]);
+        psArrayAdd(returnSet, 0, object);
+        psFree(object);
     }
 
@@ -9032,20 +9070,20 @@
 
     md = psMetadataAlloc();
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "exp_id", 0, NULL, psStringCopy(exp_id))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "exp_id", 0, NULL, exp_id)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id");
         psFree(md);
         return false;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "camera", 0, NULL, psStringCopy(camera))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "camera", 0, NULL, camera)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item camera");
         psFree(md);
         return false;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "telescope", 0, NULL, psStringCopy(telescope))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "telescope", 0, NULL, telescope)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item telescope");
         psFree(md);
         return false;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "exp_type", 0, NULL, psStringCopy(exp_type))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "exp_type", 0, NULL, exp_type)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item exp_type");
         psFree(md);
@@ -9057,15 +9095,15 @@
         return false;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "filter", 0, NULL, psStringCopy(filter))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "filter", 0, NULL, filter)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item filter");
         psFree(md);
         return false;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "stats", 0, NULL, psStringCopy(stats))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "stats", 0, NULL, stats)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item stats");
         psFree(md);
         return false;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "recipe", 0, NULL, psStringCopy(recipe))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "recipe", 0, NULL, recipe)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item recipe");
         psFree(md);
@@ -9321,20 +9359,20 @@
 
     md = psMetadataAlloc();
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "exp_id", 0, NULL, psStringCopy(object->exp_id))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "exp_id", 0, NULL, object->exp_id)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id");
         psFree(md);
         return NULL;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "camera", 0, NULL, psStringCopy(object->camera))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "camera", 0, NULL, object->camera)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item camera");
         psFree(md);
         return NULL;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "telescope", 0, NULL, psStringCopy(object->telescope))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "telescope", 0, NULL, object->telescope)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item telescope");
         psFree(md);
         return NULL;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "exp_type", 0, NULL, psStringCopy(object->exp_type))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "exp_type", 0, NULL, object->exp_type)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item exp_type");
         psFree(md);
@@ -9346,15 +9384,15 @@
         return NULL;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "filter", 0, NULL, psStringCopy(object->filter))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "filter", 0, NULL, object->filter)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item filter");
         psFree(md);
         return NULL;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "stats", 0, NULL, psStringCopy(object->stats))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "stats", 0, NULL, object->stats)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item stats");
         psFree(md);
         return NULL;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "recipe", 0, NULL, psStringCopy(object->recipe))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "recipe", 0, NULL, object->recipe)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item recipe");
         psFree(md);
@@ -9468,5 +9506,7 @@
 
     for (i = 0; i < rowSet->n; i++) {
-        psArrayAdd(returnSet, 0, p2DoneExpObjectFromMetadata(rowSet->data[i]));
+        p2DoneExpRow *object = p2DoneExpObjectFromMetadata(rowSet->data[i]);
+        psArrayAdd(returnSet, 0, object);
+        psFree(object);
     }
 
@@ -9588,25 +9628,25 @@
 
     md = psMetadataAlloc();
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "exp_id", 0, NULL, psStringCopy(exp_id))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "exp_id", 0, NULL, exp_id)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id");
         psFree(md);
         return false;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "class_id", 0, NULL, psStringCopy(class_id))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "class_id", 0, NULL, class_id)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item class_id");
         psFree(md);
         return false;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "uri", 0, NULL, psStringCopy(uri))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "uri", 0, NULL, uri)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item uri");
         psFree(md);
         return false;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "stats", 0, NULL, psStringCopy(stats))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "stats", 0, NULL, stats)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item stats");
         psFree(md);
         return false;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "recipe", 0, NULL, psStringCopy(recipe))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "recipe", 0, NULL, recipe)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item recipe");
         psFree(md);
@@ -9841,25 +9881,25 @@
 
     md = psMetadataAlloc();
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "exp_id", 0, NULL, psStringCopy(object->exp_id))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "exp_id", 0, NULL, object->exp_id)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id");
         psFree(md);
         return NULL;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "class_id", 0, NULL, psStringCopy(object->class_id))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "class_id", 0, NULL, object->class_id)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item class_id");
         psFree(md);
         return NULL;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "uri", 0, NULL, psStringCopy(object->uri))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "uri", 0, NULL, object->uri)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item uri");
         psFree(md);
         return NULL;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "stats", 0, NULL, psStringCopy(object->stats))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "stats", 0, NULL, object->stats)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item stats");
         psFree(md);
         return NULL;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "recipe", 0, NULL, psStringCopy(object->recipe))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "recipe", 0, NULL, object->recipe)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item recipe");
         psFree(md);
@@ -9955,5 +9995,7 @@
 
     for (i = 0; i < rowSet->n; i++) {
-        psArrayAdd(returnSet, 0, p2DoneImfileObjectFromMetadata(rowSet->data[i]));
+        p2DoneImfileRow *object = p2DoneImfileObjectFromMetadata(rowSet->data[i]);
+        psArrayAdd(returnSet, 0, object);
+        psFree(object);
     }
 
@@ -10088,15 +10130,15 @@
 
     md = psMetadataAlloc();
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "exp_id", 0, NULL, psStringCopy(exp_id))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "exp_id", 0, NULL, exp_id)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id");
         psFree(md);
         return false;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "camera", 0, NULL, psStringCopy(camera))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "camera", 0, NULL, camera)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item camera");
         psFree(md);
         return false;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "exp_type", 0, NULL, psStringCopy(exp_type))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "exp_type", 0, NULL, exp_type)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item exp_type");
         psFree(md);
@@ -10108,15 +10150,15 @@
         return false;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "filter", 0, NULL, psStringCopy(filter))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "filter", 0, NULL, filter)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item filter");
         psFree(md);
         return false;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "stats", 0, NULL, psStringCopy(stats))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "stats", 0, NULL, stats)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item stats");
         psFree(md);
         return false;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "recipe", 0, NULL, psStringCopy(recipe))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "recipe", 0, NULL, recipe)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item recipe");
         psFree(md);
@@ -10365,15 +10407,15 @@
 
     md = psMetadataAlloc();
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "exp_id", 0, NULL, psStringCopy(object->exp_id))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "exp_id", 0, NULL, object->exp_id)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id");
         psFree(md);
         return NULL;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "camera", 0, NULL, psStringCopy(object->camera))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "camera", 0, NULL, object->camera)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item camera");
         psFree(md);
         return NULL;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "exp_type", 0, NULL, psStringCopy(object->exp_type))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "exp_type", 0, NULL, object->exp_type)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item exp_type");
         psFree(md);
@@ -10385,15 +10427,15 @@
         return NULL;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "filter", 0, NULL, psStringCopy(object->filter))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "filter", 0, NULL, object->filter)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item filter");
         psFree(md);
         return NULL;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "stats", 0, NULL, psStringCopy(object->stats))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "stats", 0, NULL, object->stats)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item stats");
         psFree(md);
         return NULL;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "recipe", 0, NULL, psStringCopy(object->recipe))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "recipe", 0, NULL, object->recipe)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item recipe");
         psFree(md);
@@ -10501,5 +10543,7 @@
 
     for (i = 0; i < rowSet->n; i++) {
-        psArrayAdd(returnSet, 0, p3PendingExpObjectFromMetadata(rowSet->data[i]));
+        p3PendingExpRow *object = p3PendingExpObjectFromMetadata(rowSet->data[i]);
+        psArrayAdd(returnSet, 0, object);
+        psFree(object);
     }
 
@@ -10529,5 +10573,5 @@
 static void detRunRowFree(detRunRow *object);
 
-detRunRow *detRunRowAlloc(const char *det_type, psS32 iteration)
+detRunRow *detRunRowAlloc(psS32 iteration, const char *det_type)
 {
     detRunRow       *object;
@@ -10536,6 +10580,6 @@
     psMemSetDeallocator(object, (psFreeFunc)detRunRowFree);
 
+    object->iteration = iteration;
     object->det_type = psStringCopy(det_type);
-    object->iteration = iteration;
 
     return object;
@@ -10558,4 +10602,9 @@
         return false;
     }
+    if (!psMetadataAddS32(md, PS_LIST_TAIL, "iteration", 0, NULL, 0)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item iteration");
+        psFree(md);
+        return false;
+    }
     if (!psMetadataAddStr(md, PS_LIST_TAIL, "det_type", 0, "Key", "255")) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item det_type");
@@ -10563,9 +10612,4 @@
         return false;
     }
-    if (!psMetadataAddS32(md, PS_LIST_TAIL, "iteration", 0, NULL, 0)) {
-        psError(PS_ERR_UNKNOWN, false, "failed to add item iteration");
-        psFree(md);
-        return false;
-    }
 
     status = psDBCreateTable(dbh, DETRUN_TABLE_NAME, md);
@@ -10581,5 +10625,5 @@
 }
 
-bool detRunInsert(psDB * dbh, const char *det_type, psS32 iteration)
+bool detRunInsert(psDB * dbh, psS32 iteration, const char *det_type)
 {
     psMetadata      *md;
@@ -10587,9 +10631,4 @@
 
     md = psMetadataAlloc();
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "det_type", 0, NULL, psStringCopy(det_type))) {
-        psError(PS_ERR_UNKNOWN, false, "failed to add item det_type");
-        psFree(md);
-        return false;
-    }
     if (!psMetadataAddS32(md, PS_LIST_TAIL, "iteration", 0, NULL, iteration)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item iteration");
@@ -10597,4 +10636,9 @@
         return false;
     }
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "det_type", 0, NULL, det_type)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item det_type");
+        psFree(md);
+        return false;
+    }
 
     status = psDBInsertOneRow(dbh, DETRUN_TABLE_NAME, md);
@@ -10604,5 +10648,5 @@
 }
 
-bool detRunPop(psDB *dbh, char **det_type, psS32 *iteration)
+bool detRunPop(psDB *dbh, psS32 *iteration, char **det_type)
 {
     psArray         *rowSet;
@@ -10648,4 +10692,10 @@
     psFree(popped);
 
+    *iteration = psMetadataLookupS32(&status, row, "iteration");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item iteration");
+        psFree(row);
+        return false;
+    }
     *det_type = psMetadataLookupPtr(&status, row, "det_type");
     if (!status) {
@@ -10654,10 +10704,4 @@
         return false;
     }
-    *iteration = psMetadataLookupS32(&status, row, "iteration");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item iteration");
-        psFree(row);
-        return false;
-    }
 
     psFree(row);
@@ -10668,18 +10712,18 @@
 bool detRunInsertObject(psDB *dbh, detRunRow *object)
 {
-    return detRunInsert(dbh, object->det_type, object->iteration);
+    return detRunInsert(dbh, object->iteration, object->det_type);
 }
 
 detRunRow *detRunPopObject(psDB *dbh)
 {
+    psS32           iteration;
     char            det_type[256];
-    psS32           iteration;
-
-    if (!detRunPop(dbh, (char **)&det_type, &iteration)) {
+
+    if (!detRunPop(dbh, &iteration, (char **)&det_type)) {
         psError(PS_ERR_UNKNOWN, false, "failed to pop a database row");
         return NULL;
     }
 
-    return detRunRowAlloc(det_type, iteration);
+    return detRunRowAlloc(iteration, det_type);
 }
 
@@ -10780,9 +10824,4 @@
 
     md = psMetadataAlloc();
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "det_type", 0, NULL, psStringCopy(object->det_type))) {
-        psError(PS_ERR_UNKNOWN, false, "failed to add item det_type");
-        psFree(md);
-        return NULL;
-    }
     if (!psMetadataAddS32(md, PS_LIST_TAIL, "iteration", 0, NULL, object->iteration)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item iteration");
@@ -10790,4 +10829,9 @@
         return NULL;
     }
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "det_type", 0, NULL, object->det_type)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item det_type");
+        psFree(md);
+        return NULL;
+    }
 
     return md;
@@ -10797,7 +10841,12 @@
 {
     bool            status;
+    psS32           iteration;
     char            *det_type;
-    psS32           iteration;
-
+
+    iteration = psMetadataLookupS32(&status, md, "iteration");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item iteration");
+        return false;
+    }
     det_type = psMetadataLookupPtr(&status, md, "det_type");
     if (!status) {
@@ -10805,11 +10854,6 @@
         return false;
     }
-    iteration = psMetadataLookupS32(&status, md, "iteration");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item iteration");
-        return false;
-    }
-
-    return detRunRowAlloc(det_type, iteration);
+
+    return detRunRowAlloc(iteration, det_type);
 }
 psArray *detRunSelectRowObjects(psDB *dbh, const psMetadata *where, unsigned long long limit)
@@ -10839,5 +10883,7 @@
 
     for (i = 0; i < rowSet->n; i++) {
-        psArrayAdd(returnSet, 0, detRunObjectFromMetadata(rowSet->data[i]));
+        detRunRow *object = detRunObjectFromMetadata(rowSet->data[i]);
+        psArrayAdd(returnSet, 0, object);
+        psFree(object);
     }
 
@@ -10982,20 +11028,20 @@
         return false;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "exp_id", 0, NULL, psStringCopy(exp_id))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "exp_id", 0, NULL, exp_id)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id");
         psFree(md);
         return false;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "camera", 0, NULL, psStringCopy(camera))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "camera", 0, NULL, camera)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item camera");
         psFree(md);
         return false;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "telescope", 0, NULL, psStringCopy(telescope))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "telescope", 0, NULL, telescope)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item telescope");
         psFree(md);
         return false;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "exp_type", 0, NULL, psStringCopy(exp_type))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "exp_type", 0, NULL, exp_type)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item exp_type");
         psFree(md);
@@ -11007,10 +11053,10 @@
         return false;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "filter", 0, NULL, psStringCopy(filter))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "filter", 0, NULL, filter)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item filter");
         psFree(md);
         return false;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "stats", 0, NULL, psStringCopy(stats))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "stats", 0, NULL, stats)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item stats");
         psFree(md);
@@ -11259,20 +11305,20 @@
         return NULL;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "exp_id", 0, NULL, psStringCopy(object->exp_id))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "exp_id", 0, NULL, object->exp_id)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id");
         psFree(md);
         return NULL;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "camera", 0, NULL, psStringCopy(object->camera))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "camera", 0, NULL, object->camera)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item camera");
         psFree(md);
         return NULL;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "telescope", 0, NULL, psStringCopy(object->telescope))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "telescope", 0, NULL, object->telescope)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item telescope");
         psFree(md);
         return NULL;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "exp_type", 0, NULL, psStringCopy(object->exp_type))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "exp_type", 0, NULL, object->exp_type)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item exp_type");
         psFree(md);
@@ -11284,10 +11330,10 @@
         return NULL;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "filter", 0, NULL, psStringCopy(object->filter))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "filter", 0, NULL, object->filter)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item filter");
         psFree(md);
         return NULL;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "stats", 0, NULL, psStringCopy(object->stats))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "stats", 0, NULL, object->stats)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item stats");
         psFree(md);
@@ -11385,5 +11431,7 @@
 
     for (i = 0; i < rowSet->n; i++) {
-        psArrayAdd(returnSet, 0, detInputExpObjectFromMetadata(rowSet->data[i]));
+        detInputExpRow *object = detInputExpObjectFromMetadata(rowSet->data[i]);
+        psArrayAdd(returnSet, 0, object);
+        psFree(object);
     }
 
@@ -11504,25 +11552,25 @@
         return false;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "exp_id", 0, NULL, psStringCopy(exp_id))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "exp_id", 0, NULL, exp_id)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id");
         psFree(md);
         return false;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "class_id", 0, NULL, psStringCopy(class_id))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "class_id", 0, NULL, class_id)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item class_id");
         psFree(md);
         return false;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "uri", 0, NULL, psStringCopy(uri))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "uri", 0, NULL, uri)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item uri");
         psFree(md);
         return false;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "stats", 0, NULL, psStringCopy(stats))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "stats", 0, NULL, stats)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item stats");
         psFree(md);
         return false;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "recipe", 0, NULL, psStringCopy(recipe))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "recipe", 0, NULL, recipe)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item recipe");
         psFree(md);
@@ -11745,25 +11793,25 @@
         return NULL;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "exp_id", 0, NULL, psStringCopy(object->exp_id))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "exp_id", 0, NULL, object->exp_id)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id");
         psFree(md);
         return NULL;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "class_id", 0, NULL, psStringCopy(object->class_id))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "class_id", 0, NULL, object->class_id)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item class_id");
         psFree(md);
         return NULL;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "uri", 0, NULL, psStringCopy(object->uri))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "uri", 0, NULL, object->uri)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item uri");
         psFree(md);
         return NULL;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "stats", 0, NULL, psStringCopy(object->stats))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "stats", 0, NULL, object->stats)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item stats");
         psFree(md);
         return NULL;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "recipe", 0, NULL, psStringCopy(object->recipe))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "recipe", 0, NULL, object->recipe)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item recipe");
         psFree(md);
@@ -11843,5 +11891,7 @@
 
     for (i = 0; i < rowSet->n; i++) {
-        psArrayAdd(returnSet, 0, detProcessedImfileObjectFromMetadata(rowSet->data[i]));
+        detProcessedImfileRow *object = detProcessedImfileObjectFromMetadata(rowSet->data[i]);
+        psArrayAdd(returnSet, 0, object);
+        psFree(object);
     }
 
@@ -11966,20 +12016,20 @@
         return false;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "class_id", 0, NULL, psStringCopy(class_id))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "class_id", 0, NULL, class_id)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item class_id");
         psFree(md);
         return false;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "uri", 0, NULL, psStringCopy(uri))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "uri", 0, NULL, uri)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item uri");
         psFree(md);
         return false;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "stats", 0, NULL, psStringCopy(stats))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "stats", 0, NULL, stats)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item stats");
         psFree(md);
         return false;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "recipe", 0, NULL, psStringCopy(recipe))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "recipe", 0, NULL, recipe)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item recipe");
         psFree(md);
@@ -12207,20 +12257,20 @@
         return NULL;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "class_id", 0, NULL, psStringCopy(object->class_id))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "class_id", 0, NULL, object->class_id)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item class_id");
         psFree(md);
         return NULL;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "uri", 0, NULL, psStringCopy(object->uri))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "uri", 0, NULL, object->uri)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item uri");
         psFree(md);
         return NULL;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "stats", 0, NULL, psStringCopy(object->stats))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "stats", 0, NULL, object->stats)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item stats");
         psFree(md);
         return NULL;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "recipe", 0, NULL, psStringCopy(object->recipe))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "recipe", 0, NULL, object->recipe)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item recipe");
         psFree(md);
@@ -12300,5 +12350,7 @@
 
     for (i = 0; i < rowSet->n; i++) {
-        psArrayAdd(returnSet, 0, detStackedImfileObjectFromMetadata(rowSet->data[i]));
+        detStackedImfileRow *object = detStackedImfileObjectFromMetadata(rowSet->data[i]);
+        psArrayAdd(returnSet, 0, object);
+        psFree(object);
     }
 
@@ -12423,20 +12475,20 @@
         return false;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "class_id", 0, NULL, psStringCopy(class_id))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "class_id", 0, NULL, class_id)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item class_id");
         psFree(md);
         return false;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "uri", 0, NULL, psStringCopy(uri))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "uri", 0, NULL, uri)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item uri");
         psFree(md);
         return false;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "stats", 0, NULL, psStringCopy(stats))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "stats", 0, NULL, stats)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item stats");
         psFree(md);
         return false;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "recipe", 0, NULL, psStringCopy(recipe))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "recipe", 0, NULL, recipe)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item recipe");
         psFree(md);
@@ -12664,20 +12716,20 @@
         return NULL;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "class_id", 0, NULL, psStringCopy(object->class_id))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "class_id", 0, NULL, object->class_id)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item class_id");
         psFree(md);
         return NULL;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "uri", 0, NULL, psStringCopy(object->uri))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "uri", 0, NULL, object->uri)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item uri");
         psFree(md);
         return NULL;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "stats", 0, NULL, psStringCopy(object->stats))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "stats", 0, NULL, object->stats)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item stats");
         psFree(md);
         return NULL;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "recipe", 0, NULL, psStringCopy(object->recipe))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "recipe", 0, NULL, object->recipe)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item recipe");
         psFree(md);
@@ -12757,5 +12809,7 @@
 
     for (i = 0; i < rowSet->n; i++) {
-        psArrayAdd(returnSet, 0, detNormalizedImfileObjectFromMetadata(rowSet->data[i]));
+        detNormalizedImfileRow *object = detNormalizedImfileObjectFromMetadata(rowSet->data[i]);
+        psArrayAdd(returnSet, 0, object);
+        psFree(object);
     }
 
@@ -12859,5 +12913,5 @@
         return false;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "comment", 0, NULL, psStringCopy(comment))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "comment", 0, NULL, comment)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item comment");
         psFree(md);
@@ -13064,5 +13118,5 @@
         return NULL;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "comment", 0, NULL, psStringCopy(object->comment))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "comment", 0, NULL, object->comment)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item comment");
         psFree(md);
@@ -13124,5 +13178,7 @@
 
     for (i = 0; i < rowSet->n; i++) {
-        psArrayAdd(returnSet, 0, detMasterFrameObjectFromMetadata(rowSet->data[i]));
+        detMasterFrameRow *object = detMasterFrameObjectFromMetadata(rowSet->data[i]);
+        psArrayAdd(returnSet, 0, object);
+        psFree(object);
     }
 
@@ -13236,20 +13292,20 @@
         return false;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "class_id", 0, NULL, psStringCopy(class_id))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "class_id", 0, NULL, class_id)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item class_id");
         psFree(md);
         return false;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "uri", 0, NULL, psStringCopy(uri))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "uri", 0, NULL, uri)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item uri");
         psFree(md);
         return false;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "stats", 0, NULL, psStringCopy(stats))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "stats", 0, NULL, stats)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item stats");
         psFree(md);
         return false;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "recipe", 0, NULL, psStringCopy(recipe))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "recipe", 0, NULL, recipe)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item recipe");
         psFree(md);
@@ -13465,20 +13521,20 @@
         return NULL;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "class_id", 0, NULL, psStringCopy(object->class_id))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "class_id", 0, NULL, object->class_id)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item class_id");
         psFree(md);
         return NULL;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "uri", 0, NULL, psStringCopy(object->uri))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "uri", 0, NULL, object->uri)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item uri");
         psFree(md);
         return NULL;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "stats", 0, NULL, psStringCopy(object->stats))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "stats", 0, NULL, object->stats)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item stats");
         psFree(md);
         return NULL;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "recipe", 0, NULL, psStringCopy(object->recipe))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "recipe", 0, NULL, object->recipe)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item recipe");
         psFree(md);
@@ -13552,5 +13608,7 @@
 
     for (i = 0; i < rowSet->n; i++) {
-        psArrayAdd(returnSet, 0, detMasterImfileObjectFromMetadata(rowSet->data[i]));
+        detMasterImfileRow *object = detMasterImfileObjectFromMetadata(rowSet->data[i]);
+        psArrayAdd(returnSet, 0, object);
+        psFree(object);
     }
 
@@ -13675,20 +13733,20 @@
         return false;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "exp_id", 0, NULL, psStringCopy(exp_id))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "exp_id", 0, NULL, exp_id)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id");
         psFree(md);
         return false;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "class_id", 0, NULL, psStringCopy(class_id))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "class_id", 0, NULL, class_id)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item class_id");
         psFree(md);
         return false;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "stats", 0, NULL, psStringCopy(stats))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "stats", 0, NULL, stats)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item stats");
         psFree(md);
         return false;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "recipe", 0, NULL, psStringCopy(recipe))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "recipe", 0, NULL, recipe)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item recipe");
         psFree(md);
@@ -13916,20 +13974,20 @@
         return NULL;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "exp_id", 0, NULL, psStringCopy(object->exp_id))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "exp_id", 0, NULL, object->exp_id)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id");
         psFree(md);
         return NULL;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "class_id", 0, NULL, psStringCopy(object->class_id))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "class_id", 0, NULL, object->class_id)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item class_id");
         psFree(md);
         return NULL;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "stats", 0, NULL, psStringCopy(object->stats))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "stats", 0, NULL, object->stats)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item stats");
         psFree(md);
         return NULL;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "recipe", 0, NULL, psStringCopy(object->recipe))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "recipe", 0, NULL, object->recipe)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item recipe");
         psFree(md);
@@ -14009,5 +14067,7 @@
 
     for (i = 0; i < rowSet->n; i++) {
-        psArrayAdd(returnSet, 0, detResidImfileAnalysisObjectFromMetadata(rowSet->data[i]));
+        detResidImfileAnalysisRow *object = detResidImfileAnalysisObjectFromMetadata(rowSet->data[i]);
+        psArrayAdd(returnSet, 0, object);
+        psFree(object);
     }
 
@@ -14131,15 +14191,15 @@
         return false;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "exp_id", 0, NULL, psStringCopy(exp_id))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "exp_id", 0, NULL, exp_id)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id");
         psFree(md);
         return false;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "stats", 0, NULL, psStringCopy(stats))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "stats", 0, NULL, stats)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item stats");
         psFree(md);
         return false;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "recipe", 0, NULL, psStringCopy(recipe))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "recipe", 0, NULL, recipe)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item recipe");
         psFree(md);
@@ -14372,15 +14432,15 @@
         return NULL;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "exp_id", 0, NULL, psStringCopy(object->exp_id))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "exp_id", 0, NULL, object->exp_id)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id");
         psFree(md);
         return NULL;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "stats", 0, NULL, psStringCopy(object->stats))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "stats", 0, NULL, object->stats)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item stats");
         psFree(md);
         return NULL;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "recipe", 0, NULL, psStringCopy(object->recipe))) {
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "recipe", 0, NULL, object->recipe)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item recipe");
         psFree(md);
@@ -14465,5 +14525,7 @@
 
     for (i = 0; i < rowSet->n; i++) {
-        psArrayAdd(returnSet, 0, detResidExpAnalysisObjectFromMetadata(rowSet->data[i]));
+        detResidExpAnalysisRow *object = detResidExpAnalysisObjectFromMetadata(rowSet->data[i]);
+        psArrayAdd(returnSet, 0, object);
+        psFree(object);
     }
 
Index: /branches/jhoblitt/ippdb/src/ippdb.h
===================================================================
--- /branches/jhoblitt/ippdb/src/ippdb.h	(revision 8005)
+++ /branches/jhoblitt/ippdb/src/ippdb.h	(revision 8006)
@@ -4207,6 +4207,6 @@
 
 typedef struct {
+    psS32           iteration;
     char            *det_type;
-    psS32           iteration;
 } detRunRow;
 
@@ -4217,6 +4217,6 @@
 
 detRunRow *detRunRowAlloc(
-    const char      *det_type,
-    psS32           iteration
+    psS32           iteration,
+    const char      *det_type
 );
 
@@ -4248,6 +4248,6 @@
 bool detRunInsert(
     psDB            *dbh,               ///< Database handle
-    const char      *det_type,
-    psS32           iteration
+    psS32           iteration,
+    const char      *det_type
 );
 
@@ -4259,6 +4259,6 @@
 bool detRunPop(
     psDB            *dbh,               ///< Database handle
-    char            **det_type,
-    psS32           *iteration
+    psS32           *iteration,
+    char            **det_type
 );
 
Index: /branches/jhoblitt/ippdb/tests/alloc.c
===================================================================
--- /branches/jhoblitt/ippdb/tests/alloc.c	(revision 8005)
+++ /branches/jhoblitt/ippdb/tests/alloc.c	(revision 8006)
@@ -880,15 +880,15 @@
         detRunRow       *object;
 
-        object = detRunRowAlloc("a string", -32    );
-
-        if (!object) {
-            exit(EXIT_FAILURE);
-        }
-
+        object = detRunRowAlloc(-32, "a string"    );
+
+        if (!object) {
+            exit(EXIT_FAILURE);
+        }
+
+        if (!object->iteration == -32) {
+            psFree(object);
+            exit(EXIT_FAILURE);
+        }
         if (strncmp(object->det_type, "a string", MAX_STRING_LENGTH)) {
-            psFree(object);
-            exit(EXIT_FAILURE);
-        }
-        if (!object->iteration == -32) {
             psFree(object);
             exit(EXIT_FAILURE);
Index: /branches/jhoblitt/ippdb/tests/insert.c
===================================================================
--- /branches/jhoblitt/ippdb/tests/insert.c	(revision 8005)
+++ /branches/jhoblitt/ippdb/tests/insert.c	(revision 8006)
@@ -343,5 +343,5 @@
         }
 
-        if (!detRunInsert(dbh, "a string", -32)) {
+        if (!detRunInsert(dbh, -32, "a string")) {
             exit(EXIT_FAILURE);
         }
Index: /branches/jhoblitt/ippdb/tests/insertobject.c
===================================================================
--- /branches/jhoblitt/ippdb/tests/insertobject.c	(revision 8005)
+++ /branches/jhoblitt/ippdb/tests/insertobject.c	(revision 8006)
@@ -498,5 +498,5 @@
         }
 
-        object = detRunRowAlloc("a string", -32);
+        object = detRunRowAlloc(-32, "a string");
         if (!object) {
             exit(EXIT_FAILURE);
Index: /branches/jhoblitt/ippdb/tests/metadatafromobject.c
===================================================================
--- /branches/jhoblitt/ippdb/tests/metadatafromobject.c	(revision 8005)
+++ /branches/jhoblitt/ippdb/tests/metadatafromobject.c	(revision 8006)
@@ -1059,5 +1059,5 @@
         bool            status;
 
-        object = detRunRowAlloc("a string", -32);
+        object = detRunRowAlloc(-32, "a string");
         if (!object) {
             exit(EXIT_FAILURE);
@@ -1071,9 +1071,9 @@
         psFree(object);
 
+        if (!psMetadataLookupS32(&status, md, "iteration") == -32) {
+            psFree(md);
+            exit(EXIT_FAILURE);
+        }
         if (strncmp(psMetadataLookupPtr(&status, md, "det_type"), "a string", MAX_STRING_LENGTH)) {
-            psFree(md);
-            exit(EXIT_FAILURE);
-        }
-        if (!psMetadataLookupS32(&status, md, "iteration") == -32) {
             psFree(md);
             exit(EXIT_FAILURE);
Index: /branches/jhoblitt/ippdb/tests/objectfrommetadata.c
===================================================================
--- /branches/jhoblitt/ippdb/tests/objectfrommetadata.c	(revision 8005)
+++ /branches/jhoblitt/ippdb/tests/objectfrommetadata.c	(revision 8006)
@@ -1577,12 +1577,12 @@
 
         md = psMetadataAlloc();
+        if (!psMetadataAddS32(md, PS_LIST_TAIL, "iteration", 0, NULL, -32)) {
+            psFree(md);
+            exit(EXIT_FAILURE);
+        }
         if (!psMetadataAddStr(md, PS_LIST_TAIL, "det_type", 0, NULL, "a string")) {
             psFree(md);
             exit(EXIT_FAILURE);
         }
-        if (!psMetadataAddS32(md, PS_LIST_TAIL, "iteration", 0, NULL, -32)) {
-            psFree(md);
-            exit(EXIT_FAILURE);
-        }
 
         object = detRunObjectFromMetadata(md);
@@ -1594,9 +1594,9 @@
         psFree(md);
 
+        if (!object->iteration == -32) {
+            psFree(object);
+            exit(EXIT_FAILURE);
+        }
         if (strncmp(object->det_type, "a string", MAX_STRING_LENGTH)) {
-            psFree(object);
-            exit(EXIT_FAILURE);
-        }
-        if (!object->iteration == -32) {
             psFree(object);
             exit(EXIT_FAILURE);
Index: /branches/jhoblitt/ippdb/tests/pop.c
===================================================================
--- /branches/jhoblitt/ippdb/tests/pop.c	(revision 8005)
+++ /branches/jhoblitt/ippdb/tests/pop.c	(revision 8006)
@@ -483,13 +483,13 @@
     {
         psDB            *dbh;
+        psS32           iteration;
         char            det_type[256];
-        psS32           iteration;
-
-        dbh = psDBInit("localhost", "test", NULL, "test");
-        if (!dbh) {
-            exit(EXIT_FAILURE);
-        }
-
-        if (!detRunPop(dbh, (char **)&det_type, &iteration)) { 
+
+        dbh = psDBInit("localhost", "test", NULL, "test");
+        if (!dbh) {
+            exit(EXIT_FAILURE);
+        }
+
+        if (!detRunPop(dbh, &iteration, (char **)&det_type)) { 
             exit(EXIT_FAILURE);
         }
