I have had problems with PHP and MySQL and have made some changes. First
off, in http://bugs.php.net/bug.php?id=19529 MySQL is complaining about
things not being cleaned up. This is because any query that returns
results (which one's don't -- any?) must get them.

In case of an unbuffered query, we need to eat the rest of the rows
before exiting (like we do when a new query is run when an old
unbuffered query was not finished). I removed the warning in this case,
but you all can change it as you please.

The case that is hitting me (and EVERYONE out there using persistent
connections with current revs) is that there is a rollback. But there is
nothing to get the results of the rollback. This means, that the next
script to use this persistent connection will generally fail on the
first query, but might do alright on the others. For this reason, I
recommend anyone use PHP 4.2.3 (maybe later versions as well) to turn
off persistent connections for now.

Also, in CVS there is something to reset AUTOCOMMIT. It also did not
clean up and that causes additional issues. I removed it rather than
fixed it. Who says AUTOCOMMIT=1 should be the default for a certain
server? That is user configurable on the server side. Personally, I like
the idea of resetting all the variables that might have been changed
(including that one). There are a lot. No good way to do right now.

Oh, what else? Ah.. the code in CVS for mysql.connection.timeout. That
rocks! However, it sets the default to zero and then checks for -1 as a
sign not to include the option. Oops. So the default timeout value is
set to nothing when the user doesn't do anything. That is a
unpredictable change in behavior.

I have some changes below. My first time even looking at this code, so
look for any mistakes.

static int _restore_connection_defaults(zend_rsrc_list_entry *rsrc
TSRMLS_DC)
{
    php_mysql_conn *link;
    char    query[128];
    char    user[128];
    char    passwd[128];
 
    /* check if its a persistent link */
    if (Z_TYPE_P(rsrc) != le_plink) 
        return 0;

    link = (php_mysql_conn *) rsrc->ptr;

    if (link->active_result_id) do {
        int type;
        MYSQL_RES *mysql_result;
 
        mysql_result = (MYSQL_RES *)
zend_list_find(link->active_result_id, &type);
        if (mysql_result && type==le_result) {
            if (!mysql_eof(mysql_result)) {
                while (mysql_fetch_row(mysql_result));
            }
            zend_list_delete(link->active_result_id);
            link->active_result_id = 0;
        }
    } while(0);

    /* rollback possible transactions */
    strcpy (query, "ROLLBACK");
    if (mysql_real_query(&link->conn, query, strlen(query)) !=0 ) {
        MYSQL_RES *mysql_result=mysql_store_result(&link->conn);
        mysql_free_result(mysql_result);
    }

    /* unset the current selected db */
#if MYSQL_VERSION_ID > 32329
    strcpy (user, (char *)(&link->conn)->user);
    strcpy (passwd, (char *)(&link->conn)->passwd);
    mysql_change_user(&link->conn, user, passwd, "");
#endif

    return 0;       
}

And change the two copies of this:
    if (connect_timeout != -1)
to 
    if (connect_timeout <= 0)


My 2 cents for the day.

Sincerely,
Steven Roussey
http://Network54.com/?pp=e 



---------------------------------------------------------------------
Before posting, please check:
   http://www.mysql.com/manual.php   (the manual)
   http://lists.mysql.com/           (the list archive)

To request this thread, e-mail <[EMAIL PROTECTED]>
To unsubscribe, e-mail <[EMAIL PROTECTED]>
Trouble unsubscribing? Try: http://lists.mysql.com/php/unsubscribe.php

Reply via email to