Index: trunk/psLib/src/astronomy/psDB.c
===================================================================
--- trunk/psLib/src/astronomy/psDB.c	(revision 3532)
+++ trunk/psLib/src/astronomy/psDB.c	(revision 3543)
@@ -1,3 +1,6 @@
 /** @file  psDB.c
+ *
+ * -*- mode: C; c-basic-indent: 4; tab-width: 8; indent-tabs-mode: nil -*-
+ * vim: set cindent ts=8 sw=4 expandtab:
  *
  *  @brief database functions
@@ -8,6 +11,6 @@
  *  @author Joshua Hoblitt
  *
- *  @version $Revision: 1.2 $ $Name: not supported by cvs2svn $
- *  @date $Date: 2005-03-28 22:54:19 $
+ *  @version $Revision: 1.3 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2005-03-29 22:13:28 $
  *
  *  Copyright 2005 Joshua Hoblitt, University of Hawaii
@@ -430,5 +433,6 @@
 
             // copy field data and convert NULLs to the appropriate NaN value
-            if (pType == PS_TYPE_PTR) {
+            if ((pType == PS_TYPE_PTR) || (pType == PS_META_STR)) {
+                pType = PS_META_STR;
                 data = fieldLength[i] ? psStringNCopy(row[i], fieldLength[i])
                        : psDBGetPTypeNaN(pType);
@@ -443,5 +447,5 @@
 
             // add new field to row
-            psMetadataAdd(md, i, field[i].name, pType, "no comment", data);
+            psMetadataAdd(md, 0, field[i].name, pType, "no comment", data);
 
             psFree(data);
@@ -450,4 +454,5 @@
         // add row to result set
         psArrayAdd(resultSet, 0, md);
+        psFree(md);
     }
 
@@ -460,8 +465,4 @@
 {
     psArray         *rowSet;            // psArray of row to insert
-
-    // this is to prevent row from being free'd when rowSet is free'd. this
-    // will have to be removed when psArrayAdd is modified to do this for you.
-    psMemIncrRefCounter(row);
 
     rowSet = psArrayAlloc(1);
@@ -603,19 +604,18 @@
         // find ptype of column
         pType = psDBMySQLToPType(field[i].type, field[i].flags);
+        //psLogMsg( __func__, PS_LOG_INFO, "pType=[%ld]\n", pType );
 
         // 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) {
+        if ((pType == PS_TYPE_PTR) || (pType == PS_META_STR)) {
             // PS_META_UNKNOWN -> PS_META_ARRAY ?
             column = psDBSelectColumn(dbh, tableName, field[i].name, 0);
-            psMetadataAdd(table, 0, field[i].name, PS_TYPE_PTR, "psArray", column);
-            // FIXME
-            //psFree(column);
+            psMetadataAdd(table, 0, field[i].name, PS_META_STR, "no comment", column);
+            psFree(column);
         } else {
             column = psDBSelectColumnNum(dbh, tableName, field[i].name, pType, 0);
-            psMetadataAdd(table, 0, field[i].name, PS_TYPE_PTR, "psVector", column);
-            // FIXME
-            //psFree(column);
+            psMetadataAdd(table, 0, field[i].name, pType, "no comment", column);
+            psFree(column);
         }
     }
@@ -799,5 +799,10 @@
             // convert NaNs to NULL and set the buffer_length for strings
             //} else if ((item->type == PS_META_STR) && (item->pType == PS_TYPE_PTR)) {
-        } else if (item->type == PS_TYPE_PTR) {
+        } else if ((item->type == PS_META_STR)         || (item->type == PS_META_VEC)    ||
+                   (item->type == PS_META_IMG)         || (item->type == PS_META_HASH)   ||
+                   (item->type == PS_META_LOOKUPTABLE) || (item->type == PS_META_JPEG)   ||
+                   (item->type == PS_META_PNG)         || (item->type == PS_META_ASTROM) ||
+                   (item->type == PS_META_UNKNOWN)     || (item->type == PS_TYPE_PTR)) {
+
             bind[i].buffer_length = (unsigned long)strlen((char *)item->data.V);
             bind[i].length  = &bind[i].buffer_length;
@@ -848,5 +853,6 @@
     // find column name and type
     while ((item = psListGetAndIncrement(cursor))) {
-        if ((item->type == PS_META_S32) || (item->type == PS_META_F32) || (item->type == PS_META_F64)) {
+        if ((item->type == PS_META_S32) || (item->type == PS_META_F32) || (item->type == PS_META_F64) ||
+                (item->type == PS_TYPE_S32) || (item->type == PS_TYPE_F32) || (item->type == PS_TYPE_F64)) {
             // + column name + _ + column type
             colType = psDBPTypeToSQL(item->type);
@@ -857,5 +863,5 @@
                    (item->type == PS_META_LOOKUPTABLE) || (item->type == PS_META_JPEG)   ||
                    (item->type == PS_META_PNG)         || (item->type == PS_META_ASTROM) ||
-                   (item->type == PS_META_UNKNOWN)) {
+                   (item->type == PS_META_UNKNOWN)     || (item->type == PS_TYPE_PTR)) {
             // + column name + _ + varchar( + length + )
             psStringAppend(&query, "%s VARCHAR(%s)", item->name, item->data.V);
@@ -1029,4 +1035,5 @@
 
     psStringAppend(&query, "DELETE FROM %s %s", tableName, whereSQL);
+    psFree(whereSQL);
 
     return query;
@@ -1052,13 +1059,24 @@
     while ((item = psListGetAndIncrement(cursor))) {
         // item->data must be a string
-        if (item->type == PS_META_STR) {
+        if ((item->type == PS_META_S32) || (item->type == PS_TYPE_S32)) {
+            psStringAppend(&query, "%s=%d", item->name, (int)(item->data.S32));
+        } else if ((item->type == PS_META_F32) || (item->type == PS_TYPE_F32)) {
+            psStringAppend(&query, "%s=%g", item->name, (double)(item->data.F32));
+        } else if ((item->type == PS_META_F64) || (item->type == PS_TYPE_F64)) {
+            psStringAppend(&query, "%s=%g", item->name, (double)(item->data.F64));
+        } else if (item->type == PS_META_STR) {
             // + column name + _ + like + _ + ' + value + '
             if (*(char *)item->data.V == '\0') {
                 psStringAppend(&query, "%s IS NULL", item->name);
             } else {
+                // XXX ASC NOTE: we should have a better match for
+                // char & varchar columns than this.  LIKE is OK for
+                // very large TEXT columns that really shouldn't be
+                // used in a where clause...
                 psStringAppend(&query, "%s LIKE '%s'", item->name, item->data.V);
             }
         } else {
-            psError(PS_ERR_BAD_PARAMETER_TYPE, true, "Only a type of PS_META_STR is supported.");
+            psError(PS_ERR_BAD_PARAMETER_TYPE, true,
+                    "Only types PS_META_S32, PS_META_F32, PS_META_F64, PS_META_STR is supported");
 
             psFree(cursor);
@@ -1128,5 +1146,4 @@
 
     mysqlToSQLTable = psDBGetMySQLToSQLTable();
-    sqlToPSTable    = psDBGetSQLToPTypeTable();
 
     // lookup MySQL column type
@@ -1138,7 +1155,4 @@
     if (!sqlType) {
         psError(PS_ERR_UNEXPECTED_NULL, true, "type lookup failed.");
-
-        psFree(sqlToPSTable);
-
         return -1;
     }
@@ -1152,5 +1166,8 @@
     }
 
+    psLogMsg( __func__, PS_LOG_INFO, "sqlType=[%s]\n", sqlType );
+
     // convert MySQL type to PS type
+    sqlToPSTable = psDBGetSQLToPTypeTable();
     value = psHashLookup(sqlToPSTable, sqlType);
     psFree(sqlToPSTable);
@@ -1236,5 +1253,6 @@
         psDBAddToLookupTable(lookupTable, PS_TYPE_C64, "PS_TYPE_C64 is not supported");
         psDBAddToLookupTable(lookupTable, PS_TYPE_BOOL,"BOOLEAN");
-        psDBAddToLookupTable(lookupTable, PS_TYPE_PTR, "VARCHAR");
+        psDBAddToLookupTable(lookupTable, PS_TYPE_PTR, "BLOB");
+        psDBAddToLookupTable(lookupTable, PS_META_STR, "BLOB");
     }
 
@@ -1274,7 +1292,16 @@
         while ((key = psListGetAndIncrement(cursor))) {
             value = psHashLookup(psToSQLTable, key);
+            if (!strcmp(value, "BLOB")) {
+                continue; // ignore reverse BLOB mapping, fill in below
+            }
             // switch key and value
             psHashAdd(lookupTable, value, key);
         }
+
+        value = psDBIntToString((psU64)PS_META_STR);
+        psHashAdd(lookupTable, "VARCHAR", value);
+        psHashAdd(lookupTable, "BLOB",    value);
+        psHashAdd(lookupTable, "TEXT",    value);
+        psFree(value);
 
         // DECIMAL does not exist in the pType to SQL table
@@ -1372,4 +1399,15 @@
         psDBAddVoidToLookupTable(lookupTable, PS_TYPE_BOOL,   psDBMySQLTypeAlloc(MYSQL_TYPE_TINY,       true));
         psDBAddVoidToLookupTable(lookupTable, PS_TYPE_PTR,    psDBMySQLTypeAlloc(MYSQL_TYPE_VAR_STRING, false));
+
+        psDBAddVoidToLookupTable(lookupTable, PS_META_STR,    psDBMySQLTypeAlloc(MYSQL_TYPE_VAR_STRING, false));
+        psDBAddVoidToLookupTable(lookupTable, PS_META_VEC,    psDBMySQLTypeAlloc(MYSQL_TYPE_VAR_STRING, false));
+        psDBAddVoidToLookupTable(lookupTable, PS_META_IMG,    psDBMySQLTypeAlloc(MYSQL_TYPE_VAR_STRING, false));
+        psDBAddVoidToLookupTable(lookupTable, PS_META_HASH,   psDBMySQLTypeAlloc(MYSQL_TYPE_VAR_STRING, false));
+        psDBAddVoidToLookupTable(lookupTable, PS_META_LOOKUPTABLE,
+                                 psDBMySQLTypeAlloc(MYSQL_TYPE_VAR_STRING, false));
+        psDBAddVoidToLookupTable(lookupTable, PS_META_JPEG,   psDBMySQLTypeAlloc(MYSQL_TYPE_VAR_STRING, false));
+        psDBAddVoidToLookupTable(lookupTable, PS_META_PNG,    psDBMySQLTypeAlloc(MYSQL_TYPE_VAR_STRING, false));
+        psDBAddVoidToLookupTable(lookupTable, PS_META_ASTROM, psDBMySQLTypeAlloc(MYSQL_TYPE_VAR_STRING, false));
+        psDBAddVoidToLookupTable(lookupTable, PS_META_UNKNOWN,psDBMySQLTypeAlloc(MYSQL_TYPE_VAR_STRING, false));
     }
 
