summaryrefslogtreecommitdiff
path: root/ext/mysql/php_mysql.c
diff options
context:
space:
mode:
authorGeorg Richter <georg@php.net>2002-07-10 13:16:24 +0000
committerGeorg Richter <georg@php.net>2002-07-10 13:16:24 +0000
commit05007b0cbb4a86543965820f7f3d50039decf1a5 (patch)
treee3faa2453705917178caafbd769a00d9ab1118aa /ext/mysql/php_mysql.c
parentb627e6e41333afcbf1dfcbfdc6348250847b83bd (diff)
downloadphp-git-05007b0cbb4a86543965820f7f3d50039decf1a5.tar.gz
1) New constants:
MYSQL_CLIENT_SSL for ssl connections MYSQL_CLIENT_COMPRESS for compressed protocol MYSQL_CLIENT_IGNORE_SPACES for spaces after function names MYSQL_CLIENT_INTERACTIVE for closing connections after timeout_interactive seconds 2) Optional parameter client_flags for mysql_connect and mysql_pconnect For parameter desctiption see 1. This also should fix bug #13589 3) New internal function _rollback_mysql_transactions, which is called via PHP_RSHUTDOWN_FUNCTION This fixes bug #12513
Diffstat (limited to 'ext/mysql/php_mysql.c')
-rw-r--r--ext/mysql/php_mysql.c63
1 files changed, 58 insertions, 5 deletions
diff --git a/ext/mysql/php_mysql.c b/ext/mysql/php_mysql.c
index 00b8f4ac1f..3cb4d543e9 100644
--- a/ext/mysql/php_mysql.c
+++ b/ext/mysql/php_mysql.c
@@ -114,6 +114,24 @@ typedef struct _php_mysql_conn {
int active_result_id;
} php_mysql_conn;
+static int _rollback_mysql_transactions(zend_rsrc_list_entry *rsrc TSRMLS_DC)
+{
+ php_mysql_conn *link;
+ char query[128];
+ int i;
+
+ /* check if its a persistent link */
+ if (Z_TYPE_P(rsrc) != le_plink)
+ return 0;
+
+ link = (php_mysql_conn *) rsrc->ptr;
+
+ /* rollback possible transactions */
+ strcpy (query, "ROLLBACK");
+ mysql_real_query(&link->conn, query, strlen(query));
+
+ return 0;
+}
/* {{{ mysql_functions[]
*/
@@ -235,6 +253,8 @@ static void _free_mysql_result(zend_rsrc_list_entry *rsrc TSRMLS_DC)
}
/* }}} */
+
+
/* {{{ php_mysql_set_default_link
*/
static void php_mysql_set_default_link(int id TSRMLS_DC)
@@ -349,6 +369,11 @@ ZEND_MODULE_STARTUP_D(mysql)
REGISTER_LONG_CONSTANT("MYSQL_BOTH", MYSQL_BOTH, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("MYSQL_USE_RESULT", MYSQL_USE_RESULT, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("MYSQL_STORE_RESULT", MYSQL_STORE_RESULT, CONST_CS | CONST_PERSISTENT);
+ REGISTER_LONG_CONSTANT("MYSQL_CLIENT_COMPRESS", CLIENT_COMPRESS, CONST_CS | CONST_PERSISTENT);
+ REGISTER_LONG_CONSTANT("MYSQL_CLIENT_SSL", CLIENT_SSL, CONST_CS | CONST_PERSISTENT);
+ REGISTER_LONG_CONSTANT("MYSQL_CLIENT_INTERACTIVE", CLIENT_INTERACTIVE, CONST_CS | CONST_PERSISTENT);
+ REGISTER_LONG_CONSTANT("MYSQL_CLIENT_IGNORE_SPACE", CLIENT_IGNORE_SPACE, CONST_CS | CONST_PERSISTENT);
+
#ifdef ZTS
# if MYSQL_VERSION_ID >= 40000
@@ -392,6 +417,8 @@ PHP_RINIT_FUNCTION(mysql)
*/
PHP_RSHUTDOWN_FUNCTION(mysql)
{
+ zend_hash_apply(&EG(persistent_list), (apply_func_t) _rollback_mysql_transactions TSRMLS_CC);
+
if (MySG(connect_error)!=NULL) {
efree(MySG(connect_error));
}
@@ -441,9 +468,10 @@ static void php_mysql_do_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent)
char *user=NULL, *passwd=NULL, *host_and_port=NULL, *socket=NULL, *tmp=NULL, *host=NULL;
char *hashed_details=NULL;
int hashed_details_length, port = MYSQL_PORT;
+ int client_flags = 0;
php_mysql_conn *mysql=NULL;
void (*handler) (int);
- zval **z_host=NULL, **z_user=NULL, **z_passwd=NULL, **z_new_link=NULL;
+ zval **z_host=NULL, **z_user=NULL, **z_passwd=NULL, **z_new_link=NULL, **z_client_flags=NULL;
zend_bool free_host=0, new_link=0;
socket = MySG(default_socket);
@@ -457,6 +485,7 @@ static void php_mysql_do_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent)
hashed_details_length = strlen(user)+5+3;
hashed_details = (char *) emalloc(hashed_details_length+1);
sprintf(hashed_details, "mysql__%s_", user);
+ client_flags = CLIENT_INTERACTIVE;
} else {
host_and_port = MySG(default_host);
user = MySG(default_user);
@@ -490,7 +519,30 @@ static void php_mysql_do_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent)
}
break;
case 4: {
- if (zend_get_parameters_ex(4, &z_host, &z_user, &z_passwd, &z_new_link) == FAILURE) {
+ if (!persistent) {
+ if (zend_get_parameters_ex(4, &z_host, &z_user, &z_passwd, &z_new_link) == FAILURE) {
+ MYSQL_DO_CONNECT_RETURN_FALSE();
+ }
+ convert_to_string_ex(z_user);
+ convert_to_string_ex(z_passwd);
+ user = Z_STRVAL_PP(z_user);
+ passwd = Z_STRVAL_PP(z_passwd);
+ new_link = Z_BVAL_PP(z_new_link);
+ }
+ else {
+ if (zend_get_parameters_ex(4, &z_host, &z_user, &z_passwd, &z_client_flags) == FAILURE) {
+ MYSQL_DO_CONNECT_RETURN_FALSE();
+ }
+ convert_to_string_ex(z_user);
+ convert_to_string_ex(z_passwd);
+ user = Z_STRVAL_PP(z_user);
+ passwd = Z_STRVAL_PP(z_passwd);
+ client_flags = Z_LVAL_PP(z_client_flags);
+ }
+ }
+ break;
+ case 5: {
+ if (zend_get_parameters_ex(5, &z_host, &z_user, &z_passwd, &z_new_link, &z_client_flags) == FAILURE) {
MYSQL_DO_CONNECT_RETURN_FALSE();
}
convert_to_string_ex(z_user);
@@ -498,6 +550,7 @@ static void php_mysql_do_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent)
user = Z_STRVAL_PP(z_user);
passwd = Z_STRVAL_PP(z_passwd);
new_link = Z_BVAL_PP(z_new_link);
+ client_flags = Z_LVAL_PP(z_client_flags);
}
break;
default:
@@ -573,7 +626,7 @@ static void php_mysql_do_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent)
mysql->active_result_id = 0;
#if MYSQL_VERSION_ID > 32199 /* this lets us set the port number */
mysql_init(&mysql->conn);
- if (mysql_real_connect(&mysql->conn, host, user, passwd, NULL, port, socket, 0)==NULL) {
+ if (mysql_real_connect(&mysql->conn, host, user, passwd, NULL, port, socket, client_flags)==NULL) {
#else
if (mysql_connect(&mysql->conn, host, user, passwd)==NULL) {
#endif
@@ -613,7 +666,7 @@ static void php_mysql_do_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent)
#endif
signal(SIGPIPE, handler);
#if MYSQL_VERSION_ID > 32199 /* this lets us set the port number */
- if (mysql_real_connect(le->ptr, host, user, passwd, NULL, port, socket, 0)==NULL) {
+ if (mysql_real_connect(le->ptr, host, user, passwd, NULL, port, socket, client_flags)==NULL) {
#else
if (mysql_connect(le->ptr, host, user, passwd)==NULL) {
#endif
@@ -666,7 +719,7 @@ static void php_mysql_do_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent)
mysql->active_result_id = 0;
#if MYSQL_VERSION_ID > 32199 /* this lets us set the port number */
mysql_init(&mysql->conn);
- if (mysql_real_connect(&mysql->conn, host, user, passwd, NULL, port, socket, 0)==NULL) {
+ if (mysql_real_connect(&mysql->conn, host, user, passwd, NULL, port, socket, client_flags)==NULL) {
#else
if (mysql_connect(&mysql->conn, host, user, passwd)==NULL) {
#endif