And now let's attach the updated patch too.
L.
Lenar L�hmus wrote:
> Hi,
>
> Next time I'll post patches in the morning after good sleep.
> Updated version attached. The original I sent is not useful.
>
> Lenar
>
>> Hi,
>>
>> I'v implemented new_link paramater (as in mysql_connect) for
>> mysql_pconnect().
Common subdirectories: old/libmysql and new/libmysql
diff -ub old/php_mysql.c new/php_mysql.c
--- old/php_mysql.c 2003-08-08 16:36:44.000000000 +0300
+++ new/php_mysql.c 2003-09-14 22:00:09.000000000 +0300
@@ -90,6 +90,10 @@
#define MYSQL_HAS_YEAR
#endif
+#if MYSQL_VERSION_ID >= 32303
+#define MYSQL_HAS_CHANGE_USER
+#endif
+
#define MYSQL_ASSOC 1<<0
#define MYSQL_NUM 1<<1
#define MYSQL_BOTH (MYSQL_ASSOC|MYSQL_NUM)
@@ -420,6 +424,10 @@
*/
PHP_RINIT_FUNCTION(mysql)
{
+#ifdef MYSQL_HAS_CHANGE_USER
+ ALLOC_HASHTABLE(MySG(inuse_list));
+ zend_hash_init(MySG(inuse_list), 1, NULL, NULL, 0);
+#endif
MySG(default_link)=-1;
MySG(num_links) = MySG(num_persistent);
/* Reset connect error/errno on every request */
@@ -442,10 +450,13 @@
php_error_docref("function.mysql-free-result" TSRMLS_CC, E_WARNING, tmp);
}
}
-
if (MySG(connect_error)!=NULL) {
efree(MySG(connect_error));
}
+#ifdef MYSQL_HAS_CHANGE_USER
+ zend_hash_destroy(MySG(inuse_list));
+ FREE_HASHTABLE(MySG(inuse_list));
+#endif
return SUCCESS;
}
/* }}} */
@@ -501,6 +512,7 @@
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;
long connect_timeout;
+ list_entry *inuse_le=NULL;
connect_timeout = MySG(connect_timeout);
@@ -513,9 +525,6 @@
}
host_and_port=passwd=NULL;
user=php_get_current_user();
- 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);
@@ -575,9 +584,16 @@
}
break;
case 5: {
+ if (persistent) {
+ if (zend_get_parameters_ex(5, &z_host, &z_user, &z_passwd, &z_client_flags, &z_new_link) == FAILURE) {
+ MYSQL_DO_CONNECT_RETURN_FALSE();
+ }
+ }
+ else {
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);
convert_to_string_ex(z_passwd);
convert_to_boolean_ex(z_new_link);
@@ -610,11 +626,36 @@
}
}
}
+ }
+ if (!MySG(allow_persistent)) {
+ persistent=0;
+ }
+
+#ifdef MYSQL_HAS_CHANGE_USER
+ if (!(new_link && persistent)) {
+#endif
+ if (PG(sql_safe_mode)) {
+ hashed_details_length = strlen(user)+5+3;
+ hashed_details = (char *) emalloc(hashed_details_length+1);
+ sprintf(hashed_details, "mysql__%s_", user);
+ } else {
hashed_details_length = sizeof("mysql___")-1 + strlen(SAFE_STRING(host_and_port))+strlen(SAFE_STRING(user))+strlen(SAFE_STRING(passwd));
hashed_details = (char *) emalloc(hashed_details_length+1);
sprintf(hashed_details, "mysql_%s_%s_%s", SAFE_STRING(host_and_port), SAFE_STRING(user), SAFE_STRING(passwd));
}
+#ifdef MYSQL_HAS_CHANGE_USER
+ } else {
+ long count = 0;
+
+ if (zend_hash_find(MySG(inuse_list), SAFE_STRING(host_and_port), strlen(SAFE_STRING(host_and_port))+1, (void **) &inuse_le)==SUCCESS) {
+ count = (long) inuse_le->ptr;
+ }
+ hashed_details_length = sizeof("mysqlp__")-1 + strlen(SAFE_STRING(host_and_port)) + 10;
+ hashed_details = (char *) emalloc(hashed_details_length+1);
+ sprintf(hashed_details, "mysqlp_%s_%ld", SAFE_STRING(host_and_port), count);
+ }
+#endif
/* We cannot use mysql_port anymore in windows, need to use
* mysql_real_connect() to set the port.
@@ -641,9 +682,6 @@
mysql_port = port;
#endif
- if (!MySG(allow_persistent)) {
- persistent=0;
- }
if (persistent) {
list_entry *le;
@@ -698,6 +736,7 @@
MySG(num_links)++;
} else { /* The link is in our list of persistent connections */
if (Z_TYPE_P(le) != le_plink) {
+ efree(hashed_details);
MYSQL_DO_CONNECT_RETURN_FALSE();
}
/* ensure that the link did not die */
@@ -724,12 +763,43 @@
MYSQL_DO_CONNECT_RETURN_FALSE();
}
}
+#ifdef MYSQL_HAS_CHANGE_USER
+ else if (new_link) {
+ if (mysql_change_user(le->ptr, user, passwd, NULL)) { /* access denied probably */
+ if (MySG(connect_error)!=NULL) efree(MySG(connect_error));
+ MySG(connect_error)=estrdup(mysql_error(&((php_mysql_conn *)le->ptr)->conn));
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", MySG(connect_error));
+ MySG(connect_errno)=mysql_errno(&((php_mysql_conn *)le->ptr)->conn);
+ efree(hashed_details);
+ MYSQL_DO_CONNECT_RETURN_FALSE();
+ }
+ }
+#endif
+
#if MYSQL_VERSION_ID < 32231
signal(SIGPIPE, handler);
#endif
mysql = (php_mysql_conn *) le->ptr;
}
+
+#ifdef MYSQL_HAS_CHANGE_USER
+ if (new_link) {
+ if (inuse_le) { /* increase in use count for this host_and_port */
+ ((long)inuse_le->ptr)++;
+ } else {
+ list_entry new_inuse_le;
+
+ ((long) new_inuse_le.ptr) = 1; /* in use count */
+ if (zend_hash_update(MySG(inuse_list), SAFE_STRING(host_and_port), strlen(SAFE_STRING(host_and_port))+1, (void *) &new_inuse_le, sizeof(list_entry), NULL)==FAILURE) {
+ free(mysql);
+ efree(hashed_details);
+ MYSQL_DO_CONNECT_RETURN_FALSE();
+ }
+ }
+ }
+#endif
+
ZEND_REGISTER_RESOURCE(return_value, mysql, le_plink);
} else { /* non persistent */
list_entry *index_ptr, new_index_ptr;
@@ -1278,7 +1348,7 @@
RETURN_FALSE;
}
#endif
- if(use_store == MYSQL_USE_RESULT) {
+ if (use_store == MYSQL_USE_RESULT) {
mysql_result=mysql_use_result(&mysql->conn);
} else {
mysql_result=mysql_store_result(&mysql->conn);
diff -ub old/php_mysql.h new/php_mysql.h
--- old/php_mysql.h 2002-12-31 18:35:00.000000000 +0200
+++ new/php_mysql.h 2003-09-14 19:11:49.000000000 +0300
@@ -105,6 +105,7 @@
long connect_timeout;
long result_allocated;
long trace_mode;
+ HashTable *inuse_list;
ZEND_END_MODULE_GLOBALS(mysql)
#ifdef ZTS
--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php