From: Ralf Neubauer Date: October 18 2011 4:13pm Subject: DBD::mysql: no errstr under Windows List-Archive: http://lists.mysql.com/perl/4415 Message-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable Hi, as you may have seen in = https://rt.cpan.org/Public/Bug/Display.html?id=3D71047 or even in = http://bugs.activestate.com/show_bug.cgi?id=3D91026 there is no ->errstr = or ->err on the Windows platform, if ->execute failed. In DBD::mysql 4.018 the code at the end of mysql_st_internal_execute() = in dbdimp.c that executed the statement and transferred the error codes = looked like this: if ((mysql_real_query(svsock, sbuf, slen)) && (!mysql_db_reconnect(h) || (mysql_real_query(svsock, sbuf, slen)))) { Safefree(salloc); do_error(h, mysql_errno(svsock), mysql_error(svsock),=20 mysql_sqlstate(svsock)); if (DBIc_TRACE_LEVEL(imp_xxh) >=3D 2) PerlIO_printf(DBILOGFP, "IGNORING ERROR errno %d\n", errno); return -2; } Safefree(salloc); In 4.020 it looks like this (Note that MYSQL_ASYNC is 0 on the Windows = platform as defined in dbdimp.h): #if MYSQL_ASYNC if(async) { if((mysql_send_query(svsock, sbuf, slen)) && (!mysql_db_reconnect(h) || (mysql_send_query(svsock, sbuf, slen)))) { rows =3D -2; } else { rows =3D 0; } } else { #endif if ((mysql_real_query(svsock, sbuf, slen)) && (!mysql_db_reconnect(h) || (mysql_real_query(svsock, sbuf, slen)))) { rows =3D -2; } else { /** Store the result from the Query */ *result=3D use_mysql_use_result ? mysql_use_result(svsock) : mysql_store_result(svsock); if (mysql_errno(svsock)) do_error(h, mysql_errno(svsock), mysql_error(svsock) ,mysql_sqlstate(svsock)); if (!*result) rows=3D mysql_affected_rows(svsock); else rows=3D mysql_num_rows(*result); } #if MYSQL_ASYNC } Safefree(salloc); if(rows =3D=3D -2) { do_error(h, mysql_errno(svsock), mysql_error(svsock),=20 mysql_sqlstate(svsock)); if (DBIc_TRACE_LEVEL(imp_xxh) >=3D 2) PerlIO_printf(DBILOGFP, "IGNORING ERROR errno %d\n", errno); rows =3D -2; } #endif Instead of directly calling do_error(), the error is marked by setting = rows =3D -2. Whis is just returned, if MYSQL_ACTIVE is not set, without = calling do_error() before. I suggest to move the final #endif to execute the if(rows =3D=3D -2) = {...} handler even if MYSQL_ASYNC is 0. From the look of it, it may be = useful to unconditionally the Safefree(salloc) also. And why is rows set to -2 if rows =3D=3D -2? Ralf -- Ralf Neubauer Wissenschaftliches Institut der AOK (WIdO) Rosenthaler Stra=DFe 31 10178 Berlin Tel: 030 34646-2583 Fax: 030 34646-2144 E-Mail: Ralf.Neubauer@stripped