|
|
|
@ -296,229 +296,6 @@ err: |
|
|
|
PHP_FUNCTION(mysqli_connect) |
|
|
|
{ |
|
|
|
mysqli_common_connect(INTERNAL_FUNCTION_PARAM_PASSTHRU, FALSE); |
|
|
|
#if 0 |
|
|
|
MY_MYSQL *mysql = NULL; |
|
|
|
MYSQLI_RESOURCE *mysqli_resource = NULL; |
|
|
|
zval *object = getThis(); |
|
|
|
char *hostname = NULL, *username=NULL, *passwd=NULL, *dbname=NULL, *socket=NULL; |
|
|
|
unsigned int hostname_len = 0, username_len = 0, passwd_len = 0, dbname_len = 0, socket_len = 0; |
|
|
|
zend_bool persistent = FALSE; |
|
|
|
long port = 0; |
|
|
|
uint hash_len; |
|
|
|
char *hash_key = NULL; |
|
|
|
zend_bool new_connection = FALSE; |
|
|
|
zend_rsrc_list_entry *le; |
|
|
|
mysqli_plist_entry *plist = NULL; |
|
|
|
|
|
|
|
if (getThis() && !ZEND_NUM_ARGS()) { |
|
|
|
RETURN_NULL(); |
|
|
|
} |
|
|
|
|
|
|
|
hostname = username = dbname = passwd = socket = NULL; |
|
|
|
|
|
|
|
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|s&s&s&s&ls&", &hostname, &hostname_len, UG(utf8_conv), |
|
|
|
&username, &username_len, UG(utf8_conv), &passwd, &passwd_len, UG(utf8_conv), |
|
|
|
&dbname, &dbname_len, UG(utf8_conv), &port, &socket, &socket_len, UG(utf8_conv)) == FAILURE) { |
|
|
|
return; |
|
|
|
} |
|
|
|
|
|
|
|
if (!socket_len || !socket) { |
|
|
|
socket = MyG(default_socket); |
|
|
|
} |
|
|
|
|
|
|
|
if (!passwd) { |
|
|
|
passwd = MyG(default_pw); |
|
|
|
passwd_len = strlen(SAFE_STR(passwd)); |
|
|
|
} |
|
|
|
if (!username){ |
|
|
|
username = MyG(default_user); |
|
|
|
} |
|
|
|
if (!hostname || !hostname_len) { |
|
|
|
hostname = MyG(default_host); |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if (object && instanceof_function(Z_OBJCE_P(object), mysqli_link_class_entry TSRMLS_CC)) { |
|
|
|
mysqli_resource = ((mysqli_object *) zend_object_store_get_object(object TSRMLS_CC))->ptr; |
|
|
|
if (mysqli_resource && mysqli_resource->ptr && |
|
|
|
mysqli_resource->status >= MYSQLI_STATUS_INITIALIZED) |
|
|
|
{ |
|
|
|
mysql = (MY_MYSQL*)mysqli_resource->ptr; |
|
|
|
php_clear_mysql(mysql); |
|
|
|
if (mysql->mysql) { |
|
|
|
mysqli_close(mysql->mysql, MYSQLI_CLOSE_EXPLICIT); |
|
|
|
mysql->mysql = NULL; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
if (!mysql) { |
|
|
|
mysql = (MY_MYSQL *) ecalloc(1, sizeof(MY_MYSQL)); |
|
|
|
} |
|
|
|
|
|
|
|
if (strlen(SAFE_STR(hostname)) > 2 && !strncasecmp(hostname, "p:", 2)) { |
|
|
|
hostname += 2; |
|
|
|
if (!MyG(allow_persistent)) { |
|
|
|
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Persistent connections are disabled. Downgrading to normal"); |
|
|
|
} else { |
|
|
|
mysql->persistent = persistent = TRUE; |
|
|
|
|
|
|
|
if (!strlen(hostname)) { |
|
|
|
hostname = MyG(default_host); |
|
|
|
} |
|
|
|
|
|
|
|
hash_len = spprintf(&hash_key, 0, "mysqli_%s%ld%s%s%s", SAFE_STR(hostname), |
|
|
|
port, SAFE_STR(username), SAFE_STR(dbname), |
|
|
|
SAFE_STR(passwd)); |
|
|
|
|
|
|
|
mysql->hash_key = hash_key; |
|
|
|
|
|
|
|
/* check if we can reuse exisiting connection ... */ |
|
|
|
if (zend_hash_find(&EG(persistent_list), hash_key, hash_len + 1, (void **)&le) == SUCCESS) { |
|
|
|
if (Z_TYPE_P(le) == php_le_pmysqli()) { |
|
|
|
plist = (mysqli_plist_entry *) le->ptr; |
|
|
|
|
|
|
|
do { |
|
|
|
if (zend_ptr_stack_num_elements(&plist->free_links)) { |
|
|
|
mysql->mysql = zend_ptr_stack_pop(&plist->free_links); |
|
|
|
|
|
|
|
MyG(num_inactive_persistent)--; |
|
|
|
/* reset variables */ |
|
|
|
/* todo: option for ping or change_user */ |
|
|
|
#if G0 |
|
|
|
if (!mysql_change_user(mysql->mysql, username, passwd, dbname)) { |
|
|
|
#else |
|
|
|
if (!mysql_ping(mysql->mysql)) { |
|
|
|
#endif |
|
|
|
#ifdef HAVE_MYSQLND |
|
|
|
mysqlnd_restart_psession(mysql->mysql); |
|
|
|
#endif |
|
|
|
MyG(num_active_persistent)++; |
|
|
|
goto end; |
|
|
|
} else { |
|
|
|
#if defined(HAVE_MYSQLND) |
|
|
|
mysqlnd_end_psession(mysql->mysql); |
|
|
|
#endif |
|
|
|
mysqli_close(mysql->mysql, MYSQLI_CLOSE_IMPLICIT); |
|
|
|
mysql->mysql = NULL; |
|
|
|
} |
|
|
|
} |
|
|
|
} while (0); |
|
|
|
} |
|
|
|
} else { |
|
|
|
zend_rsrc_list_entry le; |
|
|
|
le.type = php_le_pmysqli(); |
|
|
|
le.ptr = plist = calloc(1, sizeof(mysqli_plist_entry)); |
|
|
|
|
|
|
|
zend_ptr_stack_init_ex(&plist->free_links, 1); |
|
|
|
zend_hash_update(&EG(persistent_list), hash_key, hash_len + 1, (void *)&le, sizeof(le), NULL); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
if (MyG(max_links) != -1 && MyG(num_links) >= MyG(max_links)) { |
|
|
|
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Too many open links (%ld)", MyG(num_links)); |
|
|
|
goto err; |
|
|
|
} |
|
|
|
if (persistent && MyG(max_persistent) != -1 && |
|
|
|
(MyG(num_active_persistent) + MyG(num_inactive_persistent))>= MyG(max_persistent)) |
|
|
|
{ |
|
|
|
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Too many open persistent links (%ld)", |
|
|
|
MyG(num_active_persistent) + MyG(num_inactive_persistent)); |
|
|
|
goto err; |
|
|
|
} |
|
|
|
|
|
|
|
#if !defined(HAVE_MYSQLND) |
|
|
|
if (!(mysql->mysql = mysql_init(NULL))) { |
|
|
|
#else |
|
|
|
if (!(mysql->mysql = mysqlnd_init(persistent))) { |
|
|
|
#endif |
|
|
|
goto err; |
|
|
|
} |
|
|
|
new_connection = TRUE; |
|
|
|
|
|
|
|
if (UG(unicode)) { |
|
|
|
mysql_options(mysql->mysql, MYSQL_SET_CHARSET_NAME, "utf8"); |
|
|
|
} |
|
|
|
|
|
|
|
#ifdef HAVE_EMBEDDED_MYSQLI |
|
|
|
if (hostname_len) { |
|
|
|
unsigned int external=1; |
|
|
|
mysql_options(mysql->mysql, MYSQL_OPT_USE_REMOTE_CONNECTION, (char *)&external); |
|
|
|
} else { |
|
|
|
mysql_options(mysql->mysql, MYSQL_OPT_USE_EMBEDDED_CONNECTION, 0); |
|
|
|
} |
|
|
|
#endif |
|
|
|
|
|
|
|
#if !defined(HAVE_MYSQLND) |
|
|
|
if (mysql_real_connect(mysql->mysql, hostname, username, passwd, dbname, port, socket, CLIENT_MULTI_RESULTS) == NULL) |
|
|
|
#else |
|
|
|
if (mysqlnd_connect(mysql->mysql, hostname, username, passwd, passwd_len, dbname, dbname_len, |
|
|
|
port, socket, CLIENT_MULTI_RESULTS, MyG(mysqlnd_thd_zval_cache) TSRMLS_CC) == NULL) |
|
|
|
#endif |
|
|
|
{ |
|
|
|
/* Save error messages */ |
|
|
|
php_mysqli_set_error(mysql_errno(mysql->mysql), (char *) mysql_error(mysql->mysql) TSRMLS_CC); |
|
|
|
php_mysqli_throw_sql_exception((char *)mysql_sqlstate(mysql->mysql), mysql_errno(mysql->mysql) TSRMLS_CC, |
|
|
|
"%s", mysql_error(mysql->mysql)); |
|
|
|
|
|
|
|
/* free mysql structure */ |
|
|
|
mysqli_close(mysql->mysql, MYSQLI_CLOSE_DISCONNECTED); |
|
|
|
goto err; |
|
|
|
} |
|
|
|
|
|
|
|
/* when PHP runs in unicode, set default character set to utf8 */ |
|
|
|
if (UG(unicode)) { |
|
|
|
mysql->conv = UG(utf8_conv); |
|
|
|
} |
|
|
|
|
|
|
|
/* clear error */ |
|
|
|
php_mysqli_set_error(mysql_errno(mysql->mysql), (char *) mysql_error(mysql->mysql) TSRMLS_CC); |
|
|
|
|
|
|
|
#if !defined(HAVE_MYSQLND) |
|
|
|
mysql->mysql->reconnect = MyG(reconnect); |
|
|
|
|
|
|
|
/* set our own local_infile handler */ |
|
|
|
php_set_local_infile_handler_default(mysql); |
|
|
|
#endif |
|
|
|
|
|
|
|
mysql_options(mysql->mysql, MYSQL_OPT_LOCAL_INFILE, (char *)&MyG(allow_local_infile)); |
|
|
|
|
|
|
|
end: |
|
|
|
if (!mysqli_resource) { |
|
|
|
mysqli_resource = (MYSQLI_RESOURCE *)ecalloc (1, sizeof(MYSQLI_RESOURCE)); |
|
|
|
mysqli_resource->ptr = (void *)mysql; |
|
|
|
} |
|
|
|
mysqli_resource->status = MYSQLI_STATUS_VALID; |
|
|
|
|
|
|
|
/* store persistent connection */ |
|
|
|
if (persistent && new_connection) { |
|
|
|
MyG(num_active_persistent)++; |
|
|
|
} |
|
|
|
|
|
|
|
mysql->hash_key = hash_key; |
|
|
|
MyG(num_links)++; |
|
|
|
|
|
|
|
#if !defined(HAVE_MYSQLND) |
|
|
|
mysql->multi_query = 0; |
|
|
|
#else |
|
|
|
mysql->multi_query = 1; |
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
|
|
if (!object || !instanceof_function(Z_OBJCE_P(object), mysqli_link_class_entry TSRMLS_CC)) { |
|
|
|
MYSQLI_RETURN_RESOURCE(mysqli_resource, mysqli_link_class_entry); |
|
|
|
} else { |
|
|
|
((mysqli_object *) zend_object_store_get_object(object TSRMLS_CC))->ptr = mysqli_resource; |
|
|
|
} |
|
|
|
return; |
|
|
|
|
|
|
|
err: |
|
|
|
efree(mysql); |
|
|
|
if (hash_key) { |
|
|
|
efree(hash_key); |
|
|
|
} |
|
|
|
RETVAL_FALSE; |
|
|
|
#endif |
|
|
|
} |
|
|
|
/* }}} */ |
|
|
|
|
|
|
|
|