Index: /trunk/glueforge/configure.ac
===================================================================
--- /trunk/glueforge/configure.ac	(revision 9667)
+++ /trunk/glueforge/configure.ac	(revision 9668)
@@ -1,5 +1,5 @@
 AC_PREREQ(2.59)
 
-AC_INIT([glueforge], [0.29], [jhoblitt@cpan.org])
+AC_INIT([glueforge], [0.30], [jhoblitt@cpan.org])
 AC_CONFIG_SRCDIR([glueforge.in])
 
Index: /trunk/glueforge/glueforge.in
===================================================================
--- /trunk/glueforge/glueforge.in	(revision 9667)
+++ /trunk/glueforge/glueforge.in	(revision 9668)
@@ -3,5 +3,5 @@
 # Copyright (C) 2005-2006  Joshua Hoblitt
 #
-# $Id: glueforge.in,v 1.50 2006-08-28 23:50:20 jhoblitt Exp $
+# $Id: glueforge.in,v 1.51 2006-10-20 00:55:43 jhoblitt Exp $
 
 use strict;
@@ -94,7 +94,11 @@
     my $type = shift;
 
-    my %primitives = map { $_ => 1 } qw( S8 S16 S32 S64 U8 U16 U32 U64 F32 F64 );
-    my %mtypes = map { $_ => "PS_DATA_$_" } keys %primitives;
-    my %ctypes = map { $_ => "ps$_" } keys %primitives;
+    my %primitives = map { $_ => 1 }
+            qw( S8 S16 S32 S64 U8 U16 U32 U64 F32 F64 );
+    my %times = map { $_ => 1 } qw( UTC UT1 TAI TT );
+    my %mtypes = (map({ $_ => "PS_DATA_$_" } keys %primitives),
+                  map({ $_ => "PS_DATA_TIME" } keys %times));
+    my %ctypes = (map({ $_ => "ps$_" } keys %primitives),
+                  map({ $_ => "psTime*"} keys %times));
 
     my %ttypes = (
@@ -109,16 +113,28 @@
         F32     => 32.32,
         F64     => 64.64,
+        UTC     => '"0001-01-01T00:00:00Z"',
+        UT1     => '"0001-01-01T00:00:00Z"',
+        TAI     => '"0001-01-01T00:00:00Z"',
+        TT      => '"0001-01-01T00:00:00Z"',
     );
 
-    if ( $primitives{$type} ) {
+    if ($primitives{$type}) {
         return {
             ctype   => $ctypes{$type},
             mtype   => $mtypes{$type},
             test    => $ttypes{$type},
-        };
+        }; 
+    }
+    elsif ($times{$type}) {
+        return {
+            ctype   => $ctypes{$type},
+            mtype   => $mtypes{$type},
+            test    => $ttypes{$type},
+            timetype => "PS_TIME_$type",
+        }; 
     } elsif ( $type =~ /STR|STRING/ ) {
         return {
             ctype   => "char*",
-            mtype   => 'PS_DATA_STR',
+            mtype   => 'PS_DATA_STRING',
             test    => '"a string"',
         };
@@ -168,4 +184,11 @@
     my @items;
 
+    # setup one table per nested metadata
+    my @tables;
+    foreach my $meta (@{$config}) {
+        push @tables, tabledata_from_meta($meta);
+    }
+
+=for off
     # setup items
     for (my $i = 0; $i < @{$config}; $i++) {
@@ -176,13 +199,15 @@
 
         push @items, {
+            %{$mdtypes},
             name    => $elem->{name},
             type    => $elem->{type},
-            ctype   => $mdtypes->{ctype},
-            mtype   => $mdtypes->{mtype},
-            test    => $mdtypes->{test},
+#            ctype   => $mdtypes->{ctype},
+#            mtype   => $mdtypes->{mtype},
+#            test    => $mdtypes->{test},
             comment => $elem->{comment},
             value   => $elem->{value},
         };
     }
+=cut
 
     $table{columns} = \@items;
@@ -272,9 +297,10 @@
             name    => $column->{name},
             type    => $column->{type},
-            ctype   => $mdtypes->{ctype},
-            mtype   => $mdtypes->{mtype},
-            test    => $mdtypes->{test},
+#            ctype   => $mdtypes->{ctype},
+#            mtype   => $mdtypes->{mtype},
+#            test    => $mdtypes->{test},
             comment => $column->{comment},
             value   => $column->{value},
+            %{$mdtypes},
         };
     }
Index: /trunk/glueforge/templates/psdb/Makefile.am
===================================================================
--- /trunk/glueforge/templates/psdb/Makefile.am	(revision 9667)
+++ /trunk/glueforge/templates/psdb/Makefile.am	(revision 9668)
@@ -1,4 +1,8 @@
 template_files = \
 	COPYING \
+	metadata \
+	metadata_from_params \
+	metadata_from_struct \
+	lookup_from_metadata \
     alloc.tt \
     alloc_at.tt \
@@ -7,5 +11,4 @@
     autogen_sh.tt \
     bootstrap_sh.tt \
-    config.pl \
     cleanup.tt \
     cleanup_at.tt \
@@ -13,4 +16,5 @@
     cleanup_h.tt \
     code.tt \
+    config.pl \
     configure_ac.tt \
     createtable.tt \
Index: /trunk/glueforge/templates/psdb/alloc.tt
===================================================================
--- /trunk/glueforge/templates/psdb/alloc.tt	(revision 9667)
+++ /trunk/glueforge/templates/psdb/alloc.tt	(revision 9668)
@@ -23,4 +23,6 @@
 [% IF item.type == "STR" -%]
     _object->[% item.name %] = psStringCopy([% item.name %]);
+[% ELSIF item.mtype == "PS_DATA_TIME" -%]
+    _object->[% item.name %] = psTimeCopy([% item.name %]);
 [% ELSE -%]
     _object->[% item.name %] = [% item.name %];
@@ -36,4 +38,6 @@
 [% IF item.type == "STR" -%]
     psFree(object->[% item.name %]);
+[% ELSIF item.mtype == "PS_DATA_TIME" -%]
+    psFree(object->[% item.name %]);
 [% END -%]
 [% END -%]
Index: /trunk/glueforge/templates/psdb/createtable.tt
===================================================================
--- /trunk/glueforge/templates/psdb/createtable.tt	(revision 9667)
+++ /trunk/glueforge/templates/psdb/createtable.tt	(revision 9668)
@@ -1,26 +1,5 @@
 bool [% table.namespace %]CreateTable(psDB *dbh)
 {
-    psMetadata *md = psMetadataAlloc();
-[% FOREACH item = table.columns -%]
-[% IF item.comment;
-    SET item.comment = "\"$item.comment\"";
-ELSE;
-    SET item.comment = 'NULL';
-END;
--%]
-[% IF item.type == "STR" -%]
-    if (!psMetadataAdd(md, PS_LIST_TAIL, "[% item.name %]", [% item.mtype %], [% item.comment %], "[% item.value %]")) {
-[% ELSIF item.mtype == "PS_DATA_TIME" -%]
-    [% item.ctype %] [% item.name %] = psTimeFromISO("[% item.value %]", [% item.timetype %]);
-    if (!psMetadataAdd(md, PS_LIST_TAIL, "[% item.name %]", [% item.mtype %], [% item.comment %], [% item.name %])) {
-        psFree([% item.name %]);
-[% ELSE -%]
-    if (!psMetadataAdd(md, PS_LIST_TAIL, "[% item.name %]", [% item.mtype %], [% item.comment %], [% item.value %])) {
-[% END -%]
-        psError(PS_ERR_UNKNOWN, false, "failed to add item [% item.name %]");
-        psFree(md);
-        return false;
-    }
-[% END -%]
+[% INCLUDE metadata -%]
 
     bool status = psDBCreateTable(dbh, [% table.namespace FILTER upper %]_TABLE_NAME, md);
Index: /trunk/glueforge/templates/psdb/insert.tt
===================================================================
--- /trunk/glueforge/templates/psdb/insert.tt	(revision 9667)
+++ /trunk/glueforge/templates/psdb/insert.tt	(revision 9668)
@@ -11,23 +11,7 @@
 )
 {
-    psMetadata      *md;
-    bool            status;
+[% INCLUDE metadata_from_params -%]
 
-    md = psMetadataAlloc();
-[% FOREACH item = table.columns -%]
-[% IF item.type == "S32" or item.type == "F32" or item.type == "F64" -%]
-    if (!psMetadataAdd[% item.type %](md, PS_LIST_TAIL, "[% item.name %]", 0, NULL, [% item.name %])) {
-[% ELSIF item.type == "STR" -%]
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "[% item.name %]", 0, NULL, [% item.name %])) {
-[% ELSIF item.type == "BOOL" -%]
-    if (!psMetadataAdd(md, PS_LIST_TAIL, "[% item.name %]", PS_DATA_BOOL, NULL, [% item.name %])) {
-[% END -%]
-        psError(PS_ERR_UNKNOWN, false, "failed to add item [% item.name %]");
-        psFree(md);
-        return false;
-    }
-[% END -%]
-
-    status = psDBInsertOneRow(dbh, [% table.namespace FILTER upper %]_TABLE_NAME, md);
+    bool status = psDBInsertOneRow(dbh, [% table.namespace FILTER upper %]_TABLE_NAME, md);
     psFree(md);
 
Index: /trunk/glueforge/templates/psdb/lookup_from_metadata
===================================================================
--- /trunk/glueforge/templates/psdb/lookup_from_metadata	(revision 9668)
+++ /trunk/glueforge/templates/psdb/lookup_from_metadata	(revision 9668)
@@ -0,0 +1,14 @@
+bool status = false;
+[% FOREACH item = table.columns -%]
+[% IF item.type == "STR" OR item.mtype == "PS_DATA_TIME" -%]
+    [% item.ctype %] [% item.name %] = psMetadataLookupPtr(&status, md, "[% item.name %]");
+[% ELSIF item.type == "BOOL" -%]
+    [% item.ctype %] [% item.name %] = psMetadataLookupBool(&status, md, "[% item.name %]");
+[% ELSE -%]
+    [% item.ctype %] [% item.name %] = psMetadataLookup[% item.type %](&status, md, "[% item.name %]");
+[% END -%]
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item [% item.name %]");
+        return false;
+    }
+[% END -%]
Index: /trunk/glueforge/templates/psdb/metadata
===================================================================
--- /trunk/glueforge/templates/psdb/metadata	(revision 9668)
+++ /trunk/glueforge/templates/psdb/metadata	(revision 9668)
@@ -0,0 +1,25 @@
+    psMetadata *md = psMetadataAlloc();
+[% FOREACH item = table.columns -%]
+[% IF item.comment;
+    SET item.comment = "\"$item.comment\"";
+ELSE;
+    SET item.comment = 'NULL';
+END;
+-%]
+[% IF item.type == "STR" -%]
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "[% item.name %]", [% item.mtype %], [% item.comment %], "[% item.value %]")) {
+[% ELSIF item.mtype == "PS_DATA_TIME" -%]
+    [% item.ctype %] [% item.name %] = psTimeFromISO("[% item.value %]", [% item.timetype %]);
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "[% item.name %]", [% item.mtype %], [% item.comment %], [% item.name %])) {
+        psFree([% item.name %]);
+[% ELSE -%]
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "[% item.name %]", [% item.mtype %], [% item.comment %], [% item.value %])) {
+[% END -%]
+        psError(PS_ERR_UNKNOWN, false, "failed to add item [% item.name %]");
+        psFree(md);
+        return false;
+    }
+[% IF item.mtype == "PS_DATA_TIME" -%]
+    psFree([% item.name %]);
+[% END -%]
+[% END -%]
Index: /trunk/glueforge/templates/psdb/metadata_from_params
===================================================================
--- /trunk/glueforge/templates/psdb/metadata_from_params	(revision 9668)
+++ /trunk/glueforge/templates/psdb/metadata_from_params	(revision 9668)
@@ -0,0 +1,8 @@
+    psMetadata *md = psMetadataAlloc();
+[% FOREACH item = table.columns -%]
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "[% item.name %]", [% item.mtype %], NULL, [% item.name %])) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item [% item.name %]");
+        psFree(md);
+        return false;
+    }
+[% END -%]
Index: /trunk/glueforge/templates/psdb/metadata_from_struct
===================================================================
--- /trunk/glueforge/templates/psdb/metadata_from_struct	(revision 9668)
+++ /trunk/glueforge/templates/psdb/metadata_from_struct	(revision 9668)
@@ -0,0 +1,8 @@
+    psMetadata *md = psMetadataAlloc();
+[% FOREACH item = table.columns -%]
+    if (!psMetadataAdd(md, PS_LIST_TAIL, "[% item.name %]", [% item.mtype %], NULL, object->[% item.name %])) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item [% item.name %]");
+        psFree(md);
+        return false;
+    }
+[% END -%]
Index: /trunk/glueforge/templates/psdb/metadatafromobject.tt
===================================================================
--- /trunk/glueforge/templates/psdb/metadatafromobject.tt	(revision 9667)
+++ /trunk/glueforge/templates/psdb/metadatafromobject.tt	(revision 9668)
@@ -1,20 +1,5 @@
 psMetadata *[% table.namespace %]MetadataFromObject(const [% table.object_name %] *object)
 {
-    psMetadata      *md;
-
-    md = psMetadataAlloc();
-[% FOREACH item = table.columns -%]
-[% IF item.type == "S32" or item.type == "F32" or item.type == "F64" -%]
-    if (!psMetadataAdd[% item.type %](md, PS_LIST_TAIL, "[% item.name %]", 0, NULL, object->[% item.name %])) {
-[% ELSIF item.type == "STR" -%]
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "[% item.name %]", 0, NULL, object->[% item.name %])) {
-[% ELSIF item.type == "BOOL" -%]
-    if (!psMetadataAdd(md, PS_LIST_TAIL, "[% item.name %]", PS_DATA_BOOL, NULL, object->[% item.name %])) {
-[% END -%]
-        psError(PS_ERR_UNKNOWN, false, "failed to add item [% item.name %]");
-        psFree(md);
-        return NULL;
-    }
-[% END -%]
+[% INCLUDE metadata_from_struct %]
 
     return md;
Index: /trunk/glueforge/templates/psdb/objectfrommetadata.tt
===================================================================
--- /trunk/glueforge/templates/psdb/objectfrommetadata.tt	(revision 9667)
+++ /trunk/glueforge/templates/psdb/objectfrommetadata.tt	(revision 9668)
@@ -3,26 +3,6 @@
 [% table.object_name %] *[% table.namespace %]ObjectFromMetadata(psMetadata *md)
 {
-    bool            status;
-[% FOREACH item = table.columns -%]
-[% IF item.type == "STR" -%]
-    [% indented("char", "*$item.name") %];
-[% ELSE-%]
-    [% indented("$item.ctype", "$item.name") %];
-[% END -%]
-[% END -%]
 
-[% FOREACH item = table.columns -%]
-[% IF item.type == "S32" or item.type == "F32" or item.type == "F64" -%]
-    [% item.name %] = psMetadataLookup[% item.type %](&status, md, "[% item.name %]");
-[% ELSIF item.type == "STR" -%]
-    [% item.name %] = psMetadataLookupPtr(&status, md, "[% item.name %]");
-[% ELSIF item.type == "BOOL" -%]
-    [% item.name %] = psMetadataLookupBool(&status, md, "[% item.name %]");
-[% END -%]
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item [% item.name %]");
-        return false;
-    }
-[% END -%]
+[% INCLUDE lookup_from_metadata -%]
 
     return [% table.object_name %]Alloc(
