IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Changeset 16694


Ignore:
Timestamp:
Feb 27, 2008, 3:25:44 PM (18 years ago)
Author:
jhoblitt
Message:

first attempt at implementing a prepared statement query cache

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/psLib/src/db/psDB.c

    r15615 r16694  
    2323 * 4.1.2 or newer is required.
    2424 *
    25  * $Id: psDB.c,v 1.148 2007-11-14 02:43:09 jhoblitt Exp $
     25 * $Id: psDB.c,v 1.149 2008-02-28 01:25:44 jhoblitt Exp $
    2626 */
    2727
     
    7878}
    7979psDBMysqlRow;
     80
     81// cache of prepared query statements
     82static pthread_mutex_t preparedQueryMutex = PTHREAD_MUTEX_INITIALIZER;
     83static psHash *preparedQuery = NULL;
    8084
    8185static pthread_mutex_t lookupTableMutex = PTHREAD_MUTEX_INITIALIZER;
     
    852856    psString query = NULL;
    853857
     858    // start lock on query cache
     859    if (psMemGetThreadSafety()) {
     860        pthread_mutex_lock(&preparedQueryMutex);
     861    }
     862
     863    // initalize the prepared query cache
     864    if (!preparedQuery) {
     865        preparedQuery = psHashAlloc(10);
     866    }
     867
    854868    // generate query string
    855869    va_list ap;
     
    860874    psTrace("psLib.db", PS_LOG_INFO, "Preparing SQL:\n%s", query);
    861875
    862     // Prepare SQL statement
    863     MYSQL_STMT *stmt = mysql_stmt_init(dbh->mysql);
     876    // check the query cache
     877    MYSQL_STMT *stmt = psHashLookup(preparedQuery, query);
    864878    if (!stmt) {
    865         psAbort("mysql_stmt_init(), out of memory.");
    866     }
    867     if (mysql_stmt_prepare(stmt, query, (unsigned long)strlen(query))) {
    868         psError(PS_ERR_UNKNOWN, true, "Failed to prepare query.  Error: %s", mysql_stmt_error(stmt));
    869         mysql_stmt_close(stmt);
    870         psFree(query);
    871         return -1;
     879        psTrace("psLib.db", PS_LOG_INFO, "statment is not in query cache");
     880        // Prepare SQL statement
     881        MYSQL_STMT *stmt = mysql_stmt_init(dbh->mysql);
     882        if (!stmt) {
     883            psAbort("mysql_stmt_init(), out of memory.");
     884        }
     885        if (mysql_stmt_prepare(stmt, query, (unsigned long)strlen(query))) {
     886            psError(PS_ERR_UNKNOWN, true, "Failed to prepare query.  Error: %s", mysql_stmt_error(stmt));
     887            mysql_stmt_close(stmt);
     888            psFree(query);
     889
     890            // end lock on query cache
     891            if (psMemGetThreadSafety()) {
     892                pthread_mutex_unlock(&preparedQueryMutex);
     893            }
     894
     895            return -1;
     896        }
     897
     898        // add this statement to the cache
     899        psHashAdd(preparedQuery, query, stmt);
     900    } else {
     901        psTrace("psLib.db", PS_LOG_INFO, "found statment in query cache");
     902    }
     903
     904    // end lock on query cache
     905    if (psMemGetThreadSafety()) {
     906        pthread_mutex_unlock(&preparedQueryMutex);
    872907    }
    873908
Note: See TracChangeset for help on using the changeset viewer.