Index: trunk/archive/psdb/psDB.c
===================================================================
--- trunk/archive/psdb/psDB.c	(revision 3198)
+++ trunk/archive/psdb/psDB.c	(revision 3202)
@@ -8,6 +8,6 @@
  *  @author Joshua Hoblitt
  *
- *  @version $Revision: 1.16 $ $Name: not supported by cvs2svn $
- *  @date $Date: 2005-02-11 23:46:57 $
+ *  @version $Revision: 1.17 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2005-02-12 02:40:21 $
  *
  *  Copyright 2005 Joshua Hoblitt, University of Hawaii
@@ -41,4 +41,5 @@
 static void     psDBPSToMySQLTableCleanup(void);
 static psPtr    psDBMySQLTypeAlloc(enum enum_field_types type, bool isUnsigned);
+static psU32 psDBMySQLToPType(psU32 type, psU32 flags);
 
 // pType utility functions
@@ -421,5 +422,5 @@
             // signed or unsigned.  The result is this ugly conversion from
             // mysql -> ascii -> ptype
-            if (field->flags & UNSIGNED_FLAG) {
+            if (field[i].flags & UNSIGNED_FLAG) {
                 psStringPrepend(&sqlType, "UNSIGNED ");
             }
@@ -582,4 +583,49 @@
 {
     return psDBSelectRows(dbh, tableName, NULL);
+}
+
+psMetadata *psDBDumpCols(psDB *dbh, const char *tableName)
+{
+    MYSQL_RES       *result;
+    MYSQL_FIELD     *field;
+    psU32           fieldCount;
+    psMetadata      *table;
+    psMetadataItem  *item;
+    psU32           pType;
+    psU32           i;
+    psPtr           column;
+
+    // find column types
+    result = mysql_list_fields(dbh->mysql, tableName, NULL);
+    field = mysql_fetch_fields(result);
+    fieldCount = mysql_num_fields(result);
+
+    table = psMetadataAlloc();
+
+    // fetch each column and load into psMetadata
+    for (i =0; i < fieldCount; i++) {
+        // find ptype of column
+        pType = psDBMySQLToPType(field[i].type, field[i].flags);
+        
+        // if the ptype is PS_TYPE_PTR assume that it's a string and fetch the
+        // column as an psArray of strings; otherwise fetch the column as a
+        // psVector.  
+        if (pType == PS_TYPE_PTR) {
+            // PS_META_UNKNOWN -> PS_META_ARRAY ?
+            column = psDBSelectColumn(dbh, tableName, field[i].name, 0);
+            item = psMetadataItemAlloc(field[i].name, PS_TYPE_PTR, PS_META_UNKNOWN, "psArray", column);
+            psMetadataAddItem(table, item, 0);
+            psFree(column);
+            psFree(item);
+        } else {
+            column = psDBSelectColumnNum(dbh, tableName, field[i].name, pType, 0);
+            item = psMetadataItemAlloc(field[i].name, PS_TYPE_PTR, PS_META_VEC, "psVector", column);
+            psMetadataAddItem(table, item, 0);
+            //psFree(column);
+            psFree(item);
+        }
+    }
+    
+    return table;
 }
 
@@ -1225,4 +1271,38 @@
 
     return newSize;
+}
+
+static psU32 psDBMySQLToPType(psU32 type, psU32 flags)
+{
+    psHash          *mysqlToSQLTable;   // type lookup table
+    psHash          *sqlToPSTable;      // type lookup table
+    char            *key;               // hash tmp value
+    char            *value;             // hash tmp value
+    char            *sqlType;           // copy of lookup table result
+    psU32           pType;              // psElemType of a field
+
+    mysqlToSQLTable = psDBGetMySQLToSQLTable();
+    sqlToPSTable    = psDBGetSQLToPSTable();
+
+    // lookup MySQL column type
+    key     = psDBIntToString((psU64)type); 
+    value   = psHashLookup(mysqlToSQLTable, key);
+    sqlType = psStringCopy(value);
+    psFree(key);
+
+    // MySQL column types can not be directly translated to PS
+    // types as the the mysql types do not tell you if the value is
+    // signed or unsigned.  The result is this ugly conversion from
+    // mysql -> ascii -> ptype
+    if (flags & UNSIGNED_FLAG) {
+        psStringPrepend(&sqlType, "UNSIGNED ");
+    }
+
+    // convert MySQL type to PS type
+    value = psHashLookup(sqlToPSTable, sqlType);
+    pType = (psU32)atol(value);
+    psFree(sqlType);
+
+    return pType;
 }
 
