Index: trunk/psLib/src/db/psDB.c
===================================================================
--- trunk/psLib/src/db/psDB.c	(revision 18617)
+++ trunk/psLib/src/db/psDB.c	(revision 19804)
@@ -23,5 +23,5 @@
  * 4.1.2 or newer is required.
  *
- * $Id: psDB.c,v 1.168 2008-07-18 22:09:19 price Exp $
+ * $Id: psDB.c,v 1.169 2008-10-02 17:41:21 eugene Exp $
  */
 
@@ -1027,41 +1027,192 @@
 
     while ((row = mysql_fetch_row(result))) {
-        // allocate new psMetadata to represent a row
-        md = psMetadataAlloc();
-
-        fieldLength = mysql_fetch_lengths(result);
-
-        for (i = 0; i < fieldCount; i++) {
-            // lookup MySQL column type
-            pType = psDBMySQLToPType(field[i].type, field[i].flags);
-            if (!pType) {
-                psError(PS_ERR_UNKNOWN, false, "Failed to lookup type.");
-                psFree(md);
-                mysql_free_result(result);
-                psFree(resultSet);
-                return NULL;
-            }
-
-            len = fieldLength[i];
-            if (len) {
-                // copy the data out of the result set struct
-                data = psAlloc(len + 1);
-                memcpy(data, row[i], len);
-                ((char*)data)[len] = '\0';
-            } else {
-                // if len is zero then the value is NULL
-                psTrace("psLib.db", PS_LOG_INFO, "database field name %s contains a NULL", field[i].name);
-                data = psDBGetPTypeNaN(pType);
-                if (!psMetadataAdd(md, PS_LIST_TAIL, field[i].name, pType, "", data)) {
-                    psError(PS_ERR_UNKNOWN, false, "Failed to add item %s", field[i].name);
-                    psFree(data);
-                    psFree(md);
-                    mysql_free_result(result);
-                    psFree(resultSet);
-                    return NULL;
-                }
-                psFree(data);
-                continue;
-            }
+      // allocate new psMetadata to represent a row
+      md = psMetadataAlloc();
+
+      fieldLength = mysql_fetch_lengths(result);
+
+      for (i = 0; i < fieldCount; i++) {
+	// lookup MySQL column type
+	pType = psDBMySQLToPType(field[i].type, field[i].flags);
+	if (!pType) {
+	  psError(PS_ERR_UNKNOWN, false, "Failed to lookup type.");
+	  psFree(md);
+	  mysql_free_result(result);
+	  psFree(resultSet);
+	  return NULL;
+	}
+
+	len = fieldLength[i];
+	if (len) {
+	  // copy the data out of the result set struct
+	  data = psAlloc(len + 1);
+	  memcpy(data, row[i], len);
+	  ((char*)data)[len] = '\0';
+	} else {
+	  // if len is zero then the value is NULL
+	  psTrace("psLib.db", PS_LOG_INFO, "database field name %s contains a NULL", field[i].name);
+	  data = psDBGetPTypeNaN(pType);
+
+	  // the NULL case must be handled for each type differently
+	  switch (pType) {
+	    case PS_DATA_STRING:
+	      if (!psMetadataAddStr(md, PS_LIST_TAIL, field[i].name, 0, "", data)) {
+		psError(PS_ERR_UNKNOWN, false, "Failed to add item %s", field[i].name);
+		psFree(data);
+		psFree(md);
+		mysql_free_result(result);
+		psFree(resultSet);
+		return NULL;
+	      }
+	      break;
+	    case PS_DATA_U8:
+	      if (!psMetadataAddU8(md, PS_LIST_TAIL, field[i].name, 0, "",*(psU8 *)data)) {
+		psError(PS_ERR_UNKNOWN, false, "Failed to add item %s", field[i].name);
+		psFree(data);
+		psFree(md);
+		mysql_free_result(result);
+		psFree(resultSet);
+		return NULL;
+	      }
+	      break;
+	    case PS_DATA_U16:
+	      if (!psMetadataAddU16(md, PS_LIST_TAIL, field[i].name, 0, "",*(psU16 *)data)) {
+		psError(PS_ERR_UNKNOWN, false, "Failed to add item %s", field[i].name);
+		psFree(data);
+		psFree(md);
+		mysql_free_result(result);
+		psFree(resultSet);
+		return NULL;
+	      }
+	      break;
+	    case PS_DATA_U32:
+	      if (!psMetadataAddU32(md, PS_LIST_TAIL, field[i].name, 0, "",*(psU32 *)data)) {
+		psError(PS_ERR_UNKNOWN, false, "Failed to add item %s", field[i].name);
+		psFree(data);
+		psFree(md);
+		mysql_free_result(result);
+		psFree(resultSet);
+		return NULL;
+	      }
+	      break;
+	    case PS_DATA_U64:
+	      if (!psMetadataAddU64(md, PS_LIST_TAIL, field[i].name, 0, "",*(psU64 *)data)) {
+		psError(PS_ERR_UNKNOWN, false, "Failed to add item %s", field[i].name);
+		psFree(data);
+		psFree(md);
+		mysql_free_result(result);
+		psFree(resultSet);
+		return NULL;
+	      }
+	      break;
+	    case PS_DATA_S8:
+	      if (!psMetadataAddS8(md, PS_LIST_TAIL, field[i].name, 0, "", *(psS8 *)data)) {
+		psError(PS_ERR_UNKNOWN, false, "Failed to add item %s", field[i].name);
+		psFree(data);
+		psFree(md);
+		mysql_free_result(result);
+		psFree(resultSet);
+		return NULL;
+	      }
+	      break;
+	    case PS_DATA_S16:
+	      if (!psMetadataAddS16(md, PS_LIST_TAIL, field[i].name, 0, "", *(psS16 *)data)) {
+		psError(PS_ERR_UNKNOWN, false, "Failed to add item %s", field[i].name);
+		psFree(data);
+		psFree(md);
+		mysql_free_result(result);
+		psFree(resultSet);
+		return NULL;
+	      }
+	      break;
+	    case PS_DATA_S32:
+	      if (!psMetadataAddS32(md, PS_LIST_TAIL, field[i].name, 0, "", *(psS32 *)data)) {
+		psError(PS_ERR_UNKNOWN, false, "Failed to add item %s", field[i].name);
+		psFree(data);
+		psFree(md);
+		mysql_free_result(result);
+		psFree(resultSet);
+		return NULL;
+	      }
+	      break;
+	    case PS_DATA_S64:
+	      if (!psMetadataAddS64(md, PS_LIST_TAIL, field[i].name, 0, "", *(psS64 *)data)) {
+		psError(PS_ERR_UNKNOWN, false, "Failed to add item %s", field[i].name);
+		psFree(data);
+		psFree(md);
+		mysql_free_result(result);
+		psFree(resultSet);
+		return NULL;
+	      }
+	      break;
+	    case PS_DATA_F32:
+	      if (!psMetadataAddF32(md, PS_LIST_TAIL, field[i].name, 0, "", *(psF32 *)data)) {
+		psError(PS_ERR_UNKNOWN, false, "Failed to add item %s", field[i].name);
+		psFree(data);
+		psFree(md);
+		mysql_free_result(result);
+		psFree(resultSet);
+		return NULL;
+	      }
+	      break;
+	    case PS_DATA_F64:
+	      if (!psMetadataAddF64(md, PS_LIST_TAIL, field[i].name, 0, "", *(psF64 *)data)) {
+		psError(PS_ERR_UNKNOWN, false, "Failed to add item %s", field[i].name);
+		psFree(data);
+		psFree(md);
+		mysql_free_result(result);
+		psFree(resultSet);
+		return NULL;
+	      }
+	      break;
+	    case PS_DATA_BOOL:
+	      if (!psMetadataAddBool(md, PS_LIST_TAIL, field[i].name, 0, "", *(bool *)data)) {
+		psError(PS_ERR_UNKNOWN, false, "Failed to add item %s", field[i].name);
+		psFree(data);
+		psFree(md);
+		mysql_free_result(result);
+		psFree(resultSet);
+		return NULL;
+	      }
+	      break;
+	    case PS_DATA_TIME:
+	      // just pass NULL values through as there is currently no
+	      // concept of a psTime with a NULL value
+	      if (!psMetadataAddTime(md, PS_LIST_TAIL, field[i].name, 0, "", NULL)) {
+		psError(PS_ERR_UNKNOWN, false, "Failed to add item %s", field[i].name);
+		psFree(data);
+		psFree(md);
+		mysql_free_result(result);
+		psFree(resultSet);
+		return NULL;
+	      }
+	      break;
+
+	    default:
+	      psError(PS_ERR_BAD_PARAMETER_TYPE , true,
+		      "field name: %s FIXME: Only type of "
+		      "PS_DATA_U8 (PS_DATA_U8), "
+		      "PS_DATA_U16 (PS_DATA_U16), "
+		      "PS_DATA_U32 (PS_DATA_U32), "
+		      "PS_DATA_U64 (PS_DATA_U64), "
+		      "PS_DATA_S8 (PS_DATA_S8), "
+		      "PS_DATA_S16 (PS_DATA_S16), "
+		      "PS_DATA_S32 (PS_DATA_S32), "
+		      "PS_DATA_S64 (PS_DATA_S64), "
+		      "PS_DATA_F32 (PS_DATA_F32), "
+		      "PS_DATA_F64 (PS_DATA_F64), "
+		      "PS_DATA_BOOL (PS_DATA_BOOL), "
+		      "PS_DATA_STRING "
+		      "and PS_DATA_TIME are supported.", field[i].name);
+	      psFree(data);
+	      psFree(md);
+	      mysql_free_result(result);
+	      psFree(resultSet);
+	      return NULL;
+	  }
+
+	  psFree(data);
+	  continue;
+	}
 
             switch (pType) {
