Index: trunk/psLib/src/db/psDB.c
===================================================================
--- trunk/psLib/src/db/psDB.c	(revision 16679)
+++ trunk/psLib/src/db/psDB.c	(revision 16694)
@@ -23,5 +23,5 @@
  * 4.1.2 or newer is required.
  *
- * $Id: psDB.c,v 1.148 2007-11-14 02:43:09 jhoblitt Exp $
+ * $Id: psDB.c,v 1.149 2008-02-28 01:25:44 jhoblitt Exp $
  */
 
@@ -78,4 +78,8 @@
 }
 psDBMysqlRow;
+
+// cache of prepared query statements
+static pthread_mutex_t preparedQueryMutex = PTHREAD_MUTEX_INITIALIZER;
+static psHash *preparedQuery = NULL;
 
 static pthread_mutex_t lookupTableMutex = PTHREAD_MUTEX_INITIALIZER;
@@ -852,4 +856,14 @@
     psString query = NULL;
 
+    // start lock on query cache
+    if (psMemGetThreadSafety()) {
+        pthread_mutex_lock(&preparedQueryMutex);
+    }
+
+    // initalize the prepared query cache
+    if (!preparedQuery) {
+        preparedQuery = psHashAlloc(10);
+    }
+
     // generate query string
     va_list ap;
@@ -860,14 +874,35 @@
     psTrace("psLib.db", PS_LOG_INFO, "Preparing SQL:\n%s", query);
 
-    // Prepare SQL statement
-    MYSQL_STMT *stmt = mysql_stmt_init(dbh->mysql);
+    // check the query cache
+    MYSQL_STMT *stmt = psHashLookup(preparedQuery, query);
     if (!stmt) {
-        psAbort("mysql_stmt_init(), out of memory.");
-    }
-    if (mysql_stmt_prepare(stmt, query, (unsigned long)strlen(query))) {
-        psError(PS_ERR_UNKNOWN, true, "Failed to prepare query.  Error: %s", mysql_stmt_error(stmt));
-        mysql_stmt_close(stmt);
-        psFree(query);
-        return -1;
+        psTrace("psLib.db", PS_LOG_INFO, "statment is not in query cache");
+        // Prepare SQL statement
+        MYSQL_STMT *stmt = mysql_stmt_init(dbh->mysql);
+        if (!stmt) {
+            psAbort("mysql_stmt_init(), out of memory.");
+        }
+        if (mysql_stmt_prepare(stmt, query, (unsigned long)strlen(query))) {
+            psError(PS_ERR_UNKNOWN, true, "Failed to prepare query.  Error: %s", mysql_stmt_error(stmt));
+            mysql_stmt_close(stmt);
+            psFree(query);
+
+            // end lock on query cache
+            if (psMemGetThreadSafety()) {
+                pthread_mutex_unlock(&preparedQueryMutex);
+            }
+
+            return -1;
+        }
+
+        // add this statement to the cache
+        psHashAdd(preparedQuery, query, stmt);
+    } else {
+        psTrace("psLib.db", PS_LOG_INFO, "found statment in query cache");
+    }
+
+    // end lock on query cache
+    if (psMemGetThreadSafety()) {
+        pthread_mutex_unlock(&preparedQueryMutex);
     }
 
