Index: /trunk/archive/psdb/psDB.c
===================================================================
--- /trunk/archive/psdb/psDB.c	(revision 3133)
+++ /trunk/archive/psdb/psDB.c	(revision 3134)
@@ -8,5 +8,6 @@
  *  @author Joshua Hoblitt
  *
- *  @version $Revision: 1.1 $ $Name: not supported by cvs2svn $ @date $Date: 2005-02-04 04:06:56 $
+ *  @version $Revision: 1.2 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2005-02-04 23:44:40 $
  *
  *  Copyright 2005 Joshua Hoblitt, University of Hawaii
@@ -17,7 +18,14 @@
 #include <math.h>
 #include <mysql/mysql.h>
+#include <mysql/mysql_com.h> // enum_field_types
 
 #include "psDB.h"
 #include "pslib.h"
+
+typedef struct
+{
+    psU32   type;
+    bool    isUnsigned;
+} mysqlType;
 
 static char *p_psDBIntToString(psU64 n);
@@ -29,4 +37,5 @@
 static psHash *p_psDBGetSQLToPSTable(void);
 static void p_psDBSQLToPSTableCleanup(void);
+static void p_psDBPSToMySQLTableCleanup(void);
 static size_t p_psStringAppend(char **dest, const char *source);
 static bool p_psDBRunQuery(psDB *dbh, const char *query);
@@ -39,4 +48,5 @@
 static char *p_psDBGenerateSelectColumnSQL(const char *tableName, const char *col, const psU64 limit);
 static char *p_psDBGenerateSelectRowsSQL(const char *tableName, psMetadata *where);
+static psPtr p_psDBAllocMySQLType(enum enum_field_types type, bool isUnsigned);
 
 psDB *psDBInit(const char *host, const char *user, const char *passwd, const char *dbname)
@@ -70,4 +80,5 @@
     p_psDBPSToSQLTableCleanup();
     p_psDBSQLToPSTableCleanup();
+    p_psDBPSToMySQLTableCleanup();
 }
 
@@ -428,5 +439,7 @@
 {
     char            *query;
-    MYSQL_STMT      *sth;
+    MYSQL_STMT      *stmt;
+    MYSQL_BIND      *bind;
+    psU32           paramCount;
 
     query = p_psDBGenerateInsertRowSQL(tableName, row);
@@ -434,6 +447,44 @@
     fprintf(stderr, "complete query is: %s\n", query);
 
-    sth = mysql_stmt_init(dbh->mysql);
-
+    stmt = mysql_stmt_init(dbh->mysql);
+    if (!stmt) {
+        // call abort?
+        fprintf(stderr, " mysql_stmt_init(), out of memory\n");
+
+        return false;
+    }
+
+    if (mysql_stmt_prepare(stmt, query, (unsigned long)strlen(query))) {
+            fprintf(stderr, "Failed to prepare query.  Error: %s\n", mysql_stmt_error(stmt));
+
+            mysql_stmt_close(stmt);
+            psFree(query);
+
+            return false;
+    }
+
+    paramCount = (psU32)mysql_stmt_param_count(stmt);
+
+    bind = psAlloc(sizeof(MYSQL_BIND) * paramCount);
+
+    memset(bind, 0, sizeof(MYSQL_BIND) * paramCount);
+
+    if (mysql_stmt_bind_param(stmt, bind)) {
+        fprintf(stderr, "Failed to bind params.  Error: %s\n", mysql_stmt_error(stmt));
+
+        psFree(bind);
+        mysql_stmt_close(stmt);
+        psFree(query);
+
+        return false;
+    }
+
+    bind[0].buffer_type;
+    bind[0].is_null;
+    bind[0].is_unsigned;
+
+    mysql_commit(dbh->mysql);
+
+    mysql_stmt_close(stmt);
     psFree(query);
 
@@ -478,7 +529,7 @@
     }
 
+    psFree(cursor);
+
     p_psStringAppend(&query, ")");
-
-    psFree(cursor);
 
     return query;
@@ -722,8 +773,8 @@
             break;
         case PS_TYPE_S32:
-            PTYPETOSTRING(psS32, "%li");
+            PTYPETOSTRING(psS32, "%i");
             break;
         case PS_TYPE_S64:
-            PTYPETOSTRING(psS64, "%lli");
+            PTYPETOSTRING(psS64, "%li");
             break;
         case PS_TYPE_U8:
@@ -734,8 +785,8 @@
             break;
         case PS_TYPE_U32:
-            PTYPETOSTRING(psU32, "%lu");
+            PTYPETOSTRING(psU32, "%u");
             break;
         case PS_TYPE_U64:
-            PTYPETOSTRING(psU64, "%llu");
+            PTYPETOSTRING(psU64, "%lu");
             break;
         case PS_TYPE_F32:
@@ -752,6 +803,8 @@
             break;
         case PS_TYPE_BOOL:
+            PTYPETOSTRING(bool, "%u");
             break;
         case PS_TYPE_PTR:
+            // unsafe to convert unless it's a string
             break;
     }
@@ -937,4 +990,54 @@
 }
 
+static psHash *p_psDBGetPSToMySQLTable(void)
+{
+    static psHash   *lookupTable = NULL;
+
+    if (!lookupTable) {
+        lookupTable = psHashAlloc(16);
+
+        p_psDBAddToLookupTable(lookupTable, PS_TYPE_S8,     p_psDBAllocMySQLType(MYSQL_TYPE_TINY,       false));
+        p_psDBAddToLookupTable(lookupTable, PS_TYPE_S16,    p_psDBAllocMySQLType(MYSQL_TYPE_SHORT,      false));
+        p_psDBAddToLookupTable(lookupTable, PS_TYPE_S32,    p_psDBAllocMySQLType(MYSQL_TYPE_LONG,       false));
+        p_psDBAddToLookupTable(lookupTable, PS_TYPE_S64,    p_psDBAllocMySQLType(MYSQL_TYPE_LONGLONG,   false));
+        p_psDBAddToLookupTable(lookupTable, PS_TYPE_U8,     p_psDBAllocMySQLType(MYSQL_TYPE_TINY,       true));
+        p_psDBAddToLookupTable(lookupTable, PS_TYPE_U16,    p_psDBAllocMySQLType(MYSQL_TYPE_SHORT,      true));
+        p_psDBAddToLookupTable(lookupTable, PS_TYPE_U32,    p_psDBAllocMySQLType(MYSQL_TYPE_LONG,       true));
+        p_psDBAddToLookupTable(lookupTable, PS_TYPE_U64,    p_psDBAllocMySQLType(MYSQL_TYPE_LONGLONG,   true));
+        p_psDBAddToLookupTable(lookupTable, PS_TYPE_F32,    p_psDBAllocMySQLType(MYSQL_TYPE_FLOAT,      false));
+        p_psDBAddToLookupTable(lookupTable, PS_TYPE_F64,    p_psDBAllocMySQLType(MYSQL_TYPE_DOUBLE,     false));
+        p_psDBAddToLookupTable(lookupTable, PS_TYPE_C32,    NULL);  // unsupported
+        p_psDBAddToLookupTable(lookupTable, PS_TYPE_C64,    NULL);  // unsupported
+        p_psDBAddToLookupTable(lookupTable, PS_TYPE_BOOL,   p_psDBAllocMySQLType(MYSQL_TYPE_TINY,       true));
+        p_psDBAddToLookupTable(lookupTable, PS_TYPE_PTR,    p_psDBAllocMySQLType(MYSQL_TYPE_VAR_STRING, false));
+    }
+
+    // simulate true ref counting
+    psMemIncrRefCounter(lookupTable);
+
+    return lookupTable;
+}
+
+static psPtr p_psDBAllocMySQLType(enum enum_field_types type, bool isUnsigned)
+{
+    mysqlType       *mType;
+
+    mType = psAlloc(sizeof(mysqlType));
+    mType->type       = type;
+    mType->isUnsigned = isUnsigned;
+
+    return (psPtr)mType;
+}
+
+static void p_psDBPSToMySQLTableCleanup(void)
+{
+    psHash          *lookupTable;
+
+    lookupTable = p_psDBGetPSToMySQLTable();
+
+    psMemDecrRefCounter(lookupTable);
+    psFree(lookupTable);
+}
+
 static void p_psDBAddToLookupTable(psHash *lookupTable, const psU32 type, const char *string)
 {
@@ -961,5 +1064,5 @@
                : 2;
     string = psAlloc(length);
-    sprintf(string, "%lli", n);
+    sprintf(string, "%li", n);
 
     return string;
