IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Changeset 16695


Ignore:
Timestamp:
Feb 27, 2008, 4:02:47 PM (18 years ago)
Author:
jhoblitt
Message:

fix query cache memory corruption

File:
1 edited

Legend:

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

    r16694 r16695  
    2323 * 4.1.2 or newer is required.
    2424 *
    25  * $Id: psDB.c,v 1.149 2008-02-28 01:25:44 jhoblitt Exp $
     25 * $Id: psDB.c,v 1.150 2008-02-28 02:02:47 jhoblitt Exp $
    2626 */
    2727
     
    8080
    8181// cache of prepared query statements
    82 static pthread_mutex_t preparedQueryMutex = PTHREAD_MUTEX_INITIALIZER;
     82// static pthread_mutex_t preparedQueryMutex = PTHREAD_MUTEX_INITIALIZER;
    8383static psHash *preparedQuery = NULL;
    8484
     
    857857
    858858    // start lock on query cache
    859     if (psMemGetThreadSafety()) {
    860         pthread_mutex_lock(&preparedQueryMutex);
    861     }
     859//    if (psMemGetThreadSafety()) {
     860//        pthread_mutex_lock(&preparedQueryMutex);
     861//    }
    862862
    863863    // initalize the prepared query cache
     
    875875
    876876    // check the query cache
    877     MYSQL_STMT *stmt = psHashLookup(preparedQuery, query);
     877    MYSQL_STMT **stmt = psHashLookup(preparedQuery, query);
    878878    if (!stmt) {
    879879        psTrace("psLib.db", PS_LOG_INFO, "statment is not in query cache");
     880
    880881        // Prepare SQL statement
    881         MYSQL_STMT *stmt = mysql_stmt_init(dbh->mysql);
     882        stmt = psAlloc(sizeof(MYSQL_STMT *));
     883        *stmt = mysql_stmt_init(dbh->mysql);
    882884        if (!stmt) {
    883885            psAbort("mysql_stmt_init(), out of memory.");
    884886        }
    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);
     887        if (mysql_stmt_prepare(*stmt, query, (unsigned long)strlen(query))) {
     888            psError(PS_ERR_UNKNOWN, true, "Failed to prepare query.  Error: %s", mysql_stmt_error(*stmt));
     889            mysql_stmt_close(*stmt);
    888890            psFree(query);
    889891
    890892            // end lock on query cache
    891             if (psMemGetThreadSafety()) {
    892                 pthread_mutex_unlock(&preparedQueryMutex);
    893             }
     893//            if (psMemGetThreadSafety()) {
     894//                pthread_mutex_unlock(&preparedQueryMutex);
     895//            }
    894896
    895897            return -1;
     
    903905
    904906    // end lock on query cache
    905     if (psMemGetThreadSafety()) {
    906         pthread_mutex_unlock(&preparedQueryMutex);
    907     }
     907//    if (psMemGetThreadSafety()) {
     908//        pthread_mutex_unlock(&preparedQueryMutex);
     909//    }
    908910
    909911    psFree(query);
    910912
    911913    // how many place holders are in our query
    912     psS32 paramCount = mysql_stmt_param_count(stmt);
     914    psS32 paramCount = mysql_stmt_param_count(*stmt);
    913915
    914916    // structure large enough to hold one field of data per place holder
     
    923925
    924926            psFree(mysqlRow);
    925             mysql_stmt_close(stmt);
     927//            mysql_stmt_close(stmt);
    926928
    927929            return -1;
     
    934936        }
    935937
    936         if (mysql_stmt_bind_param(stmt, mysqlRow->bind)) {
    937             psError(PS_ERR_UNKNOWN, true, "Failed to bind params.  Error: %s", mysql_stmt_error(stmt));
     938        if (mysql_stmt_bind_param(*stmt, mysqlRow->bind)) {
     939            psError(PS_ERR_UNKNOWN, true, "Failed to bind params.  Error: %s", mysql_stmt_error(*stmt));
    938940
    939941            psFree(mysqlRow);
    940             mysql_stmt_close(stmt);
     942//           mysql_stmt_close(stmt);
    941943
    942944            return -1;
    943945        }
    944946
    945         if (mysql_stmt_execute(stmt)) {
    946             psError(PS_ERR_UNKNOWN, true, "Failed to execute prepared statement.  Error: %s", mysql_stmt_error(stmt));
     947        if (mysql_stmt_execute(*stmt)) {
     948            psError(PS_ERR_UNKNOWN, true, "Failed to execute prepared statement.  Error: %s", mysql_stmt_error(*stmt));
    947949
    948950            psFree(mysqlRow);
    949             mysql_stmt_close(stmt);
     951//            mysql_stmt_close(stmt);
    950952
    951953            return -1;
     
    960962
    961963    // FYI mysql_stmt_affected_rows() must be called before a commit
    962     long rowsAffected = mysql_stmt_affected_rows(stmt);
    963 
    964     mysql_stmt_close(stmt);
     964    long rowsAffected = mysql_stmt_affected_rows(*stmt);
     965
     966//    mysql_stmt_close(stmt);
    965967
    966968    return rowsAffected;
Note: See TracChangeset for help on using the changeset viewer.