Index: /trunk/glueforge/glueforge.in
===================================================================
--- /trunk/glueforge/glueforge.in	(revision 4146)
+++ /trunk/glueforge/glueforge.in	(revision 4147)
@@ -3,5 +3,5 @@
 # Copyright (C) 2005  Joshua Hoblitt
 #
-# $Id: glueforge.in,v 1.15 2005-05-21 00:37:43 jhoblitt Exp $
+# $Id: glueforge.in,v 1.16 2005-06-08 03:38:37 jhoblitt Exp $
 
 use strict;
@@ -99,4 +99,5 @@
     'droptable_c.tt'        => "$output/tests/droptable.c",
     'insert_c.tt'           => "$output/tests/insert.c",
+    'popobject_c.tt'        => "$output/tests/popobject.c",
 );
 
Index: /trunk/glueforge/templates/psdb/code.tt
===================================================================
--- /trunk/glueforge/templates/psdb/code.tt	(revision 4146)
+++ /trunk/glueforge/templates/psdb/code.tt	(revision 4147)
@@ -16,2 +16,4 @@
 
 [% INCLUDE insertobject.tt %]
+
+[% INCLUDE popobject.tt %]
Index: /trunk/glueforge/templates/psdb/popobject.tt
===================================================================
--- /trunk/glueforge/templates/psdb/popobject.tt	(revision 4147)
+++ /trunk/glueforge/templates/psdb/popobject.tt	(revision 4147)
@@ -0,0 +1,48 @@
+[% USE format -%]
+[% indented = format('%-15s %s') -%]
+[% object_name %] *[% namespace %]PopObject(psDB *dbh)
+{
+    psArray         *rowSet;
+    psMetadata      *row;
+    psMetadata      *popped;
+    long            deleted;
+    bool            status;
+    int             rowID;
+    [% indented(object_name, "*object") %];
+
+    rowSet = psDBSelectRows(dbh, [% namespace FILTER upper %]_TABLE_NAME, NULL, 1);
+    row = psArrayGet(rowSet, 0);
+    if (!row) {
+        // psError(); error or table is empty
+        return NULL;
+    }
+
+    rowID = psMetadataLookupS32(&status, row, "position");
+    if (!status) {
+        // psError(); something bad happened
+        return NULL;
+    }
+
+    popped = psMetadataAlloc();
+    psMetadataAddS32(popped, PS_LIST_TAIL, "position", NULL, rowID);
+
+    deleted = psDBDeleteRows(dbh, [% namespace FILTER upper %]_TABLE_NAME, popped);
+    if (deleted != 1) {
+        // psError(); something bad happened
+        return NULL;
+    }
+
+    object = psAlloc(sizeof([% object_name %]));
+
+[% FOREACH item = columns -%]
+[% IF item.type == "S32" or item.type == "F32" or item.type == "F64" -%]
+    object->[% item.name %] = psMetadataLookup[% item.type %](&status, row, "[% item.name %]");
+[% ELSIF item.type == "STR" -%]
+    object->[% item.name %] = psMetadataLookupPtr(&status, row, "[% item.name %]");
+[% ELSIF item.type == "BOOL" -%]
+    object->[% item.name %] = psMetadataLookupBool(&status, row, "[% item.name %]");
+[% END -%]
+[% END -%]
+
+    return object;
+}
Index: /trunk/glueforge/templates/psdb/popobject_at.tt
===================================================================
--- /trunk/glueforge/templates/psdb/popobject_at.tt	(revision 4147)
+++ /trunk/glueforge/templates/psdb/popobject_at.tt	(revision 4147)
@@ -0,0 +1,10 @@
+AT_SETUP([[% namespace %]PopObject() - Removes the last row from the database and returns it])
+AT_KEYWORDS([[% namespace %]PopObject])
+
+AT_CHECK([dbsetup])
+# run insert so there is a row in the table
+AT_CHECK([insert])
+AT_CHECK([popobject])
+AT_CHECK([dbcleanup])
+
+AT_CLEANUP
Index: /trunk/glueforge/templates/psdb/popobject_c.tt
===================================================================
--- /trunk/glueforge/templates/psdb/popobject_c.tt	(revision 4147)
+++ /trunk/glueforge/templates/psdb/popobject_c.tt	(revision 4147)
@@ -0,0 +1,24 @@
+[% USE format -%]
+[% indented = format('%-15s %s') -%]
+#include <pslib.h>
+#include <[% pkg_name %].h>
+#include <stdlib.h>
+
+int main () {
+    psDB            *dbh;
+    [% indented(object_name, "*object") %];
+
+    dbh = psDBInit("localhost", "test", NULL, "test");
+    if (!dbh) {
+        exit(EXIT_FAILURE);
+    }
+
+    object = [% namespace %]PopObject(dbh);
+    if (!object) {
+        exit(EXIT_FAILURE);
+    }
+
+    psDBCleanup(dbh);
+
+    exit(EXIT_SUCCESS);
+}
Index: /trunk/glueforge/templates/psdb/tests_makefile_am.tt
===================================================================
--- /trunk/glueforge/templates/psdb/tests_makefile_am.tt	(revision 4146)
+++ /trunk/glueforge/templates/psdb/tests_makefile_am.tt	(revision 4147)
@@ -56,5 +56,6 @@
 	createtable \
     droptable \
-    insert
+    insert \
+    popobject
 
 AM_CPPFLAGS = -I$(top_srcdir)/src$
Index: /trunk/glueforge/templates/psdb/testsuite_at.tt
===================================================================
--- /trunk/glueforge/templates/psdb/testsuite_at.tt	(revision 4146)
+++ /trunk/glueforge/templates/psdb/testsuite_at.tt	(revision 4147)
@@ -16,2 +16,4 @@
 
 [% INCLUDE insert_at.tt %]
+
+[% INCLUDE popobject_at.tt %]
