Index: /trunk/Ohana/src/addstar/src/addstar.c
===================================================================
--- /trunk/Ohana/src/addstar/src/addstar.c	(revision 4853)
+++ /trunk/Ohana/src/addstar/src/addstar.c	(revision 4854)
@@ -24,4 +24,5 @@
   if (SKYPROBE) load_subpix ();
 
+  /* we use the image table to lock db access */
   lock_image_db ();
 
Index: /trunk/Ohana/src/addstar/src/gimages.c
===================================================================
--- /trunk/Ohana/src/addstar/src/gimages.c	(revision 4853)
+++ /trunk/Ohana/src/addstar/src/gimages.c	(revision 4854)
@@ -9,5 +9,4 @@
   Image *timage, *pimage;
   Coords tcoords;
-  Header header;
   double r, d;
   double Xi[5], Yi[5], Xo[5], Yo[5];  /* image and original corners */
@@ -15,11 +14,13 @@
   struct stat filestatus;
   FILE *f;
-  
+
+  FITS_DB *db;
+
   /* if image.db is opened successfully, f will not be NULL.
      if image.db is empty, dbstate will be LCK_EMPTY 
      if image.db is not locked & opened successfully, we will not reach here!
   */
-  f = GetDB (&dbstate);
-  if (dbstate == LCK_EMPTY) {
+  db = GetDB ();
+  if (db[0].dbstate == LCK_EMPTY) {
     *Npimage = 0;
     return (NULL);
@@ -27,10 +28,11 @@
   fseek (f, 0, SEEK_SET);
 
-  /* read header */
-  if (!fits_load_header (f, &header)) {
+  if (!dvo_image_load (db, TRUE)) {
     Shutdown ("can't read image catalog %s", ImageCat);
   }
+  timage = fits_table_get_Image (&db.ftable, &Ntimage);
+  /* timage represents the complete image table */
 
-  fits_scan (&header, "ZERO_PT", "%lf", 1, &zeropt);
+  fits_scan (&db[0].header, "ZERO_PT", "%lf", 1, &zeropt);
   if (fabs (ZeroPt - zeropt) > 1e-4) {
     Shutdown ("zero point in image (%f:%s) inconsistent with zero point in catalog (%f)",
@@ -70,71 +72,43 @@
   }
   
-  /* advance to data segment */ 
-  fseek (f, header.size, SEEK_SET); 
-
-  Nimage = 0;
-  fits_scan (&header, "NIMAGES", "%d", 1, &Nimage);
-  /* check that file size makes sense */
-  if (stat (ImageCat, &filestatus) == -1) {
-    Shutdown ("failed to get status of image catalog");
-  }
-  size = Nimage*sizeof(Image) + header.size;
-  if (size != filestatus.st_size) {
-    int Ndata;
-
-    Ndata = (filestatus.st_size - header.size) / sizeof (Image);
-    fprintf (stderr, "error: image catalog has inconsistent size\n");
-    fprintf (stderr, "header: %d images, data: %d images\n", Nimage, Ndata);
-    if (!FORCE_READ) Shutdown ("refuse to read image table");
-
-    Nimage = MIN (Nimage, Ndata);
-    fprintf (stderr, "using %d images\n", Nimage);
-  } 
-
-  /* kind of dangerous, see note below */
-  NTIMAGE = MAX (MIN (Nimage, 1000), 1);
-  ALLOCATE (timage, Image, NTIMAGE);
-
+  /* pimage represents the subset of overlapping images */
   npimage = 0;
   NPIMAGE = 20;
   ALLOCATE (pimage, Image, NPIMAGE);
 
-  /* run through image table, reading images in blocks */
-  for (Ntimage = 0; Ntimage < Nimage; Ntimage += ntimage) {
-    ntimage = Fread (timage, sizeof(Image), NTIMAGE, f, "image");
-    if (ntimage == 0) Shutdown ("expected %d images, only found %d", Nimage, Ntimage);
-    BuildChipMatch (timage, ntimage);
+  /* setup links for mosaic WRP and DIS entries */
+  BuildChipMatch (timage, Ntimage);
 
-    for (i = 0; i < ntimage; i++) {
+  /* run through image table and search for overlaps */
+  for (i = 0; i < Ntimage; i++) {
 
-      /* if any of these images are WRP images, need to find matching DIS */
-      if (!FindMosaicForImage (timage, ntimage, i)) continue;
+    /* if any of these images are WRP images, need to find matching DIS */
+    if (!FindMosaicForImage (timage, Ntimage, i)) continue;
 
-      addtolist = FALSE;
-      /* define image corners */
-      Xi[0] = 0;            Yi[0] = 0;
-      Xi[1] = timage[i].NX; Yi[1] = 0;
-      Xi[2] = timage[i].NX; Yi[2] = timage[i].NY;
-      Xi[3] = 0;            Yi[3] = timage[i].NY;
-      Xi[4] = 0;            Yi[4] = 0;  /* so we can make a loop easily */
-      /* transform to tcoords */
-      for (j = 0; j < 5; j++) {
-	XY_to_RD (&r, &d, Xi[j], Yi[j], &timage[i].coords);
-	RD_to_XY (&Xi[j], &Yi[j], r, d, &tcoords);
+    addtolist = FALSE;
+    /* define image corners */
+    Xi[0] = 0;            Yi[0] = 0;
+    Xi[1] = timage[i].NX; Yi[1] = 0;
+    Xi[2] = timage[i].NX; Yi[2] = timage[i].NY;
+    Xi[3] = 0;            Yi[3] = timage[i].NY;
+    Xi[4] = 0;            Yi[4] = 0;  /* so we can make a loop easily */
+    /* transform to tcoords */
+    for (j = 0; j < 5; j++) {
+      XY_to_RD (&r, &d, Xi[j], Yi[j], &timage[i].coords);
+      RD_to_XY (&Xi[j], &Yi[j], r, d, &tcoords);
+    }
+    /* check if any edges cross */
+    /* not every robust - images must be close in size */
+    for (j = 0; (j < 4) && !addtolist; j++) {
+      for (k = 0; (k < 4) && !addtolist; k++) {
+	addtolist |= edge_check (&Xi[j], &Yi[j], &Xo[k], &Yo[k]);
       }
-      /* check if any edges cross */
-      /* not every robust - images must be close in size */
-      for (j = 0; (j < 4) && !addtolist; j++) {
-	for (k = 0; (k < 4) && !addtolist; k++) {
-	  addtolist |= edge_check (&Xi[j], &Yi[j], &Xo[k], &Yo[k]);
-	}
-      }
-      if (addtolist) {
-	pimage[npimage] = timage[i];
-	npimage ++;
-	if (npimage == NPIMAGE) {
-	  NPIMAGE += 20;
-	  REALLOCATE (pimage, Image, NPIMAGE);
-	}
+    }
+    if (addtolist) {
+      pimage[npimage] = timage[i];
+      npimage ++;
+      if (npimage == NPIMAGE) {
+	NPIMAGE += 20;
+	REALLOCATE (pimage, Image, NPIMAGE);
       }
     }
@@ -147,5 +121,4 @@
   *Npimage = npimage;
   return (pimage);
-
 }
   
@@ -158,3 +131,7 @@
 
    we are not adding the matching DIS image to the table.
+
+   we are now loading in the entire image db table into memory.  
+
+   we will need to write out the new image with a vtable.
 */
Index: /trunk/Ohana/src/addstar/src/image-db.c
===================================================================
--- /trunk/Ohana/src/addstar/src/image-db.c	(revision 4853)
+++ /trunk/Ohana/src/addstar/src/image-db.c	(revision 4854)
@@ -4,10 +4,40 @@
 
 /* file-pointer to Image.db table. if image db does not yet exist */
-static FILE *f = (FILE *) NULL;
-static int dbstate = LCK_UNLOCK;
+static FITS_DB db;
 
-FILE *GetDB (int *state) {
-  *state = dbstate;
-  return (f);
+FITS_DB *GetDB () {
+  return (&db);
+}
+
+void lock_image_db () {
+  /* lock the image catalog */
+  check_permissions (ImageCat);
+
+  db.lockstate = LCK_XCLD;
+  db.timeout   = 3600.0;
+  fits_db_init (&db);
+
+  if (!fits_db_lock (&db, ImageCat)) {
+    fprintf (stderr, "ERROR: can't lock image catalog\n");
+    exit (1);
+  }
+}
+
+void unlock_image_db (Image *image) {
+
+  mode_t mode;
+
+  /* protect wimage from interrupt signals */
+  if (MODE == M_IMAGE) {
+    SetProtect (TRUE);
+    wimage (image); 
+    SetProtect (FALSE);
+  }
+
+  fits_db_close (&db);
+
+  /* force permissions to 666 */
+  mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH;
+  chmod (ImageCat, mode);
 }
 
@@ -27,33 +57,6 @@
 
   SetProtect (TRUE);
-  fclearlockfile (ImageCat, f, LOCK, &dbstate);
+  fits_db_close (&db);
   fprintf (stderr, "ERROR: addstar halted\n");
   exit (1);
 }
-
-void lock_image_db () {
-  /* lock the image catalog */
-  check_permissions (ImageCat);
-  f = fsetlockfile (ImageCat, 3600.0, LOCK, &dbstate);
-  if (f == NULL) {
-    fprintf (stderr, "ERROR: can't lock image catalog\n");
-    exit (1);
-  }
-  fseek (f, 0, SEEK_SET);
-}
-
-void unlock_image_db (Image *image) {
-
-  mode_t mode;
-
-  /* protect wimage from interrupt signals */
-  if (MODE == M_IMAGE) {
-    SetProtect (TRUE);
-    wimage (image); 
-    SetProtect (FALSE);
-  }
-
-  fclearlockfile (ImageCat, f, LOCK, &dbstate);
-  mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH;
-  chmod (ImageCat, mode);
-}
Index: /trunk/Ohana/src/addstar/src/wimage.c
===================================================================
--- /trunk/Ohana/src/addstar/src/wimage.c	(revision 4853)
+++ /trunk/Ohana/src/addstar/src/wimage.c	(revision 4854)
@@ -1,5 +1,5 @@
 # include "addstar.h"
 
-/* add image to image db */
+/* add 1 image to image db */
 void wimage (Image *image) {
   
@@ -8,5 +8,5 @@
   Header header;
 
-  f = GetDB (&dbstate);
+  db = GetDB ();
   fseek (f, 0, SEEK_SET);
 
Index: /trunk/Ohana/src/imregister/src/imphotsearch.c
===================================================================
--- /trunk/Ohana/src/imregister/src/imphotsearch.c	(revision 4853)
+++ /trunk/Ohana/src/imregister/src/imphotsearch.c	(revision 4854)
@@ -2,5 +2,5 @@
 # include "imphot.h"
 
-static char *version = "imphotsearch $Revision: 1.7 $";
+static char *version = "imphotsearch $Revision: 1.8 $";
 
 int main (int argc, char **argv) {
@@ -18,4 +18,5 @@
   fits_db_init (&db);
 
+  /* don't create a new image table if not available */
   if (!fits_db_lock (&db, ImPhotDB)) {
     fprintf (stderr, "ERROR: failure to lock db\n");
@@ -24,5 +25,5 @@
   }
   /* we use a varient of fits_db_load since the file may be in text format */
-  if (!db_load (&db)) {
+  if (!dvo_image_load (&db)) {
     fprintf (stderr, "ERROR: failure to load db\n");
     fits_db_close (&db);
Index: /trunk/Ohana/src/libohana/src/dvo_image.c
===================================================================
--- /trunk/Ohana/src/libohana/src/dvo_image.c	(revision 4853)
+++ /trunk/Ohana/src/libohana/src/dvo_image.c	(revision 4854)
@@ -2,6 +2,7 @@
 # include <dvo.h>
 
-enum {FITS, TEXT};
+enum {FITS, RAW};
 
+/** this is a varient on fits_db_load to handle the RAW mode */
 int dvo_image_load (FITS_DB *db, int VERBOSE) {
 
Index: /trunk/Ohana/src/opihi/dvo/LoadImages.c
===================================================================
--- /trunk/Ohana/src/opihi/dvo/LoadImages.c	(revision 4853)
+++ /trunk/Ohana/src/opihi/dvo/LoadImages.c	(revision 4854)
@@ -4,45 +4,19 @@
 
   char filename[256];
-  int Nimage, NIMAGE;
-  FILE *f;
-  Header header;
   Image *image;
+  FITS_DB db;
   
   VarConfig ("IMAGE_CATALOG", "%s", filename);
 
-  *nimage = 0;
-  NIMAGE = 0;
-  Nimage = 0;
-  image  = NULL;
-
-  /* check if image datafile exists, get header */
-  if (!fits_read_header (filename, &header)) {
+  fits_db_init (&db);
+  if (!fits_db_lock (&db, filename)) {
     fprintf (stderr, "No available image catalog %s (1)\n", filename);
     return (NULL);
   }
 
-  fits_scan (&header, "NIMAGES", "%d", 1, &NIMAGE);
-  if (NIMAGE == 0) {
-    fprintf (stderr, "no images found\n");
-    return (NULL);
-  }
+  dvo_image_load (&db, TRUE);
+  fits_db_close (&db);
 
-  /* get ready to read data on images */ 
-  f = fopen (filename, "r");
-  if (f == (FILE *) NULL) {
-    fprintf (stderr, "No available image catalog: %s (2)\n", filename);
-    free (header.buffer);
-    return (NULL);
-  }
-
-  ALLOCATE (image, Image, NIMAGE);
-  fseek (f, header.size, SEEK_SET); 
-  Nimage = Fread (image, sizeof(Image), NIMAGE, f, "image");
-  if (Nimage != NIMAGE) {
-    fprintf (stderr, "failed to read in all images (%d of %d)\n", Nimage, NIMAGE);
-  }
-
-  fclose (f);
-  *nimage = Nimage;
+  image = fits_table_get_Image (&db.ftable, nimage);
   return (image);
 }
