Index: /trunk/ippTools/src/Makefile.am
===================================================================
--- /trunk/ippTools/src/Makefile.am	(revision 6256)
+++ /trunk/ippTools/src/Makefile.am	(revision 6257)
@@ -1,3 +1,3 @@
-bin_PROGRAMS = p2search pxadmin
+bin_PROGRAMS = pxadmin p0search p2search 
 
 include_HEADERS = pxtools.h
@@ -8,5 +8,4 @@
 libpxtools_la_SOURCES   = \
     p2searchDoneFrames.c \
-    pxalloc.c \
     p2insertPendingFrames.c \
     p2pendingToDone.c \
@@ -22,4 +21,10 @@
 AM_CPPFLAGS = -I$(top_srcdir)/src$
 
+p0search_CFLAGS = $(PSLIB_CFLAGS) $(PSMODULES_CFLAGS) $(METADATADB_CFLAGS) $(pxtools_CFLAGS)
+p0search_LDADD = $(PSLIB_LIBS) $(PSMODULES_LIBS) $(METADATADB_LIBS) $(top_builddir)/src/libpxtools.la
+p0search_SOURCES = \
+    p0search.c \
+    p0searchConfig.c
+
 p2search_CFLAGS = $(PSLIB_CFLAGS) $(PSMODULES_CFLAGS) $(METADATADB_CFLAGS) $(pxtools_CFLAGS)
 p2search_LDADD = $(PSLIB_LIBS) $(PSMODULES_LIBS) $(METADATADB_LIBS) $(top_builddir)/src/libpxtools.la
@@ -27,4 +32,5 @@
     p2search.c \
     p2searchConfig.c
+
 pxadmin_CFLAGS = $(PSLIB_CFLAGS) $(PSMODULES_CFLAGS) $(METADATADB_CFLAGS) $(pxtools_CFLAGS)
 pxadmin_LDADD = $(PSLIB_LIBS) $(PSMODULES_LIBS) $(METADATADB_LIBS) $(top_builddir)/src/libpxtools.la
Index: unk/ippTools/src/pxalloc.c
===================================================================
--- /trunk/ippTools/src/pxalloc.c	(revision 6256)
+++ 	(revision )
@@ -1,88 +1,0 @@
-#include "pxtools.h"
-
-static void rawScienceFrameFree(rawScienceFrame *ptr);
-static void p2PendingFrameFree(p2PendingFrame *ptr);
-static void p2DoneFrameFree(p2DoneFrame *ptr);
-
-rawScienceFrame *rawScienceFrameAlloc(
-    rawScienceExpRow *exposure,
-    psArray *images
-)
-{
-    rawScienceFrame *frame;
-
-    PS_ASSERT_PTR_NON_NULL(exposure, NULL);
-    PS_ASSERT_PTR_NON_NULL(images, NULL);
-
-    frame = psAlloc(sizeof(rawScienceFrame));
-    psMemSetDeallocator(frame, (psFreeFunc)rawScienceFrameFree);
-
-    frame->exposure = exposure;
-    frame->images   = images;
-
-    return frame;
-}
-
-static void rawScienceFrameFree(rawScienceFrame *ptr)
-{
-    psFree(ptr->exposure);
-    psFree(ptr->images);
-}
-
-p2PendingFrame *p2PendingFrameAlloc(
-    p2PendingExpRow *exposure,
-    psArray *images
-)
-{
-    p2PendingFrame *frame;
-
-    PS_ASSERT_PTR_NON_NULL(exposure, NULL);
-    PS_ASSERT_PTR_NON_NULL(images, NULL);
-
-    frame = psAlloc(sizeof(p2PendingFrame));
-    psMemSetDeallocator(frame, (psFreeFunc)p2PendingFrameFree);
-
-    frame->exposure = exposure;
-    frame->images   = images;
-
-    return frame;
-}
-
-static void p2PendingFrameFree(p2PendingFrame *ptr)
-{
-    psFree(ptr->exposure);
-    psFree(ptr->images);
-}
-
-p2DoneFrame *p2DoneFrameAlloc(
-    p2DoneExpRow *exposure,
-    psArray *images
-)
-{
-    p2DoneFrame *frame;
-
-    PS_ASSERT_PTR_NON_NULL(exposure, NULL);
-    PS_ASSERT_PTR_NON_NULL(images, NULL);
-
-    frame = psAlloc(sizeof(p2DoneFrame));
-    psMemSetDeallocator(frame, (psFreeFunc)p2DoneFrameFree);
-
-    frame->exposure = exposure;
-    frame->images   = images;
-
-    return frame;
-}
-
-static void p2DoneFrameFree(p2DoneFrame *ptr)
-{
-    psFree(ptr->exposure);
-    psFree(ptr->images);
-}
-
-bool psTimeIsZero(psTime *time) {
-    if (time->sec == 0 || time->nsec == 0) {
-        return false;
-    }
-
-    return true;
-}
Index: /trunk/ippTools/src/pxframes.c
===================================================================
--- /trunk/ippTools/src/pxframes.c	(revision 6256)
+++ /trunk/ippTools/src/pxframes.c	(revision 6257)
@@ -2,4 +2,38 @@
 
 #include "pxtools.h"
+
+#define PX_FRAME_ALLOC(frametype, exptype) \
+ \
+static void frametype##Free(frametype *ptr);\
+ \
+frametype *frametype##Alloc( \
+    exptype##Row *exposure, \
+    psArray *images \
+) \
+{ \
+    frametype *frame; \
+ \
+    PS_ASSERT_PTR_NON_NULL(exposure, NULL); \
+    PS_ASSERT_PTR_NON_NULL(images, NULL); \
+ \
+    frame = psAlloc(sizeof(frametype)); \
+    psMemSetDeallocator(frame, (psFreeFunc)frametype##Free); \
+ \
+    frame->exposure = exposure; \
+    frame->images   = images; \
+ \
+    return frame; \
+} \
+ \
+static void frametype##Free(frametype *ptr) \
+{ \
+    psFree(ptr->exposure); \
+    psFree(ptr->images); \
+}
+
+PX_FRAME_ALLOC(newFrame, newExp);
+PX_FRAME_ALLOC(rawScienceFrame, rawScienceExp);
+PX_FRAME_ALLOC(p2PendingFrame, p2PendingExp);
+PX_FRAME_ALLOC(p2DoneFrame, p2DoneExp);
 
 #define PX_FRAME_PRINT(frametype, imfiletype) \
@@ -35,2 +69,43 @@
 PX_FRAME_PRINT(rawScienceFrame, rawImfile);
 PX_FRAME_PRINT(p2PendingFrame, p2PendingImfile);
+
+
+#define PX_FRAME_SEARCH(frametype, exptype, imfiletype) \
+psArray *frametype##Search(pxConfig *config) \
+{ \
+    PS_ASSERT_PTR_NON_NULL(config, NULL); \
+ \
+    psArray *exposures = exptype##SelectRowObjects(config->database, \
+        config->where, MAX_ROWS); \
+    if (!exposures) { \
+        psError(PS_ERR_UNKNOWN, false, "no exptype rows found"); \
+ \
+        return NULL; \
+    } \
+ \
+    psArray *allFrames = psArrayAlloc(exposures->n); \
+    allFrames->n = 0; \
+ \
+    psMetadata *where = psMetadataAlloc (); \
+    for (int i = 0; i < exposures->n; i++) { \
+        exptype##Row *exposure = exposures->data[i]; \
+\
+        psMetadataAddStr(where, PS_LIST_TAIL, "exp_id", PS_META_REPLACE, "==", \
+            exposure->exp_id); \
+ \
+        psArray *images = imfiletype##SelectRowObjects(config->database, where, \
+            MAX_ROWS); \
+        if (!images) { \
+            psError(PS_ERR_UNKNOWN, false, "database access failed"); \
+ \
+            return NULL; \
+        } \
+ \
+        frametype *frame = frametype##Alloc(exposure, images); \
+        psArrayAdd(allFrames, 100, frame); \
+    } \
+ \
+    return allFrames; \
+} 
+
+PX_FRAME_SEARCH(newFrame, newExp, newImfile);
