/* {{{ php_clear_mysql */
void php_clear_mysql(MY_MYSQL *mysql) {
- int i;
-
- for (i=0; i < 3; i++) {
- if (&mysql->callback_func[i]) {
- zval_dtor(&mysql->callback_func[i]);
- }
- }
-
- if (mysql->local_infile) {
- zval_ptr_dtor(&mysql->local_infile);
+ if (mysql->li_read) {
+ printf("freeing...\n");
+ efree(Z_STRVAL_P(mysql->li_read));
+ FREE_ZVAL(mysql->li_read);
+ mysql->li_read = NULL;
}
}
/* }}} */
ret = zend_hash_find(obj->prop_handler, Z_STRVAL_P(member), Z_STRLEN_P(member)+1, (void **) &hnd);
}
if (ret == SUCCESS) {
+
/* check if mysqli object is still valid */
if (!strcmp(obj->zo.ce->name, "mysqli")) {
if (!obj->ptr ||
{
mysqli_object *obj = (mysqli_object *)zend_objects_get_address(object TSRMLS_CC);
- if (obj->zo.ce != mysqli_link_class_entry && obj->zo.ce->constructor) {
+ if (obj->zo.ce != mysqli_link_class_entry) {
return obj->zo.ce->constructor;
} else {
static zend_internal_function f;
/* for mysqli_stmt_set_attr */
REGISTER_LONG_CONSTANT("MYSQLI_STMT_ATTR_UPDATE_MAX_LENGTH", STMT_ATTR_UPDATE_MAX_LENGTH, CONST_CS | CONST_PERSISTENT);
+
+#ifdef STMT_ATTR_CURSOR_TYPE
+ REGISTER_LONG_CONSTANT("MYSQLI_STMT_ATTR_CURSOR_TYPE", STMT_ATTR_CURSOR_TYPE, CONST_CS | CONST_PERSISTENT);
+ REGISTER_LONG_CONSTANT("MYSQLI_CURSOR_TYPE_NO_CURSOR", CURSOR_TYPE_NO_CURSOR, CONST_CS | CONST_PERSISTENT);
+ REGISTER_LONG_CONSTANT("MYSQLI_CURSOR_TYPE_READ_ONLY", CURSOR_TYPE_READ_ONLY, CONST_CS | CONST_PERSISTENT);
+ REGISTER_LONG_CONSTANT("MYSQLI_CURSOR_TYPE_FOR_UPDATE", CURSOR_TYPE_FOR_UPDATE, CONST_CS | CONST_PERSISTENT);
+ REGISTER_LONG_CONSTANT("MYSQLI_CURSOR_TYPE_SCROLLABLE", CURSOR_TYPE_SCROLLABLE, CONST_CS | CONST_PERSISTENT);
+#endif
/* column information */
REGISTER_LONG_CONSTANT("MYSQLI_NOT_NULL_FLAG", NOT_NULL_FLAG, CONST_CS | CONST_PERSISTENT);
memset(source, 0, LOCAL_INFILE_ERROR_LEN);\
memcpy(source, dest, LOCAL_INFILE_ERROR_LEN-1);
+/* {{{ void php_set_local_infile_handler_default
+*/
+void php_set_local_infile_handler_default(MY_MYSQL *mysql) {
+ /* register internal callback functions */
+ mysql_set_local_infile_handler(mysql->mysql, &php_local_infile_init, &php_local_infile_read,
+ &php_local_infile_end, &php_local_infile_error, (void *)mysql);
+ mysql->li_read = NULL;
+}
+/* }}} */
+
/* {{{ php_local_infile_init
*/
int php_local_infile_init(void **ptr, const char *filename, void *userdata)
{
mysqli_local_infile *data;
MY_MYSQL *mysql;
- zval ***callback_args;
- int argc = 2;
- int i, rc = 0;
+ php_stream_context *context = NULL;
TSRMLS_FETCH();
return 1;
}
- if (!(mysql = data->userdata = userdata)) {
+ if (!(mysql = (MY_MYSQL *)userdata)) {
LOCAL_INFILE_ERROR_MSG(data->error_msg, ER(CR_UNKNOWN_ERROR));
return 1;
}
- ALLOC_CALLBACK_ARGS(callback_args, 0, argc);
-
- ZVAL_STRING(*callback_args[0], (char *)filename, 1);
- ZVAL_STRING(*callback_args[1], "", 1);
-
- if (call_user_function_ex(EG(function_table),
- NULL,
- &mysql->callback_func[0],
- &mysql->local_infile,
- argc,
- callback_args,
- 0,
- NULL TSRMLS_CC) == SUCCESS) {
+ /* check open_basedir */
+ if (PG(open_basedir)) {
+ if (php_check_open_basedir_ex(filename, 0 TSRMLS_CC) == -1) {
+ LOCAL_INFILE_ERROR_MSG(data->error_msg, "open_basedir restriction in effect. Unable to open file");
+ return 1;
+ }
+ }
- /* check if user callback function returned a valid filehandle */
- convert_to_string_ex(callback_args[1]);
+ mysql->li_stream = php_stream_open_wrapper_ex((char *)filename, "r", 0, NULL, context);
- if (Z_TYPE_P(mysql->local_infile) != IS_RESOURCE) {
- if (!strlen(Z_STRVAL_P(*callback_args[1]))) {
- LOCAL_INFILE_ERROR_MSG(data->error_msg, ER(CR_UNKNOWN_ERROR));
- } else {
- LOCAL_INFILE_ERROR_MSG(data->error_msg, Z_STRVAL_P(*callback_args[1]));
- }
- rc = 1;
- } else {
- }
- } else {
- LOCAL_INFILE_ERROR_MSG(data->error_msg, "Can't execute load data local init callback function");
- rc = 1;
+ if (mysql->li_stream == NULL) {
+ return 1;
}
- FREE_CALLBACK_ARGS(callback_args, 0, argc);
+ data->userdata = mysql;
- return rc;
+ return 0;
}
/* }}} */
mysqli_local_infile *data;
MY_MYSQL *mysql;
zval ***callback_args;
- zval *retval;
+ zval *retval;
+ zval *fp;
int argc = 4;
int i;
long rc;
TSRMLS_FETCH();
data= (mysqli_local_infile *)ptr;
-
mysql = data->userdata;
+ /* default processing */
+ if (!mysql->li_read) {
+ int count;
+
+ count = (int)php_stream_read(mysql->li_stream, buf, buf_len);
+
+ if (count < 0) {
+ LOCAL_INFILE_ERROR_MSG(data->error_msg, ER(2));
+ }
+
+ return count;
+ }
+
ALLOC_CALLBACK_ARGS(callback_args, 1, argc);
/* set parameters: filepointer, buffer, buffer_len, errormsg */
- callback_args[0] = &mysql->local_infile;
+ MAKE_STD_ZVAL(fp);
+ php_stream_to_zval(mysql->li_stream, fp);
+ callback_args[0] = &fp;
ZVAL_STRING(*callback_args[1], "", 1);
ZVAL_LONG(*callback_args[2], buf_len);
ZVAL_STRING(*callback_args[3], "", 1);
if (call_user_function_ex(EG(function_table),
NULL,
- &mysql->callback_func[1],
+ mysql->li_read,
&retval,
argc,
callback_args,
}
FREE_CALLBACK_ARGS(callback_args, 1, argc);
+ efree(fp);
return rc;
}
int php_local_infile_error(void *ptr, char *error_msg, uint error_msg_len)
{
mysqli_local_infile *data = (mysqli_local_infile *) ptr;
+
if (data) {
strcpy(error_msg, data->error_msg);
return 2000;
{
mysqli_local_infile *data;
MY_MYSQL *mysql;
- zval ***callback_args;
- zval *retval;
- int argc = 1;
- int i;
TSRMLS_FETCH();
data= (mysqli_local_infile *)ptr;
- mysql = data->userdata;
-
- ALLOC_CALLBACK_ARGS(callback_args, 1, argc);
-
- /* set parameters: filepointer, buffer, buffer_len, errormsg */
-
- callback_args[0] = &mysql->local_infile;
-
- call_user_function_ex(EG(function_table),
- NULL,
- &mysql->callback_func[2],
- &retval,
- argc,
- callback_args,
- 0,
- NULL TSRMLS_CC);
-
- if (retval) {
- zval_ptr_dtor(&retval);
- }
-
- if (mysql->local_infile) {
- zval_ptr_dtor(&mysql->local_infile);
+ if (!(mysql = data->userdata)) {
+ efree(data);
+ return;
}
- FREE_CALLBACK_ARGS(callback_args, 1, argc);
-// efree(data);
+ php_stream_close(mysql->li_stream);
+ //efree(data);
+ return;
}
/* }}} */
for (i=start; i < var_cnt + start ; i++) {
ofs = i - start;
stmt->result.is_null[ofs] = 0;
-
col_type = (stmt->stmt->fields) ? stmt->stmt->fields[ofs].type : MYSQL_TYPE_STRING;
switch (col_type) {
MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link");
mysql_close(mysql->mysql);
-
+ php_clear_mysql(mysql);
MYSQLI_CLEAR_RESOURCE(&mysql_link);
RETURN_TRUE;
}
}
MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link");
- RETURN_STRING((mysql->mysql->host_info) ? mysql->mysql->host_info : empty_string, 1);
+ RETURN_STRING((mysql->mysql->host_info) ? mysql->mysql->host_info : "", 1);
}
/* }}} */
}
MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link");
- RETURN_STRING((mysql->mysql->info) ? mysql->mysql->info : empty_string, 1);
+ RETURN_STRING((mysql->mysql->info) ? mysql->mysql->info : "", 1);
}
/* }}} */
{
MY_MYSQL *mysql;
zval *mysql_link;
- int i;
if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_link, mysqli_link_class_entry) == FAILURE) {
return;
MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link");
- for (i=0; i < 3; i++) {
- if (&mysql->callback_func[i]) {
- zval_dtor(&mysql->callback_func[i]);
- }
+ if (mysql->li_read) {
+ efree(Z_STRVAL_P(mysql->li_read));
+ zval_dtor(mysql->li_read);
+ mysql->li_read = NULL;
}
-
- mysql_set_local_infile_default(mysql->mysql);
}
/* }}} */
-/* {{{ proto bool mysqli_set_local_infile_handler(object link, callback init_func,
- callback read_func, callback end_func)
+/* {{{ proto bool mysqli_set_local_infile_handler(object link, callback read_func)
Set callback functions for LOAD DATA LOCAL INFILE */
PHP_FUNCTION(mysqli_set_local_infile_handler)
{
MY_MYSQL *mysql;
zval *mysql_link;
char *callback_name;
- zval *callback_func[4];
- int i;
+ zval *callback_func;
- if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Ozzzz", &mysql_link, mysqli_link_class_entry,
- &callback_func[0], &callback_func[1], &callback_func[2], &callback_func[3]) == FAILURE) {
+ if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Oz", &mysql_link, mysqli_link_class_entry,
+ &callback_func) == FAILURE) {
return;
}
MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link");
- /* check callback functions */
- for (i=0; i < 3; i++) {
- if (!zend_is_callable(callback_func[i], 0, &callback_name)) {
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "Not a valid callback function %s", callback_name);
- efree(callback_name);
- RETURN_FALSE;
- }
+ /* check callback function */
+ if (!zend_is_callable(callback_func, 0, &callback_name)) {
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "Not a valid callback function %s", callback_name);
efree(callback_name);
+ RETURN_FALSE;
}
+ efree(callback_name);
- /* save callback functions */
- for (i=0; i < 3; i++) {
- ZVAL_STRING(&mysql->callback_func[i], callback_func[i]->value.str.val, 1);
- }
-
- /* register internal callback functions */
- mysql_set_local_infile_handler(mysql->mysql, &php_local_infile_init, &php_local_infile_read,
- &php_local_infile_end, &php_local_infile_error, (void *)mysql);
+ /* save callback function */
+ ALLOC_ZVAL(mysql->li_read);
+ ZVAL_STRING(mysql->li_read, callback_func->value.str.val, 1);
}
/* }}} */
php_mysqli_set_error(mysql_errno(mysql->mysql), (char *)mysql_error(mysql->mysql) TSRMLS_CC);
mysql->mysql->reconnect = MyG(reconnect);
+
+ /* set our own local_infile handler */
+ php_set_local_infile_handler_default(mysql);
if (object) {
((mysqli_object *) zend_object_store_get_object(object TSRMLS_CC))->valid = 1;