Index: branches/eam_branches/ipp-20121219/Ohana/src/dvopsps/Makefile
===================================================================
--- branches/eam_branches/ipp-20121219/Ohana/src/dvopsps/Makefile	(revision 35054)
+++ branches/eam_branches/ipp-20121219/Ohana/src/dvopsps/Makefile	(revision 35055)
@@ -27,4 +27,6 @@
 $(SRC)/mysql_dvopsps.$(ARCH).o \
 $(SRC)/insert_skytable.$(ARCH).o \
+$(SRC)/insert_objects_dvopsps.$(ARCH).o \
+$(SRC)/insert_objects_dvopsps_catalog.$(ARCH).o \
 $(SRC)/insert_detections_dvopsps.$(ARCH).o \
 $(SRC)/insert_detections_dvopsps_catalog.$(ARCH).o
@@ -40,4 +42,6 @@
 $(SRC)/mysql_dvopsps.$(ARCH).o \
 $(SRC)/insert_skytable.$(ARCH).o \
+$(SRC)/insert_objects_dvopsps.$(ARCH).o \
+$(SRC)/insert_objects_dvopsps_catalog.$(ARCH).o \
 $(SRC)/insert_detections_dvopsps.$(ARCH).o \
 $(SRC)/insert_detections_dvopsps_catalog.$(ARCH).o
Index: branches/eam_branches/ipp-20121219/Ohana/src/dvopsps/include/dvopsps.h
===================================================================
--- branches/eam_branches/ipp-20121219/Ohana/src/dvopsps/include/dvopsps.h	(revision 35054)
+++ branches/eam_branches/ipp-20121219/Ohana/src/dvopsps/include/dvopsps.h	(revision 35055)
@@ -42,13 +42,23 @@
 int    args_dvopsps_client           	  PROTO((int argc, char **argv));
        
+MYSQL *mysql_dvopsps_connect              PROTO((MYSQL *mysqlBase));
+
 int    insert_detections_dvopsps          PROTO(());
 int    insert_detections_dvopsps_parallel PROTO((SkyTable *sky));
 int    insert_detections_dvopsps_catalog  PROTO((Catalog *catalog, MYSQL *mysql));
       
-MYSQL *mysql_dvopsps_connect              PROTO((MYSQL *mysqlBase));
-
 int    insert_detections_mysql_commit     PROTO((IOBuffer *buffer, MYSQL *mysql));
 int    insert_detections_mysql_value      PROTO((IOBuffer *buffer, Average *average, Measure *measure));
 int    insert_detections_mysql_init       PROTO((IOBuffer *buffer));
+
+int    insert_objects_dvopsps             PROTO(());
+int    insert_objects_dvopsps_parallel    PROTO((SkyTable *sky));
+int    insert_objects_dvopsps_catalog     PROTO((Catalog *catalog, char *basename, MYSQL *mysql));
+      				          
+int    insert_objects_mysql_create_tables PROTO((char *basename, MYSQL *mysql));
+
+int    insert_objects_mysql_commit        PROTO((IOBuffer *ave_buffer, IOBuffer *sec_buffer, MYSQL *mysql));
+int    insert_objects_mysql_value         PROTO((IOBuffer *ave_buffer, IOBuffer *sec_buffer, Average *average, SecFilt *secfilt, int Nsecfilt));
+int    insert_objects_mysql_init          PROTO((IOBuffer *ave_buffer, IOBuffer *sec_buffer, char *basename));
 
 int    insert_skytable                    PROTO(());
Index: branches/eam_branches/ipp-20121219/Ohana/src/dvopsps/src/dvopsps.c
===================================================================
--- branches/eam_branches/ipp-20121219/Ohana/src/dvopsps/src/dvopsps.c	(revision 35054)
+++ branches/eam_branches/ipp-20121219/Ohana/src/dvopsps/src/dvopsps.c	(revision 35055)
@@ -11,4 +11,7 @@
   if (!strcasecmp (argv[1], "detections")) {
     status = insert_detections_dvopsps ();
+  }
+  if (!strcasecmp (argv[1], "objects")) {
+    status = insert_objects_dvopsps ();
   }
   if (!strcasecmp (argv[1], "skytable")) {
Index: branches/eam_branches/ipp-20121219/Ohana/src/dvopsps/src/initialize_dvopsps.c
===================================================================
--- branches/eam_branches/ipp-20121219/Ohana/src/dvopsps/src/initialize_dvopsps.c	(revision 35054)
+++ branches/eam_branches/ipp-20121219/Ohana/src/dvopsps/src/initialize_dvopsps.c	(revision 35055)
@@ -151,4 +151,5 @@
   fprintf (stderr, "    -v : verbose mode\n");
   fprintf (stderr, "    -region Rmin Rmax Dmin Dmax\n");
+  fprintf (stderr, "    -cpt filename\n");
   fprintf (stderr, "    -parallel : run in parallel mode\n");
   fprintf (stderr, "    -h     : this help list\n");
Index: branches/eam_branches/ipp-20121219/Ohana/src/dvopsps/src/insert_detections_dvopsps.c
===================================================================
--- branches/eam_branches/ipp-20121219/Ohana/src/dvopsps/src/insert_detections_dvopsps.c	(revision 35054)
+++ branches/eam_branches/ipp-20121219/Ohana/src/dvopsps/src/insert_detections_dvopsps.c	(revision 35055)
@@ -52,5 +52,5 @@
     catalog.catformat = DVO_FORMAT_UNDEF; // not needed since we skip empty catalogs
     catalog.catmode   = DVO_MODE_UNDEF;	  // not needed since we skip empty catalogs
-    catalog.catflags  = LOAD_AVES | LOAD_MEAS | LOAD_MISS | LOAD_SECF;
+    catalog.catflags  = LOAD_AVES | LOAD_MEAS | LOAD_SECF;
     catalog.Nsecfilt  = GetPhotcodeNsecfilt ();
 
Index: branches/eam_branches/ipp-20121219/Ohana/src/dvopsps/src/insert_objects_dvopsps.c
===================================================================
--- branches/eam_branches/ipp-20121219/Ohana/src/dvopsps/src/insert_objects_dvopsps.c	(revision 35055)
+++ branches/eam_branches/ipp-20121219/Ohana/src/dvopsps/src/insert_objects_dvopsps.c	(revision 35055)
@@ -0,0 +1,156 @@
+# include "dvopsps.h"
+# define USE_MYSQL 1
+
+// determine the relevant catalogs, launch parallel clients if desired
+int insert_objects_dvopsps () {
+
+  SkyTable *sky = NULL;
+  SkyList *skylist = NULL;
+  Catalog catalog;
+  off_t i;
+
+  // load the current sky table (layout of all SkyRegions) 
+  sky = SkyTableLoadOptimal (CATDIR, NULL, NULL, FALSE, -1, VERBOSE);
+  SkyTableSetFilenames (sky, CATDIR, "cpt");
+  
+  if (PARALLEL && !HOST_ID) {
+    int status = insert_objects_dvopsps_parallel (sky);
+    return status;
+  }
+
+  // determine the populated SkyRegions overlapping the requested area (default depth)
+  if (SINGLE_CPT) {
+      skylist = SkyRegionByCPT (sky, SINGLE_CPT);
+  } else {
+      skylist = SkyListByPatch (sky, -1, &UserPatch);
+  }
+  myAssert (skylist, "ooops!");
+
+# if (USE_MYSQL)
+  // NOTE: mysql connection happens here since each dvopsps_client makes its own connection
+  MYSQL  mysqlBase;
+  MYSQL *mysqlReal = mysql_dvopsps_connect (&mysqlBase);
+  if (!mysqlReal) {
+    fprintf (stderr, "failed to connect to mysql\n");
+    exit (1);
+  }
+# else
+  MYSQL *mysqlReal = NULL;
+# endif
+
+  // select measurements for each populated catalog
+  for (i = 0; i < skylist[0].Nregions; i++) {
+
+    // does this host ID match the desired location for the table?
+    if (!HostTableTestHost(skylist[0].regions[i], HOST_ID)) continue;
+
+    char localFilename[1024];
+    snprintf (localFilename, 1024, "%s/%s.cpt", HOSTDIR, skylist->regions[i]->name);
+
+    // set up the basic catalog info
+    catalog.filename  = HOST_ID ? localFilename : skylist[0].filename[i];
+    catalog.catformat = DVO_FORMAT_UNDEF; // not needed since we skip empty catalogs
+    catalog.catmode   = DVO_MODE_UNDEF;	  // not needed since we skip empty catalogs
+    catalog.catflags  = LOAD_AVES | LOAD_SECF;
+    catalog.Nsecfilt  = GetPhotcodeNsecfilt ();
+
+    if (!dvo_catalog_open (&catalog, skylist[0].regions[i], VERBOSE, "w")) {
+      fprintf (stderr, "ERROR: failure reading catalog %s\n", catalog.filename);
+      exit (1);
+    }
+    if (!catalog.Naves_disk) {
+      if (VERBOSE) fprintf (stderr, "no data in %s, skipping\n", catalog.filename);
+      dvo_catalog_unlock (&catalog);
+      dvo_catalog_free (&catalog);
+      continue;
+    }
+
+    // NOTE: this is where the real action happens
+    insert_objects_dvopsps_catalog (&catalog, skylist->regions[i]->name, mysqlReal);
+
+    // NOTE : unlike setastrom or relphot, this program is read-only wrt dvo
+    dvo_catalog_unlock (&catalog);
+    dvo_catalog_free (&catalog);
+  }
+
+  if (0) {
+    char query[256];
+    MYSQL_RES *result;
+
+    sprintf (query, "commit;");
+    if (mysql_query (mysqlReal, query)) {
+      fprintf (stderr, "failed to turn off autocommit\n");
+      fprintf (stderr, "%s\n", mysql_error (mysqlReal));
+      return FALSE;
+    }
+    result = mysql_store_result (mysqlReal);
+    mysql_free_result (result);
+  }
+    
+  return (TRUE);
+}      
+
+# define DEBUG 1
+
+int insert_objects_dvopsps_parallel (SkyTable *sky) {
+
+  // launch the dvopsps_client jobs to the parallel hosts
+
+  // load the list of hosts
+  HostTable *table = HostTableLoad (CATDIR, sky->hosts);
+
+  int i;
+  for (i = 0; i < table->Nhosts; i++) {
+
+    // ensure that the paths are absolute path names
+    char *tmppath = abspath (table->hosts[i].pathname, DVO_MAX_PATH);
+    free (table->hosts[i].pathname);
+    table->hosts[i].pathname = tmppath;
+
+    char command[1024];
+    snprintf (command, 1024, "dvopsps_client objects -hostID %d -catdir %s -hostdir %s -region %f %f %f %f", 
+	      table->hosts[i].hostID, CATDIR, table->hosts[i].pathname, 
+	      UserPatch.Rmin, UserPatch.Rmax, UserPatch.Dmin, UserPatch.Dmax);
+
+    fprintf (stderr, "command: %s\n", command);
+
+    char tmpline[1024];
+    snprintf (tmpline, 1024, "%s -dbhost %s", command, DATABASE_HOST); strcpy (command, tmpline);
+    snprintf (tmpline, 1024, "%s -dbuser %s", command, DATABASE_USER); strcpy (command, tmpline);
+    snprintf (tmpline, 1024, "%s -dbpass %s", command, DATABASE_PASS); strcpy (command, tmpline);
+    snprintf (tmpline, 1024, "%s -dbname %s", command, DATABASE_NAME); strcpy (command, tmpline);
+
+    if (VERBOSE) { snprintf (tmpline, 1024, "%s -v", command); strcpy (command, tmpline); }
+
+    if (PARALLEL_MANUAL) continue;
+
+    if (PARALLEL_SERIAL) {
+      int status = system (command);
+      if (status) {
+	fprintf (stderr, "ERROR running dvopsps_client\n");
+	exit (2);
+      }
+    } else {
+      // launch the job on the remote machine (no handshake)
+      int errorInfo = 0;
+      int pid = rconnect ("ssh", table->hosts[i].hostname, command, table->hosts[i].stdio, &errorInfo, FALSE);
+      if (!pid) {
+	if (DEBUG) fprintf (stderr, "failure to start %s (error %d)\n", table->hosts[i].hostname, errorInfo);
+	exit (1);
+      }
+      table->hosts[i].pid = pid; // save for future reference
+    }
+  }
+
+  // wait for the remote jobs to be completed
+  if (PARALLEL_MANUAL) {
+    fprintf (stderr, "run the dvopsps_client commands above.  when these are done, hit return\n");
+    getchar();
+  }
+  if (!PARALLEL_MANUAL && !PARALLEL_SERIAL) {
+    int status = HostTableWaitJobsGetIO (table, __FILE__, __LINE__, VERBOSE);
+    if (!status) return FALSE;
+  }
+
+  return (TRUE);
+}      
Index: branches/eam_branches/ipp-20121219/Ohana/src/dvopsps/src/insert_objects_dvopsps_catalog.c
===================================================================
--- branches/eam_branches/ipp-20121219/Ohana/src/dvopsps/src/insert_objects_dvopsps_catalog.c	(revision 35055)
+++ branches/eam_branches/ipp-20121219/Ohana/src/dvopsps/src/insert_objects_dvopsps_catalog.c	(revision 35055)
@@ -0,0 +1,348 @@
+# include "dvopsps.h"
+# define DEBUG 0
+
+# define MARKTIME(MSG,...) {			\
+    float dtime;				\
+    gettimeofday (&stop, (void *) NULL);	\
+    dtime = DTIME (stop, start);		\
+    fprintf (stderr, MSG, __VA_ARGS__); }
+
+int insert_objects_dvopsps_catalog (Catalog *catalog, char *basename, MYSQL *mysql) {
+
+  off_t i;
+  int missingID = 0;
+  struct timeval start, stop;
+
+  IOBuffer ave_buffer, sec_buffer;
+  ave_buffer.Nalloc = 0;
+  sec_buffer.Nalloc = 0;
+
+  Average *average = catalog->average;
+  SecFilt *secfilt = catalog->secfilt;
+  int Nsecfilt = catalog->Nsecfilt;
+
+  off_t found = 0;
+
+  char *cleanname = strcreate (basename);
+  for (i = 0; i < strlen(cleanname); i++) {
+    if (cleanname[i] == '.') cleanname[i] = '_';
+    if (cleanname[i] == '/') cleanname[i] = '_';
+  }
+  insert_objects_mysql_create_tables (cleanname, mysql);
+
+  gettimeofday (&start, (void *) NULL);
+  insert_objects_mysql_init (&ave_buffer, &sec_buffer, cleanname);
+  int Ninsert = 0;
+
+  // NOTE for testing, just do a few objects
+  if (!mysql) {
+    catalog[0].Naverage = 5;
+  }
+  for (i = 0; i < catalog[0].Naverage; i++) {
+
+    if (average[i].extID == 0) {
+      missingID ++;
+    }
+
+    // XXX check return status
+    insert_objects_mysql_value (&ave_buffer, &sec_buffer, &average[i], &secfilt[i*Nsecfilt], Nsecfilt);
+
+    // Average is a bigger table, but Nsecfilt*secfilt might be bigger, so check both
+    if ((ave_buffer.Nbuffer > MAX_BUFFER) || (sec_buffer.Nbuffer > MAX_BUFFER)) {
+      insert_objects_mysql_commit (&ave_buffer, &sec_buffer, mysql);
+      if (DEBUG) fprintf (stderr, "inserted %d rows\n", Ninsert);
+      Ninsert = 0;
+      if (0) {
+	FlushIOBuffer (&ave_buffer);
+	FlushIOBuffer (&sec_buffer);
+      } else {
+	ave_buffer.Nbuffer = 0;
+	bzero (ave_buffer.buffer, ave_buffer.Nalloc);
+	sec_buffer.Nbuffer = 0;
+	bzero (sec_buffer.buffer, sec_buffer.Nalloc);
+      }
+      insert_objects_mysql_init (&ave_buffer, &sec_buffer, cleanname);
+    }
+    Ninsert ++;
+    found ++;
+  }
+  insert_objects_mysql_commit (&ave_buffer, &sec_buffer, mysql);
+  if (VERBOSE) fprintf (stderr, "inserted %d rows\n", Ninsert);
+  FreeIOBuffer (&ave_buffer);
+  FreeIOBuffer (&sec_buffer);
+  free (cleanname);
+
+  MARKTIME("-- inserted "OFF_T_FMT" rows in %f sec, skipped %d without IDs\n", found, dtime, missingID);
+  return (TRUE);
+}
+
+int insert_objects_mysql_create_tables (char *basename, MYSQL *mysql) {
+
+  int status;
+  IOBuffer buffer;
+  InitIOBuffer (&buffer, 1024);
+  MYSQL_RES *result;
+
+  PrintIOBuffer (&buffer, "CREATE TABLE %s_cpt ("
+		 "RA FLOAT,  "          
+		 "DEC_ FLOAT,  "         
+		 "RA_ERR REAL,  "      
+		 "DEC_ERR REAL,  "     
+		 "U_RA REAL,  "        
+		 "U_DEC REAL,  "       
+		 "V_RA_ERR REAL,  "    
+		 "V_DEC_ERR REAL,  "   
+		 "PAR REAL,  "         
+		 "PAR_ERR REAL,  "     
+		 "CHISQ_POS REAL,  "   
+		 "CHISQ_PM REAL,  "    
+		 "CHISQ_PAP REAL,  "   
+		 "MEAN_EPOCH INT,  "  
+		 "TIME_RANGE INT,  "  
+		 "PSF_QF REAL, "      
+		 "PSF_QF_PERF REAL,  " 
+		 "STARGAL_SEP REAL,  " 
+		 "NUMBER_POS SMALLINT,  "  
+		 "NMEASURE SMALLINT,  "    
+		 "NMISSING SMALLINT,  "    
+		 "NEXTEND SMALLINT,  "     
+		 "OFF_MEASURE INT,  " 
+		 "OFF_MISSING INT,  " 
+		 "OFF_EXTEND INT,  "  
+		 "FLAGS INT,  "       
+		 "PHOTFLAGS_U INT,  " 
+		 "PHOTFLAGS_L INT,  " 
+		 "OBJ_ID INT,  "      
+		 "CAT_ID INT,  "      
+		 "EXT_ID BIGINT"
+		 ")\n", basename);
+
+  if (DEBUG) fprintf (stderr, "%s\n", buffer.buffer);
+  status = mysql_query(mysql, buffer.buffer); 
+  if (status) {
+    fprintf (stderr, "error with insert:\n");
+    fprintf (stderr, "%s\n", mysql_error(mysql));
+    fprintf (stderr, "Nbuffer: %d\n", buffer.Nbuffer);
+  }
+  result = mysql_store_result (mysql);
+  mysql_free_result (result);
+
+  buffer.Nbuffer = 0;
+  bzero (buffer.buffer, buffer.Nalloc);
+
+  PrintIOBuffer (&buffer, "CREATE TABLE %s_cps ("
+		 "MAG REAL,  "             
+		 "MAG_AP REAL,  "             
+		 "MAG_KRON REAL,  "        
+		 "MAG_KRON_ERR REAL,  "    
+		 "MAG_ERR REAL,  "         
+		 "MAG_CHI REAL,  "         
+		 "FLUX_PSF REAL,  "        
+		 "FLUX_PSF_ERR REAL,  "    
+		 "FLUX_KRON REAL,  "       
+		 "FLUX_KRON_ERR REAL,  "   
+		 "FLAGS INT,  "           
+		 "NCODE SMALLINT,  "           
+		 "NUSED SMALLINT,  "           
+		 "MAG_20 SMALLINT,  "          
+		 "MAG_80 SMALLINT,  "          
+		 "UBERCAL_DIST SMALLINT,  "    
+		 "MAG_STDEV SMALLINT,  "       
+		 "STACK_DETECT_ID BIGINT" 
+		 ")\n", basename);
+
+  if (DEBUG) fprintf (stderr, "%s\n", buffer.buffer);
+  status = mysql_query(mysql, buffer.buffer); 
+  if (status) {
+    fprintf (stderr, "error with insert:\n");
+    fprintf (stderr, "%s\n", mysql_error(mysql));
+    fprintf (stderr, "Nbuffer: %d\n", buffer.Nbuffer);
+  }
+  result = mysql_store_result (mysql);
+  mysql_free_result (result);
+
+  FreeIOBuffer (&buffer);
+  return TRUE;
+}
+
+int insert_objects_mysql_init (IOBuffer *ave_buffer, IOBuffer *sec_buffer, char *basename) {
+
+  if (ave_buffer->Nalloc == 0) {
+    InitIOBuffer (ave_buffer, 1024);
+  }
+
+  PrintIOBuffer (ave_buffer, "INSERT INTO %s_cpt ("
+		 "RA, "          
+		 "DEC_, "         
+		 "RA_ERR, "      
+		 "DEC_ERR, "     
+		 "U_RA, "        
+		 "U_DEC, "       
+		 "V_RA_ERR, "    
+		 "V_DEC_ERR, "   
+		 "PAR, "         
+		 "PAR_ERR, "     
+		 "CHISQ_POS, "   
+		 "CHISQ_PM, "    
+		 "CHISQ_PAP, "   
+		 "MEAN_EPOCH, "  
+		 "TIME_RANGE, "  
+		 "PSF_QF, "      
+		 "PSF_QF_PERF, " 
+		 "STARGAL_SEP, " 
+		 "NUMBER_POS, "  
+		 "NMEASURE, "    
+		 "NMISSING, "    
+		 "NEXTEND, "     
+		 "OFF_MEASURE, " 
+		 "OFF_MISSING, " 
+		 "OFF_EXTEND, "  
+		 "FLAGS, "       
+		 "PHOTFLAGS_U, " 
+		 "PHOTFLAGS_L, " 
+		 "OBJ_ID, "      
+		 "CAT_ID, "      
+		 "EXT_ID"
+		 ") VALUES \n", basename);
+
+  if (sec_buffer->Nalloc == 0) {
+    InitIOBuffer (sec_buffer, 1024);
+  }
+
+  PrintIOBuffer (sec_buffer, "INSERT INTO %s_cps ("
+		 "MAG, "             
+		 "MAG_AP, "             
+		 "MAG_KRON, "        
+		 "MAG_KRON_ERR, "    
+		 "MAG_ERR, "         
+		 "MAG_CHI, "         
+		 "FLUX_PSF, "        
+		 "FLUX_PSF_ERR, "    
+		 "FLUX_KRON, "       
+		 "FLUX_KRON_ERR, "   
+		 "FLAGS, "           
+		 "NCODE, "           
+		 "NUSED, "           
+		 "MAG_20, "          
+		 "MAG_80, "          
+		 "UBERCAL_DIST, "    
+		 "MAG_STDEV, "       
+		 "STACK_DETECT_ID " 
+		 ") VALUES \n", basename);
+  return TRUE;
+}
+
+int insert_objects_mysql_value (IOBuffer *ave_buffer, IOBuffer *sec_buffer, Average *average, SecFilt *secfilt, int Nsecfilt) {
+
+  int i;
+
+// XXX this bit could/should be autocoded...
+  PrintIOBuffer (ave_buffer, " (");
+  if (isnan(average->R))              PrintIOBuffer (ave_buffer, "NULL, "); else PrintIOBuffer (ave_buffer, "%lf, ", average->R);              
+  if (isnan(average->D))              PrintIOBuffer (ave_buffer, "NULL, "); else PrintIOBuffer (ave_buffer, "%lf, ", average->D);               
+  if (isnan(average->dR))             PrintIOBuffer (ave_buffer, "NULL, "); else PrintIOBuffer (ave_buffer, "%f, ",  average->dR);             
+  if (isnan(average->dD))             PrintIOBuffer (ave_buffer, "NULL, "); else PrintIOBuffer (ave_buffer, "%f, ",  average->dD);             
+  if (isnan(average->uR))             PrintIOBuffer (ave_buffer, "NULL, "); else PrintIOBuffer (ave_buffer, "%f, ",  average->uR);             
+  if (isnan(average->uD))             PrintIOBuffer (ave_buffer, "NULL, "); else PrintIOBuffer (ave_buffer, "%f, ",  average->uD);             
+  if (isnan(average->duR))            PrintIOBuffer (ave_buffer, "NULL, "); else PrintIOBuffer (ave_buffer, "%f, ",  average->duR);            
+  if (isnan(average->duD))            PrintIOBuffer (ave_buffer, "NULL, "); else PrintIOBuffer (ave_buffer, "%f, ",  average->duD);            
+  if (isnan(average->P))              PrintIOBuffer (ave_buffer, "NULL, "); else PrintIOBuffer (ave_buffer, "%f, ",  average->P);              
+  if (isnan(average->dP))             PrintIOBuffer (ave_buffer, "NULL, "); else PrintIOBuffer (ave_buffer, "%f, ",  average->dP);             
+  if (isnan(average->ChiSqAve))       PrintIOBuffer (ave_buffer, "NULL, "); else PrintIOBuffer (ave_buffer, "%f, ",  average->ChiSqAve);       
+  if (isnan(average->ChiSqPM))        PrintIOBuffer (ave_buffer, "NULL, "); else PrintIOBuffer (ave_buffer, "%f, ",  average->ChiSqPM);        
+  if (isnan(average->ChiSqPar))       PrintIOBuffer (ave_buffer, "NULL, "); else PrintIOBuffer (ave_buffer, "%f, ",  average->ChiSqPar);       
+  PrintIOBuffer (ave_buffer, "%d, ",  average->Tmean);          
+  PrintIOBuffer (ave_buffer, "%d, ",  average->Trange);         
+  if (isnan(average->psfQF))          PrintIOBuffer (ave_buffer, "NULL, "); else PrintIOBuffer (ave_buffer, "%f, ",  average->psfQF);          
+  if (isnan(average->psfQFperf))      PrintIOBuffer (ave_buffer, "NULL, "); else PrintIOBuffer (ave_buffer, "%f, ",  average->psfQFperf);      
+  if (isnan(average->stargal))        PrintIOBuffer (ave_buffer, "NULL, "); else PrintIOBuffer (ave_buffer, "%f, ",  average->stargal);        
+  PrintIOBuffer (ave_buffer, "%hu, ", average->Npos);           
+  PrintIOBuffer (ave_buffer, "%hu, ", average->Nmeasure);       
+  PrintIOBuffer (ave_buffer, "%hu, ", average->Nmissing);       
+  PrintIOBuffer (ave_buffer, "%hu, ", average->Nextend);        
+  PrintIOBuffer (ave_buffer, "%d, ",  average->measureOffset);  
+  PrintIOBuffer (ave_buffer, "%d, ",  average->missingOffset);  
+  PrintIOBuffer (ave_buffer, "%d, ",  average->extendOffset);   
+  PrintIOBuffer (ave_buffer, "%u, ",  average->flags);          
+  PrintIOBuffer (ave_buffer, "%u, ",  average->photFlagsUpper); 
+  PrintIOBuffer (ave_buffer, "%u, ",  average->photFlagsLower); 
+  PrintIOBuffer (ave_buffer, "%u, ",  average->objID);          
+  PrintIOBuffer (ave_buffer, "%u, ",  average->catID);          
+  PrintIOBuffer (ave_buffer, "%lu",   average->extID);          
+  PrintIOBuffer (ave_buffer, "),\n");
+
+// XXX this bit could/should be autocoded...
+  for (i = 0; i < Nsecfilt; i++) {
+    PrintIOBuffer (sec_buffer, " (");
+    if (isnan(secfilt->M))         PrintIOBuffer (sec_buffer, "NULL, "); else PrintIOBuffer (sec_buffer, "%f, ", secfilt->M);           
+    if (isnan(secfilt->Map))       PrintIOBuffer (sec_buffer, "NULL, "); else PrintIOBuffer (sec_buffer, "%f, ", secfilt->Map);         
+    if (isnan(secfilt->Mkron))     PrintIOBuffer (sec_buffer, "NULL, "); else PrintIOBuffer (sec_buffer, "%f, ", secfilt->Mkron);       
+    if (isnan(secfilt->dMkron))    PrintIOBuffer (sec_buffer, "NULL, "); else PrintIOBuffer (sec_buffer, "%f, ", secfilt->dMkron);      
+    if (isnan(secfilt->dM))        PrintIOBuffer (sec_buffer, "NULL, "); else PrintIOBuffer (sec_buffer, "%f, ", secfilt->dM);          
+    if (isnan(secfilt->Xm))        PrintIOBuffer (sec_buffer, "NULL, "); else PrintIOBuffer (sec_buffer, "%f, ", secfilt->Xm);          
+    if (isnan(secfilt->FluxPSF))   PrintIOBuffer (sec_buffer, "NULL, "); else PrintIOBuffer (sec_buffer, "%f, ", secfilt->FluxPSF);     
+    if (isnan(secfilt->dFluxPSF))  PrintIOBuffer (sec_buffer, "NULL, "); else PrintIOBuffer (sec_buffer, "%f, ", secfilt->dFluxPSF);    
+    if (isnan(secfilt->FluxKron))  PrintIOBuffer (sec_buffer, "NULL, "); else PrintIOBuffer (sec_buffer, "%f, ", secfilt->FluxKron);    
+    if (isnan(secfilt->dFluxKron)) PrintIOBuffer (sec_buffer, "NULL, "); else PrintIOBuffer (sec_buffer, "%f, ", secfilt->dFluxKron);   
+    PrintIOBuffer (sec_buffer, "%u,  ", secfilt->flags);       
+    PrintIOBuffer (sec_buffer, "%hd, ", secfilt->Ncode);        
+    PrintIOBuffer (sec_buffer, "%hd, ", secfilt->Nused);        
+    PrintIOBuffer (sec_buffer, "%hd, ", secfilt->M_20);         
+    PrintIOBuffer (sec_buffer, "%hd, ", secfilt->M_80);         
+    PrintIOBuffer (sec_buffer, "%hd, ", secfilt->ubercalDist);  
+    PrintIOBuffer (sec_buffer, "%hd, ", secfilt->Mstdev);       
+    PrintIOBuffer (sec_buffer, "%lu  ", secfilt->stackDetectID);
+    PrintIOBuffer (sec_buffer, "),\n");
+    secfilt ++;
+  }
+  return TRUE;
+}
+    
+int insert_objects_mysql_commit (IOBuffer *ave_buffer, IOBuffer *sec_buffer, MYSQL *mysql) {
+
+  MYSQL_RES *result;
+
+  // check that the last two chars are ,\n and replace with ;\n
+  if (!strcmp(&ave_buffer->buffer[ave_buffer->Nbuffer-2], ",\n")) {
+    ave_buffer->buffer[ave_buffer->Nbuffer-2] = ';';
+  } else {
+    fprintf (stderr, "invalid sql?\n");
+    return FALSE;
+  }
+
+  // check that the last two chars are ,\n and replace with ;\n
+  if (!strcmp(&sec_buffer->buffer[sec_buffer->Nbuffer-2], ",\n")) {
+    sec_buffer->buffer[sec_buffer->Nbuffer-2] = ';';
+  } else {
+    fprintf (stderr, "invalid sql?\n");
+    return FALSE;
+  }
+
+  // XXX check return status
+  if (mysql) {
+    int status;
+    if (DEBUG) fprintf (stderr, "%s\n", ave_buffer->buffer);
+    status = mysql_query(mysql, ave_buffer->buffer); 
+    if (status) {
+      fprintf (stderr, "error with insert:\n");
+      fprintf (stderr, "%s\n", mysql_error(mysql));
+      fprintf (stderr, "Nbuffer: %d\n", ave_buffer->Nbuffer);
+    }
+    result = mysql_store_result (mysql);
+    mysql_free_result (result);
+
+    if (DEBUG) fprintf (stderr, "%s\n", sec_buffer->buffer);
+    status = mysql_query(mysql, sec_buffer->buffer); 
+    if (status) {
+      fprintf (stderr, "error with insert:\n");
+      fprintf (stderr, "%s\n", mysql_error(mysql));
+      fprintf (stderr, "Nbuffer: %d\n", sec_buffer->Nbuffer);
+    }
+    result = mysql_store_result (mysql);
+    mysql_free_result (result);
+  } else {
+    fprintf (stderr, "%s\n", sec_buffer->buffer);
+  }
+
+  return TRUE;
+}
