Index: trunk/archive/psdb/psDB.c
===================================================================
--- trunk/archive/psdb/psDB.c	(revision 3236)
+++ trunk/archive/psdb/psDB.c	(revision 3242)
@@ -8,6 +8,6 @@
  *  @author Joshua Hoblitt
  *
- *  @version $Revision: 1.28 $ $Name: not supported by cvs2svn $
- *  @date $Date: 2005-02-16 00:45:11 $
+ *  @version $Revision: 1.29 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2005-02-16 02:08:33 $
  *
  *  Copyright 2005 Joshua Hoblitt, University of Hawaii
@@ -45,16 +45,18 @@
 // lookup table functions
 static psElemType psDBMySQLToPType(enum enum_field_types type, unsigned int flags);
-
-static psHash  *psDBGetPSToSQLTable(void);
-static void     psDBPSToSQLTableCleanup(void);
-
-static psHash  *psDBGetSQLToPSTable(void);
-static void     psDBSQLToPSTableCleanup(void);
+static char    *psDBPTypeToSQL(psElemType pType);
+static mysqlType *psDBPTypeToMySQL(psElemType pType);
+
+static psHash  *psDBGetPTypeToSQLTable(void);
+static void     psDBPTypeToSQLTableCleanup(void);
+
+static psHash  *psDBGetSQLToPTypeTable(void);
+static void     psDBSQLToPTypeTableCleanup(void);
 
 static psHash  *psDBGetMySQLToSQLTable(void);
 static void     psDBMySQLToSQLTableCleanup(void);
 
-static psHash  *psDBGetPSToMySQLTable(void);
-static void     psDBPSToMySQLTableCleanup(void);
+static psHash  *psDBGetPTypeToMySQLTable(void);
+static void     psDBPTypeToMySQLTableCleanup(void);
 
 static psPtr    psDBMySQLTypeAlloc(enum enum_field_types type, bool isUnsigned);
@@ -113,7 +115,7 @@
     // one or more are still open
     psDBMySQLToSQLTableCleanup();
-    psDBPSToSQLTableCleanup();
-    psDBSQLToPSTableCleanup();
-    psDBPSToMySQLTableCleanup();
+    psDBPTypeToSQLTableCleanup();
+    psDBSQLToPTypeTableCleanup();
+    psDBPTypeToMySQLTableCleanup();
 }
 
@@ -353,11 +355,6 @@
     int             i;                  // field index
     psMetadata      *md;                // a row
-    psHash          *mysqlToSQLTable;   // type lookup table
-    psHash          *sqlToPSTable;      // type lookup table
-    char            *key;               // hash tmp value
-    char            *value;             // hash tmp value
     psU32           pType;              // psElemType of a field
     psU32           type;               // psMetadataType of a a field
-    char            *sqlType;           // copy of lookup table result
     psPtr           data;               // copy of result field
 
@@ -402,7 +399,4 @@
     fieldCount = mysql_num_fields(result);
 
-    mysqlToSQLTable = psDBGetMySQLToSQLTable();
-    sqlToPSTable = psDBGetSQLToPSTable();
-
     while ((row = mysql_fetch_row(result))) {
         // allocate new psMetadata to represent a row
@@ -413,21 +407,5 @@
         for (i = 0; i < fieldCount; i++) {
             // lookup MySQL column type
-            key = psDBIntToString((psU64)field[i].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 (field[i].flags & UNSIGNED_FLAG) {
-                psStringPrepend(&sqlType, "UNSIGNED ");
-            }
-
-            // convert MySQL type to PS type
-            value = psHashLookup(sqlToPSTable, sqlType);
-            pType = (psU32)atol(value);
-            psFree(sqlType);
+            pType = psDBMySQLToPType(field[i].type, field[i].flags);
 
             // copy field data and convert NULLs to the appropriate NaN value
@@ -455,7 +433,4 @@
         psArrayAdd(resultSet, 0, md);
     }
-
-    psFree(mysqlToSQLTable);
-    psFree(sqlToPSTable);
 
     mysql_free_result(result);
@@ -751,9 +726,7 @@
     psListIterator  *cursor;            // row iterator
     psMetadataItem  *item;              // field in row
-    psHash          *mysqlFieldType;    // type lookup table
     mysqlType       *mType;             // type tmp variable
     static bool     isNull = true;      // used in a MYSQL_BIND to indicate NULL,
                                         // this will be used outside of this func
-    char            *key;               // hash tmp variable
     psU32           i;                  // field index
 
@@ -761,6 +734,4 @@
 
     cursor = psListIteratorAlloc(values->list, 0);
-
-    mysqlFieldType = psDBGetPSToMySQLTable();
 
     // loop over fields
@@ -768,7 +739,5 @@
     while ((item = psListGetNext(cursor))) {
         // lookup pType -> mysql type
-        key = psDBIntToString((psU64)item->pType);
-        mType = psHashLookup(mysqlFieldType, key);
-        psFree(key);
+        mType = psDBPTypeToMySQL(item->pType);
 
         // input data length is determined by the MYSQL_TYPE_* unless it's a string
@@ -776,4 +745,6 @@
         bind[i].buffer_type = mType->type;
         bind[i].is_unsigned = mType->isUnsigned;
+
+        psFree(mType);
 
         // convert NaNs to NULL and set the buffer_length for strings
@@ -789,5 +760,4 @@
                 // error, not a pointer to a string
                 psFree(cursor);
-                psFree(mysqlFieldType);
 
                 return false;
@@ -805,5 +775,4 @@
 
     psFree(cursor);
-    psFree(mysqlFieldType);
 
     return true;
@@ -819,7 +788,5 @@
     psMetadataItem  *item;              // column description
     psListIterator  *cursor;            // column iterator
-    psHash          *colType;           // type lookup table
-    char            *key;               // hash tmp variable
-    char            *value;             // hash tmp variable
+    char            *colType;           // type lookup table
 
     if (!table) {
@@ -829,6 +796,4 @@
     // + _ + tableName + _ + (
     psStringAppend(&query, "CREATE TABLE %s (", tableName);
-
-    colType = psDBGetPSToSQLTable();
 
     cursor = psListIteratorAlloc(table->list, 0);
@@ -837,11 +802,8 @@
     while ((item = psListGetNext(cursor))) {
         if (item->type == PS_META_PRIMITIVE) {
-            // lookup SQL column type
-            key = psDBIntToString((psU64)item->pType);
-            value = psHashLookup(colType, key);
-            psFree(key);
-
             // + column name + _ + column type
-            psStringAppend(&query, "%s %s", item->name, value);
+            colType = psDBPTypeToSQL(item->pType);
+            psStringAppend(&query, "%s %s", item->name, colType);
+            psFree(colType);
         } else if ((item->type == PS_META_STR) && (item->pType == PS_TYPE_PTR)) {
             // + column name + _ + varchar( + length + )
@@ -860,6 +822,4 @@
         }
     }
-
-    psFree(colType);
 
     psListIteratorSet(cursor, 0);
@@ -1096,5 +1056,5 @@
 
     mysqlToSQLTable = psDBGetMySQLToSQLTable();
-    sqlToPSTable    = psDBGetSQLToPSTable();
+    sqlToPSTable    = psDBGetSQLToPTypeTable();
 
     // lookup MySQL column type
@@ -1122,5 +1082,43 @@
 }
 
-static psHash *psDBGetPSToSQLTable(void)
+static char *psDBPTypeToSQL(psElemType pType)
+{
+    psHash          *pTypeToSQLTable;   // type lookup table
+    char            *key;               // hash tmp value
+    char            *sqlType;             // hash tmp value
+
+    pTypeToSQLTable = psDBGetPTypeToSQLTable();
+
+    key = psDBIntToString((psU64)pType);
+    sqlType = psHashLookup(pTypeToSQLTable, key);
+    psFree(key);
+
+    psFree(pTypeToSQLTable);
+
+    psMemIncrRefCounter(sqlType);
+
+    return sqlType;
+}
+
+static mysqlType *psDBPTypeToMySQL(psElemType pType)
+{
+    psHash          *pTypeToMySQLTable; // type lookup table
+    char            *key;               // hash tmp value
+    mysqlType       *mType;             // mysqlType struct to return
+    
+    pTypeToMySQLTable = psDBGetPTypeToMySQLTable();
+
+    key = psDBIntToString((psU64)pType);
+    mType = psHashLookup(pTypeToMySQLTable, key);
+    psFree(key);
+
+    psFree(pTypeToMySQLTable);
+
+    psMemIncrRefCounter(mType);
+
+    return mType;
+}
+
+static psHash *psDBGetPTypeToSQLTable(void)
 {
     static psHash   *lookupTable = NULL;
@@ -1152,9 +1150,9 @@
 }
 
-static void psDBPSToSQLTableCleanup(void) 
+static void psDBPTypeToSQLTableCleanup(void) 
 {
     psHash          *lookupTable;
 
-    lookupTable = psDBGetPSToSQLTable();
+    lookupTable = psDBGetPTypeToSQLTable();
 
     psMemDecrRefCounter(lookupTable);
@@ -1162,5 +1160,5 @@
 }
 
-static psHash *psDBGetSQLToPSTable(void)
+static psHash *psDBGetSQLToPTypeTable(void)
 {
     static psHash   *lookupTable = NULL;
@@ -1173,5 +1171,5 @@
     if (!lookupTable) {
         // invert the PSToSQL table
-        psToSQLTable = psDBGetPSToSQLTable();
+        psToSQLTable = psDBGetPTypeToSQLTable();
         lookupTable = psHashAlloc(psToSQLTable->nbucket);
 
@@ -1196,9 +1194,9 @@
 }
 
-static void psDBSQLToPSTableCleanup(void) 
+static void psDBSQLToPTypeTableCleanup(void) 
 {
     psHash          *lookupTable;
 
-    lookupTable = psDBGetSQLToPSTable();
+    lookupTable = psDBGetSQLToPTypeTable();
 
     psMemDecrRefCounter(lookupTable);
@@ -1251,5 +1249,5 @@
 }
 
-static psHash *psDBGetPSToMySQLTable(void)
+static psHash *psDBGetPTypeToMySQLTable(void)
 {
     static psHash   *lookupTable = NULL;
@@ -1282,9 +1280,9 @@
 }
 
-static void psDBPSToMySQLTableCleanup(void)
+static void psDBPTypeToMySQLTableCleanup(void)
 {
     psHash          *lookupTable;
 
-    lookupTable = psDBGetPSToMySQLTable();
+    lookupTable = psDBGetPTypeToMySQLTable();
 
     psMemDecrRefCounter(lookupTable);
