Index: branches/eam_branches/ipp-20120805/Ohana/src/libdvo/include/dvo.h
===================================================================
--- branches/eam_branches/ipp-20120805/Ohana/src/libdvo/include/dvo.h	(revision 34383)
+++ branches/eam_branches/ipp-20120805/Ohana/src/libdvo/include/dvo.h	(revision 34388)
@@ -623,4 +623,5 @@
 int dvo_image_save_raw (FITS_DB *db, int VERBOSE);
 int dvo_image_addrows (FITS_DB *db, Image *new, off_t Nnew);
+int dvo_image_createID (Header *header);
 void dvo_image_create (FITS_DB *db, double ZeroPoint);
 
Index: branches/eam_branches/ipp-20120805/Ohana/src/libdvo/src/dvo_image.c
===================================================================
--- branches/eam_branches/ipp-20120805/Ohana/src/libdvo/src/dvo_image.c	(revision 34383)
+++ branches/eam_branches/ipp-20120805/Ohana/src/libdvo/src/dvo_image.c	(revision 34388)
@@ -200,4 +200,6 @@
   gfits_modify (&db[0].header, "NIMAGES", "%d", 1, 0);
   gfits_modify (&db[0].header, "ZERO_PT", "%lf", 1, ZeroPoint);
+  
+  dvo_image_createID (&db[0].header);
 
   if (db[0].format == DVO_FORMAT_INTERNAL)  	  gfits_modify (&db[0].header, "FORMAT", "%s", 1, "INTERNAL");
@@ -217,2 +219,45 @@
   return;
 }
+
+// given a dvo image db, add an ID to the header
+int dvo_image_createID (Header *header) {
+  
+  char dbID[33];
+
+  if (!header->buffer) return FALSE;
+
+  int status = gfits_scan (header, "DVO_DBID", "%s", 1, dbID);      
+  if (status) {
+    // do not add a DVO_DBID to a table which already has one
+    return TRUE;
+  }
+
+  // I have a header, I want to add ONE line.  double check there is enough space
+  char *p = gfits_header_field (header, "END", 1);
+  if (p == NULL) {
+    fprintf (stderr, "header is missing END\n");
+    return FALSE;
+  }
+  if (p - header->buffer + 80 == header->datasize) {
+    fprintf (stderr, "no free space in block, can't insert keyword\n");
+    return FALSE;
+  }
+
+  int start_size = header->datasize;
+
+  long A = time(NULL);
+  srand48(A);
+  
+  int i;
+  for (i = 0; i < 32; i++) {
+    sprintf (&dbID[i], "%1x", (int)(16.0*drand48()));
+  }
+
+  gfits_modify (header, "DVO_DBID", "%s", 1, dbID);      
+  if (start_size != header->datasize) {
+    fprintf (stderr, "error: header buffer grew? (%d to %d bytes)\n", (int) start_size, (int) header->datasize);
+    return FALSE;
+  }
+  return TRUE;
+}
+
