]> granicus.if.org Git - php/commitdiff
fix #38996 (PDO_MYSQL doesn't check connections for liveness)
authorAntony Dovgal <tony2001@php.net>
Mon, 2 Oct 2006 22:07:58 +0000 (22:07 +0000)
committerAntony Dovgal <tony2001@php.net>
Mon, 2 Oct 2006 22:07:58 +0000 (22:07 +0000)
ext/pdo_mysql/mysql_driver.c

index d394c0e79a4758d9e35b105cb15e919eff9b1406..8d68b4e63e107753ed4db7e2c9a3ba4738daf25a 100755 (executable)
@@ -368,6 +368,34 @@ static int pdo_mysql_get_attribute(pdo_dbh_t *dbh, long attr, zval *return_value
        return 1;
 }
 
+static int pdo_mysql_check_liveness(pdo_dbh_t *dbh TSRMLS_DC) /* {{{ */
+{
+       pdo_mysql_db_handle *H = (pdo_mysql_db_handle *)dbh->driver_data;
+#if MYSQL_VERSION_ID <= 32230
+       void (*handler) (int);
+       unsigned int my_errno;
+#endif
+
+#if MYSQL_VERSION_ID > 32230
+       if (mysql_ping(H->server)) {
+               return FAILURE;
+       }
+#else /* no mysql_ping() */
+       handler=signal(SIGPIPE, SIG_IGN);
+       mysql_stat(H->server);
+       switch (mysql_errno(H->server)) {
+               case CR_SERVER_GONE_ERROR:
+               /* case CR_SERVER_LOST: I'm not sure this means the same as "gone" for us */
+                       signal(SIGPIPE, handler);
+                       return FAILURE;
+               default:
+                       break;
+       }
+       signal(SIGPIPE, handler);
+#endif /* end mysql_ping() */
+       return SUCCESS;
+} 
+/* }}} */
 
 static struct pdo_dbh_methods mysql_methods = {
        mysql_handle_closer,
@@ -381,7 +409,7 @@ static struct pdo_dbh_methods mysql_methods = {
        pdo_mysql_last_insert_id,
        pdo_mysql_fetch_error_func,
        pdo_mysql_get_attribute,
-       NULL /* check_liveness: TODO: ping */
+       pdo_mysql_check_liveness
 };
 
 #ifndef PDO_MYSQL_UNIX_ADDR