]> granicus.if.org Git - php/commitdiff
initial upload
authorGeorg Richter <georg@php.net>
Wed, 12 Feb 2003 00:45:53 +0000 (00:45 +0000)
committerGeorg Richter <georg@php.net>
Wed, 12 Feb 2003 00:45:53 +0000 (00:45 +0000)
ext/mysqli/CREDITS [new file with mode: 0644]
ext/mysqli/EXPERIMENTAL [new file with mode: 0644]
ext/mysqli/TODO [new file with mode: 0644]
ext/mysqli/mysqli.c [new file with mode: 0644]
ext/mysqli/mysqli_api.c [new file with mode: 0644]
ext/mysqli/mysqli_fe.c [new file with mode: 0644]
ext/mysqli/mysqli_nonapi.c [new file with mode: 0644]
ext/mysqli/php_mysqli.h [new file with mode: 0644]

diff --git a/ext/mysqli/CREDITS b/ext/mysqli/CREDITS
new file mode 100644 (file)
index 0000000..68cfa8a
--- /dev/null
@@ -0,0 +1,2 @@
+MySQLi
+Zak Greant, Georg Richter
diff --git a/ext/mysqli/EXPERIMENTAL b/ext/mysqli/EXPERIMENTAL
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/ext/mysqli/TODO b/ext/mysqli/TODO
new file mode 100644 (file)
index 0000000..6b45757
--- /dev/null
@@ -0,0 +1,13 @@
+- review/code inspection of the bind stuff
+- test
+- documentation
+- benchmarks /ext/mysql vs. ext/mysqli
+- testing/compiling under windows
+- migration guide:
+       diffrences between ext/mysql and mysqli
+       not supported functions from ext/mysql (mysql_db_query)
+- ini-settings
+- phpinfo output (Status: mostly done, maybe some more information could be interesting)
+- blob support for mysql_prepare
+- multi query support (still open until there is a decision (MySQL AB))
+- bundled libmysql 4.1
diff --git a/ext/mysqli/mysqli.c b/ext/mysqli/mysqli.c
new file mode 100644 (file)
index 0000000..2c56d4f
--- /dev/null
@@ -0,0 +1,409 @@
+/*
+  +----------------------------------------------------------------------+
+  | PHP Version 4                                                        |
+  +----------------------------------------------------------------------+
+  | Copyright (c) 1997-2002 The PHP Group                                |
+  +----------------------------------------------------------------------+
+  | This source file is subject to version 2.02 of the PHP license,      |
+  | that is bundled with this package in the file LICENSE, and is        |
+  | available at through the world-wide-web at                           |
+  | http://www.php.net/license/2_02.txt.                                 |
+  | If you did not receive a copy of the PHP license and are unable to   |
+  | obtain it through the world-wide-web, please send a note to          |
+  | license@php.net so we can mail you a copy immediately.               |
+  +----------------------------------------------------------------------+
+  | Author: Georg Richter <georg@php.net>                                |
+  +----------------------------------------------------------------------+
+
+  $Id$ 
+*/
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <signal.h>
+
+#include "php.h"
+#include "php_ini.h"
+#include "ext/standard/info.h"
+#include "php_mysqli.h"
+
+
+#define MYSQLI_STORE_RESULT 0
+#define MYSQLI_USE_RESULT 1
+
+ZEND_DECLARE_MODULE_GLOBALS(mysqli)
+
+static zend_object_handlers mysqli_object_handlers;
+
+/* {{{ php_clear_stmt_bind */
+void php_clear_stmt_bind(STMT *stmt) {
+       int i;
+
+
+       if (stmt->stmt)
+               mysql_stmt_close(stmt->stmt);
+
+       if (stmt->var_cnt) {
+       
+               for (i=0; i < stmt->var_cnt; i++) {
+                       if (stmt->type == FETCH_RESULT) {
+                               if (stmt->bind[i].type == IS_STRING) {
+                                       efree(stmt->bind[i].buffer);
+                               }
+                       }
+                       if (stmt->vars[i]) {    
+                               ZVAL_DELREF(stmt->vars[i]);
+                       }
+               }
+               if (stmt->type == FETCH_RESULT) {
+                       efree(stmt->bind);
+               }
+               efree(stmt->vars);
+               efree(stmt->is_null);
+       }
+       efree(stmt);
+       return;
+}
+/* }}} */
+
+/* {{{ mysqli_objects_dtor
+ */
+static void mysqli_objects_dtor(void *object, zend_object_handle handle TSRMLS_DC)
+{
+       mysqli_object *intern = (mysqli_object *)object;
+
+       /* link object */
+       if (intern->zo.ce == mysqli_link_class_entry) {
+               MYSQL   *mysql = (MYSQL *)intern->ptr;
+               if (mysql) {
+                       mysql_close(mysql);
+               }
+       }
+       /* stmt object */
+       else if (intern->zo.ce == mysqli_stmt_class_entry) {
+               STMT *stmt = (STMT *)intern->ptr;
+               if (stmt) {
+                       php_clear_stmt_bind(stmt);
+               }
+       }
+       /* result object */
+       else if (intern->zo.ce == mysqli_result_class_entry) {
+               MYSQL_RES *res = (MYSQL_RES *)intern->ptr;
+               if (res) {
+                       mysql_free_result(res);
+               }
+       }
+
+       zend_objects_destroy_object(object, handle TSRMLS_CC);
+}
+/* }}} */
+
+/* {{{ mysqli_objects_clone
+ */
+static void mysqli_objects_clone(void *object, void **object_clone TSRMLS_DC)
+{
+       /* TODO */
+}
+/* }}} */
+       
+/* {{{ mysqli_objects_new
+ */
+PHP_MYSQLI_EXPORT(zend_object_value) mysqli_objects_new(zend_class_entry *class_type TSRMLS_DC)
+{
+       zend_object_value retval;
+       mysqli_object *intern;
+       zval *tmp;
+
+       intern = emalloc(sizeof(mysqli_object));
+       intern->zo.ce = class_type;
+       intern->zo.in_get = 0;
+       intern->zo.in_set = 0;
+
+       ALLOC_HASHTABLE(intern->zo.properties);
+       zend_hash_init(intern->zo.properties, 0, NULL, ZVAL_PTR_DTOR, 0);
+       zend_hash_copy(intern->zo.properties, &class_type->default_properties, (copy_ctor_func_t) zval_add_ref, (void *) &tmp, sizeof(zval *));
+
+       retval.handle = zend_objects_store_put(intern, mysqli_objects_dtor, mysqli_objects_clone TSRMLS_CC);
+       retval.handlers = &mysqli_object_handlers;
+
+       return retval;
+}
+/* }}} */
+       
+/* {{{ mysqli_module_entry
+ */
+zend_module_entry mysqli_module_entry = {
+#if ZEND_MODULE_API_NO >= 20010901
+       STANDARD_MODULE_HEADER,
+#endif
+       "mysqli",
+       mysqli_functions,
+       PHP_MINIT(mysqli),
+       PHP_MSHUTDOWN(mysqli),
+       PHP_RINIT(mysqli),              /* Replace with NULL if there's nothing to do at request start */
+       PHP_RSHUTDOWN(mysqli),  /* Replace with NULL if there's nothing to do at request end */
+       PHP_MINFO(mysqli),
+#if ZEND_MODULE_API_NO >= 20010901
+       "0.1", /* Replace with version number for your extension */
+#endif
+       STANDARD_MODULE_PROPERTIES
+};
+/* }}} */
+
+#ifdef COMPILE_DL_MYSQLI
+ZEND_GET_MODULE(mysqli)
+#endif
+
+/* {{{ PHP_INI_BEGIN
+*/
+PHP_INI_BEGIN()
+       STD_PHP_INI_ENTRY_EX("mysqli.max_links",                        "-1",   PHP_INI_SYSTEM,         OnUpdateInt,            max_links,                      zend_mysqli_globals,            mysqli_globals, display_link_numbers)
+       STD_PHP_INI_ENTRY("mysqli.default_host",                        NULL,   PHP_INI_ALL,            OnUpdateString,         default_host,           zend_mysqli_globals,            mysqli_globals)
+       STD_PHP_INI_ENTRY("mysqli.default_user",                        NULL,   PHP_INI_ALL,            OnUpdateString,         default_user,           zend_mysqli_globals,            mysqli_globals)
+       STD_PHP_INI_ENTRY("mysqli.default_pw",                          NULL,   PHP_INI_ALL,            OnUpdateString,         default_pw,                     zend_mysqli_globals,            mysqli_globals)
+       STD_PHP_INI_ENTRY("mysqli.default_port",                        "3306", PHP_INI_ALL,            OnUpdateInt,            default_port,           zend_mysqli_globals,            mysqli_globals)
+       STD_PHP_INI_ENTRY("mysqli.default_socket",                      NULL,   PHP_INI_ALL,            OnUpdateStringUnempty,  default_socket, zend_mysqli_globals,            mysqli_globals)
+PHP_INI_END()
+
+/* }}} */
+
+/* {{{ php_mysqli_init_globals
+ */
+static void php_mysqli_init_globals(zend_mysqli_globals *mysqli_globals)
+{
+       mysqli_globals->num_links = 0;
+       mysqli_globals->max_links = 0;
+       mysqli_globals->default_port = 0;
+       mysqli_globals->default_host = NULL;
+       mysqli_globals->default_user = NULL;
+       mysqli_globals->default_pw = NULL;
+       mysqli_globals->default_socket = NULL;
+}
+/* }}} */
+
+/* {{{ PHP_MINIT_FUNCTION
+ */
+PHP_MINIT_FUNCTION(mysqli)
+{
+       
+       ZEND_INIT_MODULE_GLOBALS(mysqli, php_mysqli_init_globals, NULL);
+       REGISTER_INI_ENTRIES();
+
+       memcpy(&mysqli_object_handlers, zend_get_std_object_handlers(), sizeof(zend_object_handlers));
+       mysqli_object_handlers.clone_obj = zend_objects_store_clone_obj;
+
+       REGISTER_MYSQLI_CLASS_ENTRY("mysqli", mysqli_link_class_entry, mysqli_link_methods);
+       REGISTER_MYSQLI_CLASS_ENTRY("mysqli_result", mysqli_result_class_entry, mysqli_result_methods);
+       REGISTER_MYSQLI_CLASS_ENTRY("mysqli_stmt", mysqli_stmt_class_entry, mysqli_stmt_methods);
+       
+       /* mysqli_options */
+       REGISTER_LONG_CONSTANT("MYSQLI_READ_DEFAULT_GROUP", MYSQL_READ_DEFAULT_GROUP, CONST_CS | CONST_PERSISTENT);
+       REGISTER_LONG_CONSTANT("MYSQLI_READ_DEFAULT_FILE", MYSQL_READ_DEFAULT_FILE, CONST_CS | CONST_PERSISTENT);
+       REGISTER_LONG_CONSTANT("MYSQLI_OPT_CONNECT_TIMEOUT", MYSQL_OPT_CONNECT_TIMEOUT, CONST_CS | CONST_PERSISTENT);
+       REGISTER_LONG_CONSTANT("MYSQLI_OPT_LOCAL_INFILE", MYSQL_OPT_LOCAL_INFILE, CONST_CS | CONST_PERSISTENT);
+       REGISTER_LONG_CONSTANT("MYSQLI_INIT_COMMAND", MYSQL_INIT_COMMAND, CONST_CS | CONST_PERSISTENT);
+
+       /* mysqli_real_connect flags */ 
+       REGISTER_LONG_CONSTANT("MYSQLI_CLIENT_SSL", CLIENT_SSL, CONST_CS | CONST_PERSISTENT);
+       REGISTER_LONG_CONSTANT("MYSQLI_CLIENT_COMPRESS",CLIENT_COMPRESS, CONST_CS | CONST_PERSISTENT);
+       REGISTER_LONG_CONSTANT("MYSQLI_CLIENT_INTERACTIVE", CLIENT_INTERACTIVE, CONST_CS | CONST_PERSISTENT);
+       REGISTER_LONG_CONSTANT("MYSQLI_CLIENT_IGNORE_SPACE", CLIENT_IGNORE_SPACE, CONST_CS | CONST_PERSISTENT);
+       REGISTER_LONG_CONSTANT("MYSQLI_CLIENT_NO_SCHEMA", CLIENT_NO_SCHEMA, CONST_CS | CONST_PERSISTENT);
+       REGISTER_LONG_CONSTANT("MYSQLI_CLIENT_MULTI_QUERIES", CLIENT_MULTI_QUERIES, CONST_CS | CONST_PERSISTENT);
+       
+
+       /* for mysqli_query */
+       REGISTER_LONG_CONSTANT("MYSQLI_STORE_RESULT", 0, CONST_CS | CONST_PERSISTENT);
+       REGISTER_LONG_CONSTANT("MYSQLI_USE_RESULT", 1, CONST_CS | CONST_PERSISTENT);
+
+       /* for mysqli_fetch_assoc */
+       REGISTER_LONG_CONSTANT("MYSQLI_ASSOC", MYSQLI_ASSOC, CONST_CS | CONST_PERSISTENT);
+       REGISTER_LONG_CONSTANT("MYSQLI_NUM", MYSQLI_NUM, CONST_CS | CONST_PERSISTENT);
+       REGISTER_LONG_CONSTANT("MYSQLI_BOTH", MYSQLI_BOTH, CONST_CS | CONST_PERSISTENT);
+       
+       
+       /* column information */
+       REGISTER_LONG_CONSTANT("MYSQLI_NOT_NULL_FLAG", NOT_NULL_FLAG, CONST_CS | CONST_PERSISTENT);
+       REGISTER_LONG_CONSTANT("MYSQLI_PRI_KEY_FLAG", PRI_KEY_FLAG, CONST_CS | CONST_PERSISTENT);
+       REGISTER_LONG_CONSTANT("MYSQLI_UNIQUE_KEY_FLAG", UNIQUE_KEY_FLAG, CONST_CS | CONST_PERSISTENT);
+       REGISTER_LONG_CONSTANT("MYSQLI_MULTIPLE_KEY_FLAG", MULTIPLE_KEY_FLAG, CONST_CS | CONST_PERSISTENT);
+       REGISTER_LONG_CONSTANT("MYSQLI_BLOB_FLAG", BLOB_FLAG, CONST_CS | CONST_PERSISTENT);
+       REGISTER_LONG_CONSTANT("MYSQLI_UNSIGNED_FLAG", UNSIGNED_FLAG, CONST_CS | CONST_PERSISTENT);
+       REGISTER_LONG_CONSTANT("MYSQLI_ZEROFILL_FLAG", ZEROFILL_FLAG, CONST_CS | CONST_PERSISTENT);
+       REGISTER_LONG_CONSTANT("MYSQLI_AUTO_INCREMENT_FLAG", AUTO_INCREMENT_FLAG, CONST_CS | CONST_PERSISTENT);
+       REGISTER_LONG_CONSTANT("MYSQLI_TIMESTAMP_FLAG", TIMESTAMP_FLAG, CONST_CS | CONST_PERSISTENT);
+       REGISTER_LONG_CONSTANT("MYSQLI_SET_FLAG", SET_FLAG, CONST_CS | CONST_PERSISTENT);
+       REGISTER_LONG_CONSTANT("MYSQLI_NUM_FLAG", NUM_FLAG, CONST_CS | CONST_PERSISTENT);
+       REGISTER_LONG_CONSTANT("MYSQLI_PART_KEY_FLAG", PART_KEY_FLAG, CONST_CS | CONST_PERSISTENT);
+       REGISTER_LONG_CONSTANT("MYSQLI_GROUP_FLAG", GROUP_FLAG, CONST_CS | CONST_PERSISTENT);
+
+       REGISTER_LONG_CONSTANT("MYSQLI_TYPE_DECIMAL", FIELD_TYPE_DECIMAL, CONST_CS | CONST_PERSISTENT);
+       REGISTER_LONG_CONSTANT("MYSQLI_TYPE_TINY", FIELD_TYPE_TINY, CONST_CS | CONST_PERSISTENT);
+       REGISTER_LONG_CONSTANT("MYSQLI_TYPE_SHORT", FIELD_TYPE_SHORT, CONST_CS | CONST_PERSISTENT);
+       REGISTER_LONG_CONSTANT("MYSQLI_TYPE_LONG", FIELD_TYPE_LONG, CONST_CS | CONST_PERSISTENT);
+       REGISTER_LONG_CONSTANT("MYSQLI_TYPE_FLOAD", FIELD_TYPE_FLOAT, CONST_CS | CONST_PERSISTENT);
+       REGISTER_LONG_CONSTANT("MYSQLI_TYPE_DOUBLE", FIELD_TYPE_DOUBLE, CONST_CS | CONST_PERSISTENT);
+       REGISTER_LONG_CONSTANT("MYSQLI_TYPE_NULL", FIELD_TYPE_NULL, CONST_CS | CONST_PERSISTENT);
+       REGISTER_LONG_CONSTANT("MYSQLI_TYPE_TIMESTAMP", FIELD_TYPE_TIMESTAMP, CONST_CS | CONST_PERSISTENT);
+       REGISTER_LONG_CONSTANT("MYSQLI_TYPE_LONGLONG", FIELD_TYPE_LONGLONG, CONST_CS | CONST_PERSISTENT);
+       REGISTER_LONG_CONSTANT("MYSQLI_TYPE_INT24", FIELD_TYPE_INT24, CONST_CS | CONST_PERSISTENT);
+       REGISTER_LONG_CONSTANT("MYSQLI_TYPE_DATE", FIELD_TYPE_DATE, CONST_CS | CONST_PERSISTENT);
+       REGISTER_LONG_CONSTANT("MYSQLI_TYPE_TIME", FIELD_TYPE_TIME, CONST_CS | CONST_PERSISTENT);
+       REGISTER_LONG_CONSTANT("MYSQLI_TYPE_DATETIME", FIELD_TYPE_DATETIME      , CONST_CS | CONST_PERSISTENT);
+       REGISTER_LONG_CONSTANT("MYSQLI_TYPE_YEAR", FIELD_TYPE_YEAR, CONST_CS | CONST_PERSISTENT);
+       REGISTER_LONG_CONSTANT("MYSQLI_TYPE_NEWDATE", FIELD_TYPE_NEWDATE, CONST_CS | CONST_PERSISTENT);
+       REGISTER_LONG_CONSTANT("MYSQLI_TYPE_ENUM", FIELD_TYPE_ENUM, CONST_CS | CONST_PERSISTENT);
+       REGISTER_LONG_CONSTANT("MYSQLI_TYPE_SET", FIELD_TYPE_SET, CONST_CS | CONST_PERSISTENT);
+       REGISTER_LONG_CONSTANT("MYSQLI_TYPE_TINY_BLOB", FIELD_TYPE_TINY_BLOB, CONST_CS | CONST_PERSISTENT);
+       REGISTER_LONG_CONSTANT("MYSQLI_TYPE_MEDIUM_BLOB", FIELD_TYPE_MEDIUM_BLOB, CONST_CS | CONST_PERSISTENT);
+       REGISTER_LONG_CONSTANT("MYSQLI_TYPE_LONG_BLOB", FIELD_TYPE_LONG_BLOB, CONST_CS | CONST_PERSISTENT);
+       REGISTER_LONG_CONSTANT("MYSQLI_TYPE_BLOB", FIELD_TYPE_BLOB, CONST_CS | CONST_PERSISTENT);
+       REGISTER_LONG_CONSTANT("MYSQLI_TYPE_VAR_STRING", FIELD_TYPE_VAR_STRING, CONST_CS | CONST_PERSISTENT);
+       REGISTER_LONG_CONSTANT("MYSQLI_TYPE_STRING", FIELD_TYPE_STRING, CONST_CS | CONST_PERSISTENT);
+       REGISTER_LONG_CONSTANT("MYSQLI_TYPE_CHAR", FIELD_TYPE_CHAR, CONST_CS | CONST_PERSISTENT);
+       REGISTER_LONG_CONSTANT("MYSQLI_TYPE_INTERVAL", FIELD_TYPE_INTERVAL, CONST_CS | CONST_PERSISTENT);
+       REGISTER_LONG_CONSTANT("MYSQLI_TYPE_GEOMETRY", FIELD_TYPE_GEOMETRY, CONST_CS | CONST_PERSISTENT);
+
+       /* bindtypes for mysqli_bind_result */
+       REGISTER_LONG_CONSTANT("MYSQLI_BIND_STRING", MYSQLI_BIND_STRING, CONST_CS | CONST_PERSISTENT);
+       REGISTER_LONG_CONSTANT("MYSQLI_BIND_INT", MYSQLI_BIND_INT, CONST_CS | CONST_PERSISTENT);
+       REGISTER_LONG_CONSTANT("MYSQLI_BIND_DOUBLE", MYSQLI_BIND_DOUBLE, CONST_CS | CONST_PERSISTENT);
+       REGISTER_LONG_CONSTANT("MYSQLI_BIND_SEND_DATA", MYSQLI_BIND_SEND_DATA, CONST_CS | CONST_PERSISTENT);
+
+       /* replication */
+       REGISTER_LONG_CONSTANT("MYSQLI_RPL_MASTER", MYSQL_RPL_MASTER, CONST_CS | CONST_PERSISTENT);
+       REGISTER_LONG_CONSTANT("MYSQLI_RPL_SLAVE", MYSQL_RPL_SLAVE, CONST_CS | CONST_PERSISTENT);
+       REGISTER_LONG_CONSTANT("MYSQLI_RPL_ADMIN", MYSQL_RPL_ADMIN, CONST_CS | CONST_PERSISTENT);
+       
+       /* bind blob support */
+       REGISTER_LONG_CONSTANT("MYSQLI_NEED_DATA", MYSQL_NEED_DATA, CONST_CS | CONST_PERSISTENT);
+       REGISTER_LONG_CONSTANT("MYSQLI_NO_DATA", MYSQL_NO_DATA, CONST_CS | CONST_PERSISTENT);
+       return SUCCESS;
+}
+/* }}} */
+
+/* {{{ PHP_MSHUTDOWN_FUNCTION
+ */
+PHP_MSHUTDOWN_FUNCTION(mysqli)
+{
+       /* uncomment this line if you have INI entries
+       UNREGISTER_INI_ENTRIES();
+       */
+       return SUCCESS;
+}
+/* }}} */
+
+/* Remove if there's nothing to do at request start */
+/* {{{ PHP_RINIT_FUNCTION
+ */
+PHP_RINIT_FUNCTION(mysqli)
+{
+       return SUCCESS;
+}
+/* }}} */
+
+/* Remove if there's nothing to do at request end */
+/* {{{ PHP_RSHUTDOWN_FUNCTION
+ */
+PHP_RSHUTDOWN_FUNCTION(mysqli)
+{
+       return SUCCESS;
+}
+/* }}} */
+
+/* {{{ PHP_MINFO_FUNCTION
+ */
+PHP_MINFO_FUNCTION(mysqli)
+{
+       php_info_print_table_start();
+       php_info_print_table_header(2, "MysqlI Support", "enabled");
+       php_info_print_table_row(2, "Client API version", mysql_get_client_info());
+       php_info_print_table_row(2, "MYSQLI_SOCKET", MYSQL_UNIX_ADDR);
+       
+       
+       php_info_print_table_end();
+
+       DISPLAY_INI_ENTRIES();
+}
+/* }}} */
+
+/* {{{ php_mysqli_fetch_into_hash
+ */
+void php_mysqli_fetch_into_hash(INTERNAL_FUNCTION_PARAMETERS, int override_flags)
+{
+       MYSQL_RES *result;
+       zval *mysql_result;
+       int     fetchtype;
+       int copyflag, i;
+       MYSQL_FIELD *fields;
+       MYSQL_ROW row;
+       unsigned long *field_len;
+
+       if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O|l", &mysql_result, mysqli_result_class_entry, &fetchtype) == FAILURE) {
+               return;
+       }
+
+       if (ZEND_NUM_ARGS() < 2 && !override_flags) {
+               fetchtype = MYSQLI_BOTH;
+       }
+
+       if (override_flags) {
+               fetchtype = override_flags;
+       }
+
+       MYSQLI_FETCH_RESOURCE(result, MYSQL_RES *, &mysql_result, "mysqli_result"); 
+
+       if (array_init(return_value) == FAILURE) {
+               RETURN_FALSE;
+       }
+
+       fields = mysql_fetch_fields(result);
+       row = mysql_fetch_row(result);
+       field_len = mysql_fetch_lengths(result);
+
+       for (i=0; i < mysql_num_fields(result); i++){
+               if (row[i]) {
+                       char    *column;
+                       int             column_len;
+                       
+                       /* check if we need magic quotes */
+                       if (PG(magic_quotes_runtime)) {
+                               column = php_addslashes(row[i], field_len[i], &column_len, 0 TSRMLS_CC);
+                               copyflag = 0;
+                       }
+                       else {
+                               column = row[i];
+                               column_len = field_len[i];
+                               copyflag = 1;
+                       }
+                       if (fetchtype & MYSQLI_NUM) {
+                               add_index_stringl(return_value, i, column, column_len, copyflag);
+                               copyflag = 1;   
+                       }
+                       if (fetchtype & MYSQLI_ASSOC) {
+                               add_assoc_stringl(return_value, fields[i].name, column, column_len, copyflag); 
+                       }
+
+               } 
+               else {
+                       if (fetchtype & MYSQLI_NUM) {
+                               add_index_null(return_value, i);
+                       }
+                       if (fetchtype & MYSQLI_ASSOC) {
+                               add_assoc_null(return_value, fields[i].name);
+                       }
+               }
+       }
+}
+/* }}} */
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * End:
+ * vim600: noet sw=4 ts=4 fdm=marker
+ * vim<600: noet sw=4 ts=4
+ */
diff --git a/ext/mysqli/mysqli_api.c b/ext/mysqli/mysqli_api.c
new file mode 100644 (file)
index 0000000..3d70d9a
--- /dev/null
@@ -0,0 +1,1678 @@
+/*
+  +----------------------------------------------------------------------+
+  | PHP Version 4                                                        |
+  +----------------------------------------------------------------------+
+  | Copyright (c) 1997-2002 The PHP Group                                |
+  +----------------------------------------------------------------------+
+  | This source file is subject to version 2.02 of the PHP license,      |
+  | that is bundled with this package in the file LICENSE, and is        |
+  | available at through the world-wide-web at                           |
+  | http://www.php.net/license/2_02.txt.                                 |
+  | If you did not receive a copy of the PHP license and are unable to   |
+  | obtain it through the world-wide-web, please send a note to          |
+  | license@php.net so we can mail you a copy immediately.               |
+  +----------------------------------------------------------------------+
+  | Author: Georg Richter <georg@php.net>                                |
+  +----------------------------------------------------------------------+
+
+  $Id$ 
+*/
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <signal.h>
+
+#include "php.h"
+#include "php_ini.h"
+#include "ext/standard/info.h"
+#include "php_mysqli.h"
+
+
+/* {{{ proto long mysqli_affected_rows(resource link)
+*/
+PHP_FUNCTION(mysqli_affected_rows)
+{
+       MYSQL *mysql;
+       zval  *mysql_link;
+
+       if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_link, mysqli_link_class_entry) == FAILURE) {
+               return;
+       }
+
+       MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, &mysql_link, "mysqli_link"); 
+
+       RETURN_LONG(mysql_affected_rows(mysql));
+}
+/* }}} */
+
+/* {{{ proto bool mysqli_autocommit(resource link, bool mode)
+*/
+PHP_FUNCTION(mysqli_autocommit)
+{
+       MYSQL *mysql;
+       zval  *mysql_link;
+       unsigned long automode;
+
+       if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Ob", &mysql_link, mysqli_link_class_entry, &automode) == FAILURE) {
+               return;
+       }
+       MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, &mysql_link, "mysqli_link"); 
+
+       RETURN_BOOL(mysql_autocommit(mysql, automode));
+}
+/* }}} */
+
+/* {{{ proto bool mysqli_bind_param(resource stmt, mixed, [mixed,....])
+*/
+
+PHP_FUNCTION(mysqli_bind_param)
+{
+       zval            ***args;
+       int             argc = ZEND_NUM_ARGS();
+       int             i;
+       int                     num_vars;
+       int                     start = 0;
+       int                     ofs;
+       STMT            *stmt;
+       MYSQL_BIND      *bind;
+       zval            **object;
+
+       /* check if number of parameters > 2 and odd */
+       if (argc < 3 || !(argc & 1)) {
+               WRONG_PARAM_COUNT;
+       }
+       else 
+         num_vars = (argc - 1) / 2;
+       
+
+       args = (zval ***)emalloc(argc * sizeof(zval **));
+
+       if (zend_get_parameters_array_ex(argc, args) == FAILURE) {
+               efree(args);
+               WRONG_PARAM_COUNT;
+       }
+
+       if (!getThis()) {
+               if (Z_TYPE_PP(args[0]) != IS_OBJECT) {
+                       efree(args);
+                       RETURN_FALSE;
+               }
+               MYSQLI_FETCH_RESOURCE(stmt, STMT *, args[0], "mysqli_stmt"); 
+               start = 1;
+       }
+       else {
+               object = &(getThis());  
+               MYSQLI_FETCH_RESOURCE(stmt, STMT *, object, "mysqli_stmt"); 
+       }
+
+
+       /* prevent leak if variables are already bound */
+       if (stmt->var_cnt) {
+               php_error_docref(NULL TSRMLS_CC, E_WARNING, "Variables already bound");
+               efree(args);
+               RETURN_FALSE;
+       }
+
+       bind = (MYSQL_BIND *)ecalloc(num_vars, sizeof(MYSQL_BIND));
+
+       for (i=start; i < num_vars * 2 + start; i+=2) {
+               ofs = (i - start) / 2;
+               if (!PZVAL_IS_REF(*args[i]) && Z_LVAL_PP(args[i+1]) != MYSQLI_BIND_SEND_DATA) {
+                       php_error_docref(NULL TSRMLS_CC, E_WARNING, "Parameter %d wasn't passed by reference", i+1);
+                       efree(bind);
+                       efree(args);
+                       RETURN_FALSE;
+               }
+
+               /* set specified type */
+               switch (Z_LVAL_PP(args[i+1])) {
+                       case MYSQLI_BIND_DOUBLE:
+                               bind[ofs].buffer_type = MYSQL_TYPE_DOUBLE;
+                               bind[ofs].buffer = (gptr)&Z_DVAL_PP(args[i]);
+                               bind[ofs].is_null = &stmt->is_null[ofs];
+                               break;
+
+                       case MYSQLI_BIND_INT:
+                               bind[ofs].buffer_type = MYSQL_TYPE_LONG;
+                               bind[ofs].buffer = (gptr)&Z_LVAL_PP(args[i]);
+                               bind[ofs].is_null = &stmt->is_null[ofs];
+                               break;
+
+                       case MYSQLI_BIND_SEND_DATA:
+                               bind[ofs].buffer_type = MYSQL_TYPE_VAR_STRING;
+                               bind[ofs].is_null = 0;
+                               bind[ofs].length = 0;
+                               break;
+
+                       case MYSQLI_BIND_STRING:
+                               bind[ofs].buffer_type = MYSQL_TYPE_VAR_STRING;
+                               bind[ofs].buffer = NULL; // Z_STRVAL_PP(args[i]);
+                               bind[ofs].buffer_length = 0; // strlen(Z_STRVAL_PP(args[i]));
+                               bind[ofs].is_null = &stmt->is_null[ofs];
+                               break;
+
+                       default:
+                               php_error_docref(NULL TSRMLS_CC, E_WARNING, "Undefined fieldtype %d (parameter %d)", Z_LVAL_PP(args[i]), i+1);
+                               efree(args);
+                               efree(bind);
+                               RETURN_FALSE; 
+                               break;
+               }
+       }
+       
+       if (mysql_bind_param(stmt->stmt, bind)) {
+               efree(bind);
+               RETURN_FALSE;
+       }
+
+       stmt->var_cnt = num_vars;
+       stmt->type = FETCH_SIMPLE;
+       stmt->vars = (zval **)emalloc(num_vars * sizeof(zval));
+       for (i = 0; i < num_vars*2; i+=2) {
+               if (Z_LVAL_PP(args[i+1+start]) != MYSQLI_BIND_SEND_DATA) {
+                       ZVAL_ADDREF(*args[i+start]);
+                       stmt->vars[i/2] = *args[i+start];
+               }
+               else
+                       stmt->vars[i/2] = NULL;
+       }
+       efree(args);
+       efree(bind);
+
+       RETURN_TRUE;
+}
+/* }}} */
+
+/* {{{ proto bool mysqli_bind_result(resource stmt, mixed var, long len, [mixed,long....])
+*/
+
+/* TODO:
+   do_alloca, free_alloca
+*/
+
+PHP_FUNCTION(mysqli_bind_result)
+{
+       zval            ***args;
+       int             argc = ZEND_NUM_ARGS();
+       zval            **object;
+       int             i;
+       int                     start = 0;
+       int                     var_cnt;
+       int                     ofs;
+       long            col_type;
+       STMT            *stmt;
+       MYSQL_BIND      *bind;
+
+       if (argc < 2)  {
+               WRONG_PARAM_COUNT;
+       }
+       
+       args = (zval ***)emalloc(argc * sizeof(zval **));
+
+       if (zend_get_parameters_array_ex(argc, args) == FAILURE) {
+               efree(args);
+               WRONG_PARAM_COUNT;
+       }
+
+       if (!getThis()) {
+               if (Z_TYPE_PP(args[0]) != IS_OBJECT) {
+                       RETURN_FALSE;
+               }
+               MYSQLI_FETCH_RESOURCE(stmt, STMT *, args[0], "mysqli_stmt"); 
+               start = 1;
+       }
+       else {
+               object = &(getThis());  
+               MYSQLI_FETCH_RESOURCE(stmt, STMT *, object, "mysqli_stmt"); 
+       }
+       
+       var_cnt = argc - start;
+
+       /* prevent leak if variables are already bound */
+       if (stmt->var_cnt) {
+               php_error_docref(NULL TSRMLS_CC, E_WARNING, "Variables already bound");
+               efree(args);
+               RETURN_FALSE;
+       }
+
+       bind = (MYSQL_BIND *)ecalloc(var_cnt, sizeof(MYSQL_BIND));
+       stmt->bind = (BIND_BUFFER *)ecalloc(var_cnt,sizeof(BIND_BUFFER));
+       stmt->is_null = (char *)ecalloc(var_cnt, sizeof(char));
+       stmt->type = FETCH_RESULT;
+
+       for (i=start; i < var_cnt + start ; i++) {
+               ofs = i - start;
+               stmt->is_null[ofs] = 0;
+               if (!PZVAL_IS_REF(*args[i])) {
+                       php_error_docref(NULL TSRMLS_CC, E_WARNING, "Parameter %d wasn't passed by reference", i);
+                       efree(bind);
+                       efree(args);
+                       php_clear_stmt_bind(stmt);
+                       RETURN_FALSE;
+               }
+
+               col_type = (stmt->stmt->fields) ? stmt->stmt->fields[ofs].type : MYSQL_TYPE_STRING;
+
+               switch (col_type) {
+                       case MYSQL_TYPE_DECIMAL:
+                       case MYSQL_TYPE_DOUBLE:
+                       case MYSQL_TYPE_FLOAT:
+                               convert_to_double_ex(args[i]);
+                               stmt->bind[ofs].type = IS_DOUBLE;
+                               stmt->bind[ofs].buflen = 0;
+                               bind[ofs].buffer_type = MYSQL_TYPE_DOUBLE;
+                               bind[ofs].buffer = (gptr)&Z_DVAL_PP(args[i]);
+                               bind[ofs].is_null = &stmt->is_null[ofs];
+                               break;
+
+                       case MYSQL_TYPE_SHORT:
+                       case MYSQL_TYPE_TINY:
+                       case MYSQL_TYPE_LONG:
+                       case MYSQL_TYPE_INT24:
+                       case MYSQL_TYPE_YEAR:
+                               convert_to_long_ex(args[i]);
+                               stmt->bind[ofs].type = IS_LONG;
+                               stmt->bind[ofs].buflen = 0;
+                               bind[ofs].buffer_type = MYSQL_TYPE_LONG;
+                               bind[ofs].buffer = (gptr)&Z_LVAL_PP(args[i]);
+                               bind[ofs].is_null = &stmt->is_null[ofs];
+                               break;
+
+                       case MYSQL_TYPE_LONGLONG:
+                               stmt->bind[ofs].type = IS_STRING; 
+                               stmt->bind[ofs].buflen = (stmt->stmt->fields) ? stmt->stmt->fields[ofs].length + 1 : 256;
+                               stmt->bind[ofs].buffer = (char *)emalloc(stmt->bind[ofs].buflen);
+                               bind[ofs].buffer_type = MYSQL_TYPE_LONGLONG;
+                               bind[ofs].buffer = stmt->bind[ofs].buffer;
+                               bind[ofs].is_null = &stmt->is_null[ofs];
+                               bind[ofs].buffer_length = stmt->bind[ofs].buflen - 1;
+                               break;
+                       case MYSQL_TYPE_DATE:
+                       case MYSQL_TYPE_TIME:
+                       case MYSQL_TYPE_DATETIME:
+                       case MYSQL_TYPE_NEWDATE:
+                       case MYSQL_TYPE_VAR_STRING:
+                       case MYSQL_TYPE_STRING:
+                       case MYSQL_TYPE_BLOB:
+                       case MYSQL_TYPE_TIMESTAMP:
+                               stmt->bind[ofs].type = IS_STRING; 
+                               stmt->bind[ofs].buflen = (stmt->stmt->fields) ? stmt->stmt->fields[ofs].length + 1: 256;
+                               stmt->bind[ofs].buffer = (char *)emalloc(stmt->bind[ofs].buflen);
+                               bind[ofs].buffer_type = MYSQL_TYPE_STRING;
+                               bind[ofs].buffer = stmt->bind[ofs].buffer;
+                               bind[ofs].is_null = &stmt->is_null[ofs];
+                               bind[ofs].buffer_length = stmt->bind[ofs].buflen;
+                               break;
+               }
+               bind[ofs].length = &stmt->bind[ofs].buflen;
+       }
+
+       if (mysql_bind_result(stmt->stmt, bind)) {
+               efree(bind);
+               efree(args);
+               php_clear_stmt_bind(stmt);
+               return;
+       }
+
+       stmt->var_cnt = var_cnt;
+       stmt->vars = (zval **)emalloc((var_cnt) * sizeof(zval));
+       for (i = start; i < var_cnt+start; i++) {
+               ofs = i-start;
+               ZVAL_ADDREF(*args[i]);
+               stmt->vars[ofs] = *args[i];
+       }
+
+       efree(args);
+       efree(bind);
+
+       RETURN_TRUE;
+}
+/* }}} */
+
+/* {{{ proto bool mysqli_change_user(resource link, string user, string password, string database)
+*/
+PHP_FUNCTION(mysqli_change_user)
+{
+       MYSQL *mysql;
+       zval  *mysql_link = NULL;
+       char  *user, *password, *dbname;
+       int       user_len, password_len, dbname_len;
+
+       if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Osss", &mysql_link, mysqli_link_class_entry, &user, &user_len, &password, &password_len, &dbname, &dbname_len) == FAILURE) {
+               return;
+       }
+       MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, &mysql_link, "mysqli_link"); 
+
+       if (mysql_change_user(mysql, user, password, dbname)) {
+               RETURN_FALSE;
+       }
+
+       RETURN_TRUE;
+}
+/* }}} */
+
+/* {{{ proto string mysqli_character_set_name(resource link)
+*/
+PHP_FUNCTION(mysqli_character_set_name)
+{
+       MYSQL *mysql;
+       zval *mysql_link;
+
+       if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_link, mysqli_link_class_entry) == FAILURE) {
+               return;
+       }
+
+       MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, &mysql_link, "mysqli_link"); 
+       RETURN_STRING((char *)mysql_character_set_name(mysql), 1);
+}
+/* }}} */
+
+/* {{{ proto bool mysqli_close(resource link)
+   close connection */
+PHP_FUNCTION(mysqli_close){
+       zval *mysql_link;
+       MYSQL *mysql;
+       
+       if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_link, mysqli_link_class_entry) == FAILURE) {
+               return;
+       }
+
+       MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, &mysql_link, "mysqli_link"); 
+       mysql_close(mysql);
+       MYSQLI_CLEAR_RESOURCE(&mysql_link);     
+       RETURN_TRUE;
+}
+/* }}} */
+
+/* {{{ proto bool mysqli_commit(resource link)
+*/
+PHP_FUNCTION(mysqli_commit)
+{
+       MYSQL *mysql;
+       zval *mysql_link;
+
+       if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_link, mysqli_link_class_entry) == FAILURE) {
+               return;
+       }
+       MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, &mysql_link, "mysqli_link"); 
+       RETURN_BOOL(mysql_commit(mysql));
+}
+/* }}} */
+
+/* {{{ proto void mysqli_data_seek(resource result)
+*/
+PHP_FUNCTION(mysqli_data_seek)
+{
+       MYSQL_RES *result;
+       zval  *mysql_result;
+       
+       long  offset;
+
+       if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Orl", &mysql_result, mysqli_result_class_entry, &mysql_result, &offset) == FAILURE) {
+               return;
+       }
+
+       MYSQLI_FETCH_RESOURCE(result, MYSQL_RES *, &mysql_result, "mysqli_result"); 
+
+       if (result->handle && result->handle->status == MYSQL_STATUS_USE_RESULT) {
+               php_error_docref(NULL TSRMLS_CC, E_WARNING, "(%s:) Function cannot be used with MYSQL_USE_RESULT");
+               RETURN_LONG(0);
+       }
+
+       mysql_data_seek (result, offset);
+       return;
+}
+/* }}} */
+
+/* {{{ proto void mysqli_debug(string debug)
+*/
+PHP_FUNCTION(mysqli_debug)
+{
+       char    *debug;
+       int             debug_len;
+
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &debug, &debug_len) == FAILURE) {
+               return;
+       }
+       
+       mysql_debug(debug);
+       return;
+}
+/* }}} */
+
+/* {{{ proto void mysqli_disable_reads_from_master(resource link)
+*/
+PHP_FUNCTION(mysqli_disable_reads_from_master) {
+       MYSQL   *mysql;
+       zval    *mysql_link;
+
+       if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_link, mysqli_link_class_entry) == FAILURE) {
+               return;
+       }
+       MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, &mysql_link, "mysqli_link"); 
+       return (mysql_disable_reads_from_master(mysql));
+}
+/* }}} */
+
+/* {{{ proto void mysqli_disable_rpl_parse(resource link)
+*/
+PHP_FUNCTION(mysqli_disable_rpl_parse) {
+       MYSQL   *mysql;
+       zval    *mysql_link;
+
+       if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_link, mysqli_link_class_entry) == FAILURE) {
+               return;
+       }
+       MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, &mysql_link, "mysqli_link"); 
+       return (mysql_disable_rpl_parse(mysql));
+}
+/* }}} */
+
+/* {{{ proto bool mysqli_dump_debug_info(resource link)
+*/
+PHP_FUNCTION(mysqli_dump_debug_info)
+{
+       MYSQL *mysql;
+       zval  *mysql_link;
+
+       if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_link, mysqli_link_class_entry) == FAILURE) {
+               return;
+       }
+       MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, &mysql_link, "mysqli_link"); 
+
+       if (mysql_dump_debug_info(mysql)) {
+               RETURN_FALSE;
+       }
+       RETURN_TRUE;    
+}
+/* }}} */
+
+/* {{{ proto void mysqli_enable_reads_from_master(resource link)
+*/
+PHP_FUNCTION(mysqli_enable_reads_from_master) {
+       MYSQL   *mysql;
+       zval  *mysql_link;
+
+       if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_link, mysqli_link_class_entry) == FAILURE) {
+               return;
+       }
+       MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, &mysql_link, "mysqli_link"); 
+
+       return (mysql_enable_reads_from_master(mysql));
+}
+/* }}} */
+
+/* {{{ proto void mysqli_enable_rpl_parse(resource link)
+*/
+PHP_FUNCTION(mysqli_enable_rpl_parse) {
+       MYSQL   *mysql;
+       zval    *mysql_link;
+
+       if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_link, mysqli_link_class_entry) == FAILURE) {
+               return;
+       }
+       MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, &mysql_link, "mysqli_link"); 
+
+       return (mysql_enable_rpl_parse(mysql));
+}
+/* }}} */
+
+/* {{{ proto int mysqli_errno(resource link)
+*/
+PHP_FUNCTION(mysqli_errno)
+{
+       MYSQL *mysql;
+       zval    *mysql_link;
+
+       if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_link, mysqli_link_class_entry) == FAILURE) {
+               return;
+       }
+       MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, &mysql_link, "mysqli_link"); 
+       RETURN_LONG(mysql_errno(mysql));
+}
+/* }}} */
+
+/* {{{ proto string mysql_error(resource link)
+*/
+PHP_FUNCTION(mysqli_error) 
+{
+       MYSQL *mysql;
+       zval    *mysql_link;
+
+       if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_link, mysqli_link_class_entry) == FAILURE) {
+               return;
+       }
+       MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, &mysql_link, "mysqli_link"); 
+       RETURN_STRING((char *)mysql_error(mysql),1);
+}
+/* }}} */
+
+/* {{{ proto int mysqli_execute(resource stmt)
+*/
+PHP_FUNCTION(mysqli_execute)
+{
+       STMT *stmt;
+       zval *mysql_stmt;
+       int      i;
+
+       if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_stmt, mysqli_stmt_class_entry) == FAILURE) {
+               return;
+       }
+       MYSQLI_FETCH_RESOURCE(stmt, STMT *, &mysql_stmt, "mysqli_stmt"); 
+       
+       if (stmt->type == FETCH_SIMPLE) {
+               for (i=0; i < stmt->var_cnt; i++) {             
+                       if (stmt->vars[i]) {
+                               stmt->is_null[i] = (stmt->vars[i]->type == IS_NULL);
+
+                               switch (stmt->stmt->params[i].buffer_type) {
+                                       case MYSQL_TYPE_VAR_STRING:
+                                               convert_to_string_ex(&stmt->vars[i]);
+                                               stmt->stmt->params[i].buffer = Z_STRVAL_PP(&stmt->vars[i]);
+                                               stmt->stmt->params[i].buffer_length = strlen(Z_STRVAL_PP(&stmt->vars[i]));
+                                               break;
+                                       case MYSQL_TYPE_FLOAT:
+                                               convert_to_double_ex(&stmt->vars[i]);
+                                               stmt->stmt->params[i].buffer = (gptr)&Z_LVAL_PP(&stmt->vars[i]);
+                                               break;
+                                       case MYSQL_TYPE_LONG:
+                                               convert_to_long_ex(&stmt->vars[i]);
+                                               stmt->stmt->params[i].buffer = (gptr)&Z_LVAL_PP(&stmt->vars[i]);
+                                               break;
+                                       default:
+                                       break;
+                               }       
+                       }
+               }
+       }
+
+       RETURN_LONG(mysql_execute(stmt->stmt));
+}
+/* }}} */
+
+/* {{{ proto bool mysqli_fetch(resource stmt)
+*/
+PHP_FUNCTION(mysqli_fetch)
+{
+       STMT *stmt;
+       zval *mysql_stmt;
+       int      i;
+       ulong ret;
+
+       if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_stmt, mysqli_stmt_class_entry) == FAILURE) {
+               return;
+       }
+       MYSQLI_FETCH_RESOURCE(stmt, STMT *, &mysql_stmt, "mysqli_stmt"); 
+       
+       /* reset buffers */
+
+
+       for (i=0; i < stmt->var_cnt; i++) {
+               if (stmt->bind[i].type == IS_STRING)
+                       memset(stmt->bind[i].buffer, 0, stmt->bind[i].buflen);
+       }
+       
+       ret = mysql_fetch(stmt->stmt);
+
+       if (ret) {
+               RETURN_FALSE;
+       }
+
+       for (i=0; i < stmt->var_cnt; i++) {
+
+               if (!stmt->is_null[i]) {
+                       switch (stmt->bind[i].type) {
+                               case IS_LONG:
+                                       stmt->vars[i]->type = IS_LONG;
+                                       break;
+                               case IS_DOUBLE:
+                                       stmt->vars[i]->type = IS_DOUBLE;
+                                       break;
+                               case IS_STRING:
+                                       if (stmt->stmt->bind[i].buffer_type == MYSQL_TYPE_LONGLONG) {
+                                               char tmp[50];
+                                               unsigned long long lval;
+                                               memcpy (&lval, stmt->bind[i].buffer, sizeof(long long));
+                                               if (lval != (long)lval) {
+                                                       sprintf((char *)&tmp, "%lld", lval);
+                                                       ZVAL_STRING(stmt->vars[i], tmp, 1);
+                                               }
+                                               else
+                                                       ZVAL_LONG(stmt->vars[i], lval);
+                                       }
+                                       else {
+                                               stmt->bind[i].type = IS_STRING;
+                                               ZVAL_STRING(stmt->vars[i], stmt->bind[i].buffer, 1);
+                                       }
+                                       break;
+                               default:
+                               break;  
+                       }
+               }
+               else
+                       stmt->vars[i]->type = IS_NULL;
+       }
+
+       RETURN_LONG(ret);
+}
+/* }}} */
+
+/* {{{ proto int mysql_fetch_field (resource result)
+*/
+PHP_FUNCTION(mysqli_fetch_field) 
+{
+       MYSQL_RES *result;
+       zval  *mysql_result;
+       MYSQL_FIELD *field;
+
+       if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_result, mysqli_result_class_entry) == FAILURE) {
+               return;
+       }
+
+       MYSQLI_FETCH_RESOURCE(result, MYSQL_RES *, &mysql_result, "mysqli_result"); 
+
+       if (!(field = mysql_fetch_field(result))) {
+               RETURN_FALSE;
+       }
+
+       if (object_init(return_value) == FAILURE){
+               RETURN_FALSE;
+       }
+
+       add_property_string(return_value, "name",(field->name ? field->name : ""), 1);
+       add_property_string(return_value, "orgname",(field->org_name ? field->org_name : ""), 1);
+       add_property_string(return_value, "table",(field->table ? field->table : ""), 1);
+       add_property_string(return_value, "orgtable",(field->org_table ? field->org_table : ""), 1);
+       add_property_string(return_value, "def",(field->def ? field->def : ""), 1);
+       add_property_long(return_value, "max_length", field->max_length);
+       add_property_long(return_value, "flags", field->flags);
+       add_property_long(return_value, "type", field->type);
+       add_property_long(return_value, "decimals", field->decimals);
+}
+/* }}} */
+
+/* {{{ proto int mysql_fetch_fields (resource result)
+*/
+PHP_FUNCTION(mysqli_fetch_fields) 
+{
+       MYSQL_RES *result;
+       zval  *mysql_result;
+       MYSQL_FIELD *field;
+       zval *obj;
+
+       int i;
+
+       if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_result, mysqli_result_class_entry) == FAILURE) {
+               return;
+       }
+
+       MYSQLI_FETCH_RESOURCE(result, MYSQL_RES *, &mysql_result, "mysqli_result"); 
+
+       if (!(field = mysql_fetch_field(result))) {
+               RETURN_FALSE;
+       }
+
+       if (array_init(return_value) == FAILURE) {
+               RETURN_FALSE;
+       }
+
+       for (i=0; i < mysql_num_fields(result); i++) {
+               field = mysql_fetch_field_direct(result, i);
+
+
+               MAKE_STD_ZVAL(obj);
+               if (object_init(obj) == FAILURE){
+                       RETURN_FALSE;
+               }
+
+               add_property_string(obj, "name",(field->name ? field->name : ""), 1);
+               add_property_string(obj, "orgname",(field->org_name ? field->org_name : ""), 1);
+               add_property_string(obj, "table",(field->table ? field->table : ""), 1);
+               add_property_string(obj, "orgtable",(field->org_table ? field->org_table : ""), 1);
+               add_property_string(obj, "def",(field->def ? field->def : ""), 1);
+               add_property_long(obj, "max_length", field->max_length);
+               add_property_long(obj, "flags", field->flags);
+               add_property_long(obj, "type", field->type);
+               add_property_long(obj, "decimals", field->decimals);
+
+               add_index_zval(return_value, i, obj);
+       }
+}
+/* }}} */
+
+/* {{{ proto int mysql_fetch_field_direct (resource result, int offset)
+*/
+PHP_FUNCTION(mysqli_fetch_field_direct) 
+{
+       MYSQL_RES *result;
+       zval  *mysql_result;
+       MYSQL_FIELD *field;
+       int offset;
+
+       if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Ol", &mysql_result, mysqli_result_class_entry, &offset) == FAILURE) {
+               return;
+       }
+
+       MYSQLI_FETCH_RESOURCE(result, MYSQL_RES *, &mysql_result, "mysqli_result"); 
+
+       if (!(field = mysql_fetch_field_direct(result,offset))) {
+               RETURN_FALSE;
+       }
+
+       if (object_init(return_value) == FAILURE){
+               RETURN_FALSE;
+       }
+
+       add_property_string(return_value, "name",(field->name ? field->name : ""), 1);
+       add_property_string(return_value, "orgname",(field->org_name ? field->org_name : ""), 1);
+       add_property_string(return_value, "table",(field->table ? field->table : ""), 1);
+       add_property_string(return_value, "orgtable",(field->org_table ? field->org_table : ""), 1);
+       add_property_string(return_value, "def",(field->def ? field->def : ""), 1);
+       add_property_long(return_value, "max_length", field->max_length);
+       add_property_long(return_value, "flags", field->flags);
+       add_property_long(return_value, "type", field->type);
+       add_property_long(return_value, "decimals", field->decimals);
+}
+/* }}} */
+
+/* {{{ proto array mysqli_fetch_lengths (resource result)
+*/
+PHP_FUNCTION(mysqli_fetch_lengths) 
+{
+       MYSQL_RES *result;
+       zval  *mysql_result;
+       int     i;
+       unsigned long *ret;
+       
+
+       if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_result, mysqli_result_class_entry) == FAILURE) {
+               return;
+       }
+
+       MYSQLI_FETCH_RESOURCE(result, MYSQL_RES *, &mysql_result, "mysqli_result"); 
+
+       ret = mysql_fetch_lengths(result);
+
+       if (ret == NULL) {
+               RETURN_FALSE;
+       }
+
+       if (array_init(return_value) == FAILURE) {
+               RETURN_FALSE;
+       }
+
+       for (i=0; i < mysql_num_fields(result); i++) {
+               add_index_long(return_value, i, ret[i]);        
+       }
+}
+/* }}} */
+
+/* {{{ proto array mysqli_fetch_row (resource result)
+*/
+PHP_FUNCTION(mysqli_fetch_row) 
+{
+       php_mysqli_fetch_into_hash(INTERNAL_FUNCTION_PARAM_PASSTHRU, MYSQLI_NUM);
+}
+/* }}} */
+
+/* {{{ proto int mysqli_field_count(resource link)
+*/
+PHP_FUNCTION(mysqli_field_count) 
+{
+       MYSQL *mysql;
+       zval  *mysql_link;
+
+       if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_link, mysqli_link_class_entry) == FAILURE) {
+               return;
+       }
+       MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, &mysql_link, "mysqli_link"); 
+
+       RETURN_LONG(mysql_field_count(mysql));
+}
+/* }}} */
+
+/* {{{ proto int mysqli_field_seek(resource link, int fieldnr)
+*/
+PHP_FUNCTION(mysqli_field_seek)
+{
+       MYSQL_RES *result;
+       zval  *mysql_result;
+       int fieldnr;
+
+       if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Ol", &mysql_result, mysqli_result_class_entry, &fieldnr) == FAILURE) {
+               return;
+       }
+       MYSQLI_FETCH_RESOURCE(result, MYSQL_RES *, &mysql_result, "mysqli_result"); 
+
+       if (fieldnr < 0 || fieldnr >= mysql_num_fields(result)) {
+               php_error_docref(NULL TSRMLS_CC, E_WARNING, "(%s:) Field offset is invalid for resultset");
+               RETURN_FALSE; 
+       }
+       
+       mysql_field_seek(result, fieldnr);
+       RETURN_TRUE;
+}
+/* }}} */
+
+/* {{{ proto int mysqli_field_tell(resource result)
+*/
+PHP_FUNCTION(mysqli_field_tell)
+{
+       MYSQL_RES *result;
+       zval  *mysql_result;
+
+       if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_result, mysqli_result_class_entry) == FAILURE) {
+               return;
+       }
+       MYSQLI_FETCH_RESOURCE(result, MYSQL_RES *, &mysql_result, "mysqli_result"); 
+       
+       RETURN_LONG(mysql_field_tell(result));
+}
+/* }}} */
+
+/* {{{ proto int mysqli_free_result(resource result)
+*/
+PHP_FUNCTION(mysqli_free_result) 
+{
+       MYSQL_RES *result;
+       zval  *mysql_result;
+
+       if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_result, mysqli_result_class_entry) == FAILURE) {
+               return;
+       }
+       MYSQLI_FETCH_RESOURCE(result, MYSQL_RES *, &mysql_result, "mysqli_result"); 
+
+       mysql_free_result(result);      
+       MYSQLI_CLEAR_RESOURCE(&mysql_result);   
+
+       RETURN_TRUE;
+}
+/* }}} */
+
+/* {{{ proto string mysqli_get_client_info 
+*/
+PHP_FUNCTION(mysqli_get_client_info)
+{
+       RETURN_STRING((char *)mysql_get_client_info(), 1);
+}
+/* }}} */
+
+/* {{{ proto string mysqli_get_host_info 
+*/
+PHP_FUNCTION(mysqli_get_host_info)
+{
+       MYSQL *mysql;
+       zval  *mysql_link = NULL;
+
+       if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_link, mysqli_link_class_entry) == FAILURE) {
+               return;
+       }
+       MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, &mysql_link, "mysqli_link"); 
+
+       RETURN_STRING((char *)mysql_get_host_info(mysql), 1);
+}
+/* }}} */
+
+/* {{{ proto int mysqli_get_proto_info 
+*/
+PHP_FUNCTION(mysqli_get_proto_info)
+{
+       MYSQL *mysql;
+       zval  *mysql_link = NULL;
+
+       if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_link, mysqli_link_class_entry) == FAILURE) {
+               return;
+       }
+       MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, &mysql_link, "mysqli_link"); 
+
+       RETURN_LONG(mysql_get_proto_info(mysql));
+}
+/* }}} */
+
+/* {{{ proto string mysqli_get_server_info 
+*/
+PHP_FUNCTION(mysqli_get_server_info)
+{
+       MYSQL   *mysql;
+       zval    *mysql_link = NULL;
+
+       if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_link, mysqli_link_class_entry) == FAILURE) {
+               return;
+       }
+       MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, &mysql_link, "mysqli_link"); 
+
+       RETURN_STRING((char *)mysql_get_server_info(mysql), 1);
+}
+
+/* }}} */
+
+/* {{{ proto string mysqli_info(resource link)
+*/
+PHP_FUNCTION(mysqli_info)
+{
+       MYSQL *mysql;
+       char  *info = NULL;
+       zval    *mysql_link = NULL;
+
+       if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_link, mysqli_link_class_entry) == FAILURE) {
+               return;
+       }
+       MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, &mysql_link, "mysqli_link"); 
+
+       info = (char *)mysql_info(mysql);
+       
+       if (!info){
+               return;
+       }
+       RETURN_STRING(info, 1);
+}
+/* }}} */
+
+/* {{{ resource mysqli_init(void)
+   initialize mysqli */
+PHP_FUNCTION(mysqli_init)
+{
+       MYSQL *mysql = mysql_init(NULL);
+       MYSQLI_RETURN_RESOURCE(mysql, mysqli_link_class_entry); 
+}
+/* }}} */
+
+/* {{{ proto int mysqli_insert_id(resource link)
+*/
+PHP_FUNCTION(mysqli_insert_id)
+{
+       MYSQL *mysql;
+       unsigned long long rc;
+       char  ret[50];
+       zval  *mysql_link;
+
+       if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_link, mysqli_link_class_entry) == FAILURE) {
+               return;
+       }
+       MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, &mysql_link, "mysqli_link"); 
+       rc = mysql_insert_id(mysql);
+
+       if (rc != (long)rc) {
+               sprintf((char *)&ret, "%lld", rc);
+               RETURN_STRING(ret,1);
+       }
+       else
+               RETURN_LONG(rc);
+}
+/* }}} */
+
+/* {{{ proto bool mysqli_kill(resource link, int processid)
+*/
+PHP_FUNCTION(mysqli_kill)
+{
+       MYSQL *mysql;
+       zval  *mysql_link;
+       int   processid;
+
+       if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Ol", &mysql_link, mysqli_link_class_entry, &processid) == FAILURE) {
+               return;
+       }
+       MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, &mysql_link, "mysqli_link"); 
+       
+       if (mysql_kill(mysql, processid)) {
+               RETURN_FALSE;
+       }
+
+       RETURN_TRUE;
+}
+/* }}} */
+
+/* {{{ proto bool mysqli_master_query(resource link, string query)
+*/
+PHP_FUNCTION(mysqli_master_query) {
+       MYSQL   *mysql;
+       zval    *mysql_link;
+       char    *query = NULL;
+       unsigned int query_len;
+
+       if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os", &mysql_link, mysqli_link_class_entry, &query, &query_len) == FAILURE) {
+               return;
+       }
+       MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, &mysql_link, "mysqli_link"); 
+
+       if (mysql_master_query(mysql, query, query_len)) {
+               RETURN_FALSE;
+       }       
+       RETURN_TRUE;
+}
+/* }}} */
+
+/* {{{ proto int mysqli_num_fields(resource result)
+*/
+PHP_FUNCTION(mysqli_num_fields)
+{
+       MYSQL_RES *result;
+       zval  *mysql_result;
+
+       if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_result, mysqli_result_class_entry) == FAILURE) {
+               return;
+       }
+       MYSQLI_FETCH_RESOURCE(result, MYSQL_RES *, &mysql_result, "mysqli_result"); 
+
+
+       RETURN_LONG(mysql_num_fields(result));
+}
+/* }}} */
+
+/* {{{ proto int mysqli_num_rows(resource result)
+*/
+PHP_FUNCTION(mysqli_num_rows)
+{
+       MYSQL_RES *result;
+       zval  *mysql_result;
+
+       if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_result, mysqli_result_class_entry) == FAILURE) {
+               return;
+       }
+       MYSQLI_FETCH_RESOURCE(result, MYSQL_RES *, &mysql_result, "mysqli_result"); 
+
+       if (result->handle && result->handle->status == MYSQL_STATUS_USE_RESULT) {
+               php_error_docref(NULL TSRMLS_CC, E_WARNING, "(%s:) Function cannot be used with MYSQL_USE_RESULT");
+               RETURN_LONG(0);
+       }
+
+       RETURN_LONG(mysql_num_rows(result));
+}
+/* }}} */
+
+/* {{{ proto int mysqli_num_warnings 
+ */
+PHP_FUNCTION(mysqli_num_warnings)
+{
+       MYSQL *mysql;
+       zval  *mysql_link = NULL;
+
+       if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_link, mysqli_link_class_entry) == FAILURE) {
+               return;
+       }
+       MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, &mysql_link, "mysqli_link"); 
+
+       RETURN_LONG(mysql_warning_count(mysql));
+}
+/* }}} */
+
+/* {{{ proto bool mysqli_options(resource link, int flags, mixed values)
+   set options */
+PHP_FUNCTION(mysqli_options)
+{
+       MYSQL *mysql;
+       zval  *mysql_link = NULL;
+       zval  *mysql_value;
+       long  mysql_option;
+       unsigned int l_value;
+       long  ret;
+
+       if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Oslz", &mysql_link, mysqli_link_class_entry, &mysql_option, &mysql_value) == FAILURE) {
+               return;
+       }
+       MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, &mysql_link, "mysqli_link"); 
+
+       switch (Z_TYPE_PP(&mysql_value)) {
+               case IS_STRING:
+                       ret = mysql_options(mysql, mysql_option, Z_STRVAL_PP(&mysql_value));
+               break;
+               default:
+                       convert_to_long_ex(&mysql_value);
+                       l_value = Z_LVAL_PP(&mysql_value);
+                       ret = mysql_options(mysql, mysql_option, (char *)&l_value);
+               break;
+       }
+
+       if (ret != 0) {
+               RETVAL_FALSE;
+       } else {
+               RETVAL_TRUE;
+       }
+}   
+/* }}} */
+
+/* {{{ proto int mysqli_param_count(resource stmt) {
+   return the number of parameter for the given statement */
+PHP_FUNCTION(mysqli_param_count) {
+       STMT    *stmt;
+       zval    *mysql_stmt;
+       
+       if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_stmt, mysqli_stmt_class_entry) == FAILURE) {
+               return;
+       }
+       MYSQLI_FETCH_RESOURCE(stmt, STMT *, &mysql_stmt, "mysqli_stmt"); 
+               
+       RETURN_LONG(mysql_param_count(stmt->stmt));
+}
+/* }}} */
+
+/* {{{ proto int mysqli_ping(resource link)
+*/
+PHP_FUNCTION(mysqli_ping)
+{
+       MYSQL *mysql;
+       zval  *mysql_link;
+
+       if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_link, mysqli_link_class_entry) == FAILURE) {
+               return;
+       }
+       MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, &mysql_link, "mysqli_link"); 
+       RETURN_LONG(mysql_ping(mysql));
+}
+/* }}} */
+
+/* {{{ proto resource mysqli_prepare(resource link, char* query)
+   */
+PHP_FUNCTION(mysqli_prepare)
+{
+       MYSQL           *mysql;
+       STMT            *stmt;
+       char            *query = NULL;
+       unsigned int query_len;
+       zval            *mysql_link;
+
+       if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os",&mysql_link, mysqli_link_class_entry, &query, &query_len) == FAILURE) {
+               return;
+       }
+       MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, &mysql_link, "mysqli_link"); 
+
+       stmt = (STMT *)ecalloc(1,sizeof(STMT));
+       stmt->var_cnt = 0;
+       stmt->stmt = mysql_prepare(mysql, query, query_len); 
+
+       if (!stmt->stmt) {
+               efree(stmt);
+               RETURN_FALSE;
+       }
+
+       if (mysql_param_count(stmt->stmt)) {
+               stmt->is_null = (char *)emalloc(mysql_param_count(stmt->stmt));
+       }
+
+       MYSQLI_RETURN_RESOURCE(stmt, mysqli_stmt_class_entry);
+}
+/* }}} */
+
+/* {{{ proto resource mysqli_prepare_result(stmt)
+*/
+PHP_FUNCTION(mysqli_prepare_result)
+{
+       STMT *stmt;
+       MYSQL_RES *result;
+       zval *mysql_stmt;
+
+       if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_stmt, mysqli_stmt_class_entry) == FAILURE) {
+               return;
+       }
+       MYSQLI_FETCH_RESOURCE(stmt, STMT *, &mysql_stmt, "mysqli_stmt"); 
+       
+       result = mysql_prepare_result(stmt->stmt);
+
+       if (!result) {
+               RETURN_FALSE;
+       }
+       MYSQLI_RETURN_RESOURCE(result, mysqli_result_class_entry);      
+}
+/* }}} */
+
+/* {{{ proto bool mysqli_read_query_result(resource link)
+*/
+PHP_FUNCTION(mysqli_read_query_result) {
+       MYSQL   *mysql;
+       zval    *mysql_link;
+       if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_link, mysqli_link_class_entry) == FAILURE) {
+               return;
+       }
+       MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, &mysql_link, "mysqli_link"); 
+
+       if (mysql_read_query_result(mysql))
+               RETURN_FALSE;
+       RETURN_TRUE;
+}
+/* }}} */
+
+/* {{{ proto bool mysqli_real_connect(resource link, [string hostname, [string username, [string passwd, [string dbname, [int port, [string socket]]]]])
+   open a connection to a mysql server */ 
+PHP_FUNCTION(mysqli_real_connect)
+{
+       MYSQL *mysql;
+       char *hostname = NULL, *username=NULL, *passwd=NULL, *dbname=NULL, *socket=NULL;
+       unsigned int hostname_len, username_len, passwd_len, dbname_len, socket_len;
+       unsigned int port=0, flags=0;
+       zval *mysql_link;
+
+       if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O|sssslsl", &mysql_link, mysqli_link_class_entry,
+               &hostname, &hostname_len, &username, &username_len, &passwd, &passwd_len, &dbname, &dbname_len, &port, &socket, &socket_len,
+               &flags) == FAILURE) {
+               return;
+       }
+
+       if (!socket_len) {
+               socket = NULL;
+       }
+
+       /* TODO: safe mode handling */
+       if (PG(sql_safe_mode)){
+       } else {
+               if (!passwd) {
+                       passwd = MyG(default_pw);
+                       if (!username){
+                               username = MyG(default_user);
+                               if (!hostname) {
+                                       hostname = MyG(default_host);
+                               }
+                       }
+               }
+       }       
+
+       MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, &mysql_link, "mysqli_link"); 
+
+       if (mysql_real_connect(mysql,hostname,username,passwd,dbname,port,socket,flags) == NULL) {
+               /* Save error messages */
+               MyG(error_no) = mysql_errno(mysql);
+               MyG(error_msg) = estrdup(mysql_error(mysql));
+
+               php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", mysql_error(mysql));
+               RETURN_FALSE;
+       }
+       RETURN_TRUE;
+}
+/* }}} */
+
+/* {{{ proto bool mysqli_real_query(resource link, string query)
+*/
+PHP_FUNCTION(mysqli_real_query) {
+       MYSQL   *mysql;
+       zval    *mysql_link;
+       char    *query = NULL;
+       unsigned int query_len;
+
+       if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os", &mysql_link, mysqli_link_class_entry, &query, &query_len) == FAILURE) {
+               return;
+       }
+       MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, &mysql_link, "mysqli_link"); 
+
+       if (mysql_real_query(mysql, query, query_len)) {
+               RETURN_FALSE;
+       }       
+       RETURN_TRUE;
+}
+/* }}} */
+
+/* {{{ proto string mysqli_real_escape_string(resource link, string escapestr) 
+   close statement */
+PHP_FUNCTION(mysqli_real_escape_string) {
+       MYSQL   *mysql;
+       zval    *mysql_link = NULL;
+       char    *escapestr, *newstr;
+       int             escapestr_len, newstr_len;
+
+       if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os", &mysql_link, mysqli_link_class_entry, &escapestr, &escapestr_len) == FAILURE) {
+               return;
+       }       
+       MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, &mysql_link, "mysqli_link"); 
+
+       newstr = emalloc(2 * escapestr_len + 1);
+       newstr_len = mysql_real_escape_string(mysql, newstr, escapestr, escapestr_len);
+       newstr = erealloc(newstr, newstr_len + 1);
+               
+       RETURN_STRING(newstr, 0);
+}
+/* }}} */
+
+/* {{{ proto bool mysqli_reload (resource link)
+*/
+PHP_FUNCTION(mysqli_reload)
+{
+       MYSQL *mysql;
+       zval  *mysql_link;
+
+       if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_link, mysqli_link_class_entry) == FAILURE) {
+               return;
+       }
+       MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, &mysql_link, "mysqli_link"); 
+
+       RETURN_BOOL(!mysql_reload(mysql));
+}
+/* }}} */
+
+/* {{{ proto bool mysqli_rollback(resource link)
+*/
+PHP_FUNCTION(mysqli_rollback)
+{
+       MYSQL *mysql;
+       zval  *mysql_link;
+
+       if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_link, mysqli_link_class_entry) == FAILURE) {
+               return;
+       }
+       MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, &mysql_link, "mysqli_link"); 
+
+       RETURN_BOOL(mysql_rollback(mysql));
+}
+/* }}} */
+
+/* {{{ proto int mysqli_rpl_parse_enabled(resource link)
+*/
+PHP_FUNCTION(mysqli_rpl_parse_enabled) {
+       MYSQL   *mysql;
+       zval  *mysql_link;
+
+       if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_link, mysqli_link_class_entry) == FAILURE) {
+               return;
+       }
+       MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, &mysql_link, "mysqli_link"); 
+
+       RETURN_LONG(mysql_rpl_parse_enabled(mysql));
+}
+/* }}} */
+
+/* {{{ proto bool mysqli_rpl_probe(resource link)
+*/
+PHP_FUNCTION(mysqli_rpl_probe) {
+       MYSQL   *mysql;
+       zval  *mysql_link;
+
+       if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_link, mysqli_link_class_entry) == FAILURE) {
+               return;
+       }
+       MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, &mysql_link, "mysqli_link"); 
+
+
+       if (mysql_rpl_probe(mysql))
+               RETURN_FALSE;
+       RETURN_TRUE;
+}
+/* }}} */
+
+/* {{{ proto int mysqli_rpl_query_type(string query)
+*/
+PHP_FUNCTION(mysqli_rpl_query_type) {
+       MYSQL   *mysql;
+       zval    *mysql_link;
+       char    *query;
+       int             query_len;
+
+       if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os", &mysql_link, mysqli_link_class_entry, &query, &query_len) == FAILURE) {
+               return;
+       }
+       MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, &mysql_link, "mysqli_link"); 
+
+       RETURN_LONG(mysql_rpl_query_type(query, query_len));
+}
+/* }}} */
+
+/* {{{ proto bool mysqli_send_long_data(resource stmt, long param_nr, string data)
+*/
+PHP_FUNCTION(mysqli_send_long_data)
+{
+       STMT *stmt;
+       zval  *mysql_stmt;
+       char  *data;
+       long  param_nr, data_len;
+
+
+       if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Ols", &mysql_stmt, mysqli_stmt_class_entry, &param_nr, &data, &data_len) == FAILURE) {
+               return;
+       }
+       MYSQLI_FETCH_RESOURCE(stmt, STMT *, &mysql_stmt, "mysqli_stmt"); 
+
+       if (!param_nr) {
+               php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid parameter number");
+               RETURN_FALSE;
+       }
+       param_nr--;
+
+       if (mysql_send_long_data(stmt->stmt, param_nr, data, data_len)) {
+               RETURN_FALSE;
+       }
+       RETURN_TRUE;
+}
+/* }}} */
+
+/* {{{ proto bool mysqli_send_query(resource link, string query)
+*/
+PHP_FUNCTION(mysqli_send_query) {
+       MYSQL   *mysql;
+       zval    *mysql_link;
+       char    *query = NULL;
+       unsigned int query_len;
+
+       if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os", &mysql_link, mysqli_link_class_entry, &query, &query_len) == FAILURE) {
+               return;
+       }
+       MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, &mysql_link, "mysqli_link"); 
+
+       if (mysql_send_query(mysql, query, query_len)) {
+               RETURN_FALSE;
+       }       
+       RETURN_TRUE;
+}
+/* }}} */
+
+/* {{{ proto bool mysqli_slave_query(resource link, string query)
+*/
+PHP_FUNCTION(mysqli_slave_query) {
+       MYSQL   *mysql;
+       zval    *mysql_link;
+       char    *query = NULL;
+       unsigned int query_len;
+
+       if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os", &mysql_link, mysqli_link_class_entry, &query, &query_len) == FAILURE) {
+               return;
+       }
+       MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, &mysql_link, "mysqli_link"); 
+
+       if (mysql_slave_query(mysql, query, query_len)) {
+               RETURN_FALSE;
+       }       
+       RETURN_TRUE;
+}
+/* }}} */
+
+/* {{{ proto resource mysqli_store_result(resource link)
+*/
+PHP_FUNCTION(mysqli_store_result)
+{
+       MYSQL *mysql;
+       MYSQL_RES *result;
+       zval  *mysql_link;
+
+       if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_link, mysqli_link_class_entry) == FAILURE) {
+               return;
+       }
+       MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, &mysql_link, "mysqli_link"); 
+
+       result = mysql_store_result(mysql);
+
+       if (!result) {
+               RETURN_FALSE;
+       }
+       MYSQLI_RETURN_RESOURCE(result, mysqli_result_class_entry);      
+}
+/* }}} */
+
+/* {{{ proto bool mysqli_stmt_close(resource stmt) 
+   close statement */
+PHP_FUNCTION(mysqli_stmt_close) {
+       STMT    *stmt;
+       zval    *mysql_stmt;
+
+       if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_stmt, mysqli_stmt_class_entry) == FAILURE) {
+               return;
+       }
+       MYSQLI_FETCH_RESOURCE(stmt, STMT *, &mysql_stmt, "mysqli_stmt"); 
+
+       php_clear_stmt_bind(stmt); 
+       MYSQLI_CLEAR_RESOURCE(&mysql_stmt);
+       RETURN_TRUE;
+
+}
+/* }}} */
+
+/* {{{ proto string mysqli_select_db(resource link, string dbname)
+*/
+PHP_FUNCTION(mysqli_select_db) 
+{
+       MYSQL *mysql;
+       zval  *mysql_link;
+       char  *dbname;
+       int   dbname_len;
+
+//     if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC,  "Os", &mysql_link, mysqli_link_class_entry, &dbname, &dbname_len) == FAILURE) {
+       if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os", &mysql_link, mysqli_link_class_entry, &dbname, &dbname_len) == FAILURE) {
+               return;
+       } 
+       MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, &mysql_link, "mysqli_link"); 
+       
+       if (!mysql_select_db(mysql, dbname)) {
+               RETURN_TRUE;
+       }
+       
+       RETURN_FALSE;
+}
+/* }}} */
+
+/* {{{ proto string mysqli_ssl_set(resource link, [string key, [string cert, [string ca, [string capath, [string cipher]]]]])
+*/
+PHP_FUNCTION(mysqli_ssl_set)
+{
+       MYSQL *mysql;
+       zval  *mysql_link;
+       char  *key=NULL, *cert=NULL, *ca=NULL, *capath=NULL, *cipher=NULL;
+       int   key_len, cert_len, ca_len, capath_len, cipher_len;
+
+       if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Osssss", &mysql_link, mysqli_link_class_entry, 
+               &key, &key_len, &cert, &cert_len, &ca, &ca_len, &capath, &capath_len, &cipher, &cipher_len) == FAILURE) {
+               return;
+       }
+       MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, &mysql_link, "mysqli_link"); 
+       
+       mysql_ssl_set(mysql, key, cert, ca, capath, cipher);
+
+       RETURN_TRUE;
+}
+/* }}} */
+  
+/* {{{ proto string mysqli_stat 
+*/
+PHP_FUNCTION(mysqli_stat)
+{
+       MYSQL   *mysql;
+       zval  *mysql_link;
+
+       if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_link, mysqli_link_class_entry) == FAILURE) {
+               return;
+       }
+       MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, &mysql_link, "mysqli_link"); 
+
+       RETURN_STRING((char *)mysql_stat(mysql), 1);
+}
+
+/* }}} */
+/* {{{ proto int mysqli_stmt_errno(resource stmt)
+*/
+PHP_FUNCTION(mysqli_stmt_errno)
+{
+       STMT *stmt;
+       zval    *mysql_stmt;
+
+       if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_stmt, mysqli_stmt_class_entry) == FAILURE) {
+               return;
+       }
+       MYSQLI_FETCH_RESOURCE(stmt, STMT *, &mysql_stmt, "mysqli_stmt"); 
+
+       RETURN_LONG(mysql_stmt_errno(stmt->stmt));
+}
+/* }}} */
+
+/* {{{ proto string mysqli_stmt_error(resource stmt)
+*/
+PHP_FUNCTION(mysqli_stmt_error) 
+{
+       STMT *stmt;
+       zval    *mysql_stmt;
+
+       if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_stmt, mysqli_stmt_class_entry) == FAILURE) {
+               return;
+       }
+       MYSQLI_FETCH_RESOURCE(stmt, STMT *, &mysql_stmt, "mysqli_stmt"); 
+       
+       RETURN_STRING((char *)mysql_stmt_error(stmt->stmt),1);
+}
+/* }}} */
+
+/* {{{ proto int mysqli_thread_id(resource link)
+*/
+PHP_FUNCTION(mysqli_thread_id)
+{
+       MYSQL *mysql;
+       zval  *mysql_link;
+
+       if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_link, mysqli_link_class_entry) == FAILURE) {
+               return;
+       }
+       MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, &mysql_link, "mysqli_link"); 
+
+       RETURN_LONG(mysql_thread_id(mysql));
+}
+/* }}} */
+
+/* {{{ proto bool mysqli_thread_safe(void)
+*/
+PHP_FUNCTION(mysqli_thread_safe)
+{
+       RETURN_BOOL(mysql_thread_safe());
+}
+
+/* }}} */
+
+/* {{{ proto resource mysqli_use_result(resource link)
+*/
+PHP_FUNCTION(mysqli_use_result)
+{
+       MYSQL *mysql;
+       MYSQL_RES *result;
+       zval  *mysql_link;
+
+       if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_link, mysqli_link_class_entry) == FAILURE) {
+               return;
+       }
+       MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, &mysql_link, "mysqli_link"); 
+
+       result = mysql_use_result(mysql);
+
+       if (!result) {
+               RETURN_FALSE;
+       }
+       MYSQLI_RETURN_RESOURCE(result, mysqli_result_class_entry);      
+}
+/* }}} */
+
+/* {{{ proto resource mysqli_warning_count (resource link)
+*/
+PHP_FUNCTION(mysqli_warning_count)
+{
+       MYSQL *mysql;
+       zval  *mysql_link;
+
+       if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_link, mysqli_link_class_entry) == FAILURE) {
+               return;
+       }
+       MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, &mysql_link, "mysqli_link"); 
+
+       RETURN_LONG(mysql_warning_count(mysql));
+}
+/* }}} */
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * End:
+ * vim600: noet sw=4 ts=4 fdm=marker
+ * vim<600: noet sw=4 ts=4
+ */
diff --git a/ext/mysqli/mysqli_fe.c b/ext/mysqli/mysqli_fe.c
new file mode 100644 (file)
index 0000000..e93adcc
--- /dev/null
@@ -0,0 +1,227 @@
+/*
+  +----------------------------------------------------------------------+
+  | PHP Version 4                                                        |
+  +----------------------------------------------------------------------+
+  | Copyright (c) 1997-2002 The PHP Group                                |
+  +----------------------------------------------------------------------+
+  | This source file is subject to version 2.02 of the PHP license,      |
+  | that is bundled with this package in the file LICENSE, and is        |
+  | available at through the world-wide-web at                           |
+  | http://www.php.net/license/2_02.txt.                                 |
+  | If you did not receive a copy of the PHP license and are unable to   |
+  | obtain it through the world-wide-web, please send a note to          |
+  | license@php.net so we can mail you a copy immediately.               |
+  +----------------------------------------------------------------------+
+  | Author: Georg Richter <georg@php.net>                                |
+  +----------------------------------------------------------------------+
+
+  $Id$ 
+*/
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <signal.h>
+
+#include "php.h"
+#include "php_ini.h"
+#include "ext/standard/info.h"
+#include "php_mysqli.h"
+
+
+/* {{{ mysqli_functions[]
+ *
+ * Every user visible function must have an entry in mysqli_functions[].
+ */
+function_entry mysqli_functions[] = {
+       PHP_FE(mysqli_affected_rows,                                            NULL)
+       PHP_FE(mysqli_autocommit,                                                       NULL)
+       PHP_FE(mysqli_bind_param,                                                       NULL)
+       PHP_FE(mysqli_bind_result,                                                      NULL)
+       PHP_FE(mysqli_change_user,                                                      NULL)
+       PHP_FE(mysqli_character_set_name,                                       NULL)
+       PHP_FALIAS(mysqli_client_encoding, 
+                          mysqli_character_set_name,                           NULL)
+       PHP_FE(mysqli_close,                                                            NULL)
+       PHP_FE(mysqli_commit,                                                           NULL)
+       PHP_FE(mysqli_connect,                                                          NULL)
+       PHP_FE(mysqli_data_seek,                                                        NULL)
+       PHP_FE(mysqli_debug,                                                            NULL)
+       PHP_FE(mysqli_disable_reads_from_master,                        NULL)
+       PHP_FE(mysqli_disable_rpl_parse,                                        NULL)
+       PHP_FE(mysqli_dump_debug_info,                                          NULL)
+       PHP_FE(mysqli_enable_reads_from_master,                         NULL)
+       PHP_FE(mysqli_enable_rpl_parse,                                         NULL)
+       PHP_FE(mysqli_errno,                                                            NULL)
+       PHP_FE(mysqli_error,                                                            NULL)
+       PHP_FE(mysqli_execute,                                                          NULL)
+       PHP_FE(mysqli_fetch,                                                            NULL)
+       PHP_FE(mysqli_fetch_field,                                                      NULL)
+       PHP_FE(mysqli_fetch_fields,                                                     NULL)
+       PHP_FE(mysqli_fetch_field_direct,                                       NULL)
+       PHP_FE(mysqli_fetch_lengths,                                            NULL)
+       PHP_FE(mysqli_fetch_array,                                                      NULL)
+       PHP_FE(mysqli_fetch_assoc,                                                      NULL) 
+       PHP_FE(mysqli_fetch_object,                                                     NULL) 
+       PHP_FE(mysqli_fetch_row,                                                        NULL)
+       PHP_FE(mysqli_field_count,                                                      NULL)
+       PHP_FE(mysqli_field_seek,                                                       NULL)
+       PHP_FE(mysqli_field_tell,                                                       NULL)
+       PHP_FE(mysqli_free_result,                                                      NULL)
+       PHP_FE(mysqli_get_client_info,                                          NULL)
+       PHP_FE(mysqli_get_host_info,                                            NULL)
+       PHP_FE(mysqli_get_proto_info,                                           NULL)
+       PHP_FE(mysqli_get_server_info,                                          NULL)
+       PHP_FE(mysqli_init,                                                             NULL)
+       PHP_FE(mysqli_info,                                                                     NULL)
+       PHP_FE(mysqli_insert_id,                                                        NULL)
+       PHP_FE(mysqli_kill,                                                                     NULL)
+       PHP_FE(mysqli_master_query,                                                     NULL)
+       PHP_FE(mysqli_num_fields,                                                       NULL)
+       PHP_FE(mysqli_num_rows,                                                         NULL)
+       PHP_FE(mysqli_num_warnings,                                                     NULL)
+       PHP_FE(mysqli_options,                                                          NULL)
+       PHP_FE(mysqli_param_count,                                                      NULL)
+       PHP_FE(mysqli_ping,                                                                     NULL)
+       PHP_FE(mysqli_prepare,                                                          NULL)
+       PHP_FE(mysqli_prepare_result,                                           NULL)
+       PHP_FE(mysqli_query,                                                            NULL)
+       PHP_FE(mysqli_read_query_result,                                        NULL)
+       PHP_FE(mysqli_real_connect,                                                     NULL)
+       PHP_FE(mysqli_real_escape_string,                                       NULL)
+       PHP_FALIAS(mysqli_escape_string, 
+                               mysqli_real_escape_string,                              NULL)
+       PHP_FE(mysqli_real_query,                                                       NULL)
+       PHP_FE(mysqli_reload,                                                           NULL)
+       PHP_FE(mysqli_rollback,                                                         NULL)
+       PHP_FE(mysqli_rpl_parse_enabled,                                        NULL)
+       PHP_FE(mysqli_rpl_probe,                                                        NULL)
+       PHP_FE(mysqli_rpl_query_type,                                           NULL)
+       PHP_FE(mysqli_select_db,                                                        NULL)
+       PHP_FE(mysqli_send_long_data,                                           NULL)
+       PHP_FE(mysqli_send_query,                                                       NULL)
+       PHP_FALIAS(mysqli_set_opt,              mysqli_options,         NULL)
+       PHP_FE(mysqli_slave_query,                                                      NULL)
+       PHP_FE(mysqli_ssl_set,                                                          NULL)
+       PHP_FE(mysqli_stat,                                                                     NULL)
+       PHP_FE(mysqli_stmt_close,                                                       NULL)
+       PHP_FE(mysqli_stmt_errno,                                                       NULL)
+       PHP_FE(mysqli_stmt_error,                                                       NULL)
+       PHP_FE(mysqli_store_result,                                                     NULL)
+       PHP_FE(mysqli_thread_id,                                                        NULL)
+       PHP_FE(mysqli_thread_safe,                                                      NULL)
+       PHP_FE(mysqli_use_result,                                                       NULL)
+       PHP_FE(mysqli_warning_count,                                            NULL)
+       {NULL, NULL, NULL}      /* Must be the last line in mysqli_functions[] */
+};
+/* }}} */
+
+/* {{{ mysqli_link_methods[]
+ *
+ * Every user visible function must have an entry in mysqli_functions[].
+ */
+function_entry mysqli_link_methods[] = {
+       PHP_FALIAS(affected_rows,mysqli_affected_rows,NULL)
+       PHP_FALIAS(auto_commit,mysqli_autocommit,NULL)
+       PHP_FALIAS(change_user,mysqli_change_user,NULL)
+       PHP_FALIAS(character_set_name,mysqli_character_set_name,NULL)
+       PHP_FALIAS(client_encoding, mysqli_character_set_name,NULL)
+       PHP_FALIAS(close,mysqli_close,NULL)
+       PHP_FALIAS(commit,mysqli_commit,NULL)
+       PHP_FALIAS(connect,mysqli_connect,NULL)
+       PHP_FALIAS(debug,mysqli_debug,NULL)
+       PHP_FALIAS(disable_reads_from_master,mysqli_disable_reads_from_master,NULL)
+       PHP_FALIAS(disable_rpl_parse,mysqli_disable_rpl_parse,NULL)
+       PHP_FALIAS(dump_debug_info,mysqli_dump_debug_info,NULL)
+       PHP_FALIAS(enable_reads_from_master,mysqli_enable_reads_from_master,NULL)
+       PHP_FALIAS(enable_rpl_parse,mysqli_enable_rpl_parse,NULL)
+       PHP_FALIAS(errno,mysqli_errno,NULL)
+       PHP_FALIAS(error,mysqli_error,NULL)
+       PHP_FALIAS(get_client_info,mysqli_get_client_info,NULL)
+       PHP_FALIAS(get_host_info,mysqli_get_host_info,NULL)
+       PHP_FALIAS(get_proto_info,mysqli_get_proto_info,NULL)
+       PHP_FALIAS(get_server_info,mysqli_get_server_info,NULL)
+       PHP_FALIAS(init,mysqli_init,NULL)
+       PHP_FALIAS(info,mysqli_info,NULL)
+       PHP_FALIAS(insert_id,mysqli_insert_id,NULL)
+       PHP_FALIAS(kill,mysqli_kill,NULL)
+       PHP_FALIAS(master_query,mysqli_master_query,NULL)
+       PHP_FALIAS(options,mysqli_options,NULL)
+       PHP_FALIAS(ping,mysqli_ping,NULL)
+       PHP_FALIAS(prepare,mysqli_prepare,NULL)
+       PHP_FALIAS(query,mysqli_query,NULL)
+       PHP_FALIAS(read_query_result,mysqli_read_query_result,NULL)
+       PHP_FALIAS(real_connect,mysqli_real_connect,NULL)
+       PHP_FALIAS(real_escape_string,mysqli_real_escape_string,NULL)
+       PHP_FALIAS(escape_string, mysqli_real_escape_string,NULL)
+       PHP_FALIAS(real_query,mysqli_real_query,NULL)
+       PHP_FALIAS(reload,mysqli_reload,NULL)
+       PHP_FALIAS(rollback,mysqli_rollback,NULL)
+       PHP_FALIAS(rpl_parse_enabled,mysqli_rpl_parse_enabled,NULL)
+       PHP_FALIAS(rpl_probe,mysqli_rpl_probe,NULL)
+       PHP_FALIAS(rpl_query_type,mysqli_rpl_query_type,NULL)
+       PHP_FALIAS(select_db,mysqli_select_db,NULL)
+       PHP_FALIAS(set_opt, mysqli_options,NULL)
+       PHP_FALIAS(slave_query,mysqli_slave_query,NULL)
+       PHP_FALIAS(ssl_set,mysqli_ssl_set,NULL)
+       PHP_FALIAS(stat,mysqli_stat,NULL)
+       PHP_FALIAS(store_result,mysqli_store_result,NULL)
+       PHP_FALIAS(thread_id, mysqli_thread_id,NULL)
+       PHP_FALIAS(thread_safe,mysqli_thread_safe,NULL)
+       PHP_FALIAS(use_result,mysqli_use_result,NULL)
+       PHP_FALIAS(warning_count,mysqli_warning_count,NULL)
+       {NULL, NULL, NULL}
+};
+/* }}} */
+
+/* {{{ mysqli_result_methods[]
+ *
+ * Every user visible function must have an entry in mysqli_result_functions[].
+ */
+function_entry mysqli_result_methods[] = {
+       PHP_FALIAS(data_seek,mysqli_data_seek,NULL)
+       PHP_FALIAS(fetch_field,mysqli_fetch_field,NULL)
+       PHP_FALIAS(fetch_fields,mysqli_fetch_fields,NULL)
+       PHP_FALIAS(fetvh_field_direct,mysqli_fetch_field_direct,NULL)
+       PHP_FALIAS(fetch_lengths,mysqli_fetch_lengths,NULL)
+       PHP_FALIAS(fetch_array,mysqli_fetch_array,NULL)
+       PHP_FALIAS(fetch_assoc,mysqli_fetch_assoc,NULL) 
+       PHP_FALIAS(fetch_object,mysqli_fetch_object,NULL) 
+       PHP_FALIAS(fetch_row,mysqli_fetch_row,NULL)
+       PHP_FALIAS(field_count,mysqli_field_count,NULL)
+       PHP_FALIAS(field_seek,mysqli_field_seek,NULL)
+       PHP_FALIAS(field_tell,mysqli_field_tell,NULL)
+       PHP_FALIAS(free_result,mysqli_free_result,NULL)
+       PHP_FALIAS(num_fields,mysqli_num_fields,NULL)
+       PHP_FALIAS(num_rows,mysqli_num_rows,NULL)
+       {NULL, NULL, NULL}
+};
+/* }}} */
+
+/* {{{ mysqli_stmt_methods[]
+ *
+ * Every user visible function must have an entry in mysqli_stmt_functions[].
+ */
+function_entry mysqli_stmt_methods[] = {
+       PHP_FALIAS(bind_param,mysqli_bind_param,NULL)
+       PHP_FALIAS(bind_result,mysqli_bind_result,NULL)
+       PHP_FALIAS(execute,mysqli_execute,NULL)
+       PHP_FALIAS(fetch,mysqli_fetch,NULL)
+       PHP_FALIAS(param_count,mysqli_param_count,NULL)
+       PHP_FALIAS(send_long_data,mysqli_send_long_data,NULL)
+       PHP_FALIAS(stmt_close,mysqli_stmt_close,NULL)
+       PHP_FALIAS(stmt_errno,mysqli_stmt_errno,NULL)
+       PHP_FALIAS(stnt_error,mysqli_stmt_error,NULL)
+       {NULL, NULL, NULL}
+};
+/* }}} */
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * End:
+ * vim600: noet sw=4 ts=4 fdm=marker
+ * vim<600: noet sw=4 ts=4
+ */
diff --git a/ext/mysqli/mysqli_nonapi.c b/ext/mysqli/mysqli_nonapi.c
new file mode 100644 (file)
index 0000000..7c340a5
--- /dev/null
@@ -0,0 +1,141 @@
+/*
+  +----------------------------------------------------------------------+
+  | PHP Version 4                                                        |
+  +----------------------------------------------------------------------+
+  | Copyright (c) 1997-2002 The PHP Group                                |
+  +----------------------------------------------------------------------+
+  | This source file is subject to version 2.02 of the PHP license,      |
+  | that is bundled with this package in the file LICENSE, and is        |
+  | available at through the world-wide-web at                           |
+  | http://www.php.net/license/2_02.txt.                                 |
+  | If you did not receive a copy of the PHP license and are unable to   |
+  | obtain it through the world-wide-web, please send a note to          |
+  | license@php.net so we can mail you a copy immediately.               |
+  +----------------------------------------------------------------------+
+  | Author: Georg Richter <georg@php.net>                                |
+  +----------------------------------------------------------------------+
+
+  $Id$ 
+*/
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <signal.h>
+
+#include "php.h"
+#include "php_ini.h"
+#include "ext/standard/info.h"
+#include "php_mysqli.h"
+
+/* {{{ proto resource mysqli_connect([string hostname, [string username, [string passwd, [string dbname, [int port, [string socket]]]]])
+   open a connection to a mysql server */ 
+PHP_FUNCTION(mysqli_connect)
+{
+       MYSQL *mysql;
+       char *hostname = NULL, *username=NULL, *passwd=NULL, *dbname=NULL, *socket=NULL;
+       unsigned int hostname_len, username_len, passwd_len, dbname_len, socket_len;
+       unsigned int port=0;
+
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|ssssls", &hostname, &hostname_len, &username, &username_len, 
+               &passwd, &passwd_len, &dbname, &dbname_len, &port, &socket, &socket_len) == FAILURE) {
+               return;
+       }
+
+       /* TODO: safe mode handling */
+       if (PG(sql_safe_mode)){
+       } else {
+               if (!passwd) {
+                       passwd = MyG(default_pw);
+                       if (!username){
+                               username = MyG(default_user);
+                               if (!hostname) {
+                                       hostname = MyG(default_host);
+                               }
+                       }
+               }
+       }       
+       mysql = mysql_init(NULL);
+
+       if (mysql_real_connect(mysql,hostname,username,passwd,dbname,port,socket,0) == NULL) {
+               /* Save error messages */
+               MyG(error_no) = mysql_errno(mysql);
+               MyG(error_msg) = estrdup(mysql_error(mysql));
+               php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", mysql_error(mysql));
+               /* free mysql structure */
+               mysql_close(mysql);
+               RETURN_FALSE;
+       }
+
+       MYSQLI_RETURN_RESOURCE(mysql, mysqli_link_class_entry); 
+}
+/* }}} */
+
+/* {{{ proto array mysqli_fetch_array (resource result, [int resulttype])
+*/
+PHP_FUNCTION(mysqli_fetch_array) 
+{
+       php_mysqli_fetch_into_hash(INTERNAL_FUNCTION_PARAM_PASSTHRU, 0);
+}
+/* }}} */
+
+/* {{{ proto array mysqli_fetch_assoc (resource result)
+*/
+PHP_FUNCTION(mysqli_fetch_assoc) 
+{
+       php_mysqli_fetch_into_hash(INTERNAL_FUNCTION_PARAM_PASSTHRU, MYSQLI_ASSOC);
+}
+/* }}} */
+
+/* {{{ proto array mysqli_fetch_object (resource result)
+*/
+PHP_FUNCTION(mysqli_fetch_object) 
+{
+       php_mysqli_fetch_into_hash(INTERNAL_FUNCTION_PARAM_PASSTHRU, MYSQLI_ASSOC);
+       
+       if (Z_TYPE_P(return_value) == IS_ARRAY) {
+               object_and_properties_init(return_value, ZEND_STANDARD_CLASS_DEF_PTR, Z_ARRVAL_P(return_value));
+       }
+}
+/* }}} */
+
+/* {{{ proto resource mysqli_query(resource link, string query, [int resultmode])
+*/
+PHP_FUNCTION(mysqli_query) {
+       MYSQL   *mysql;
+       zval    *mysql_link;
+       MYSQL_RES *result;
+       char    *query = NULL;
+       unsigned int query_len;
+       unsigned int resultmode = 0;
+
+       if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os|l", &mysql_link, mysqli_link_class_entry, &query, &query_len, &resultmode) == FAILURE) {
+               return;
+       }
+       MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, &mysql_link, "mysqli_link"); 
+
+       if (mysql_real_query(mysql, query, query_len)) {
+               RETURN_FALSE;
+       }
+
+       if (!mysql_field_count(mysql)) {
+               RETURN_FALSE;
+       }
+
+       result = (resultmode == MYSQLI_USE_RESULT) ? mysql_use_result(mysql) : mysql_store_result(mysql);
+       if (!result) {
+               RETURN_FALSE;
+       }       
+       MYSQLI_RETURN_RESOURCE(result, mysqli_result_class_entry);
+}
+/* }}} */
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * End:
+ * vim600: noet sw=4 ts=4 fdm=marker
+ * vim<600: noet sw=4 ts=4
+ */
diff --git a/ext/mysqli/php_mysqli.h b/ext/mysqli/php_mysqli.h
new file mode 100644 (file)
index 0000000..545a4f5
--- /dev/null
@@ -0,0 +1,251 @@
+/*
+  +----------------------------------------------------------------------+
+  | PHP Version 4                                                        |
+  +----------------------------------------------------------------------+
+  | Copyright (c) 1997-2002 The PHP Group                                |
+  +----------------------------------------------------------------------+
+  | This source file is subject to version 2.02 of the PHP license,      |
+  | that is bundled with this package in the file LICENSE, and is        |
+  | available at through the world-wide-web at                           |
+  | http://www.php.net/license/2_02.txt.                                 |
+  | If you did not receive a copy of the PHP license and are unable to   |
+  | obtain it through the world-wide-web, please send a note to          |
+  | license@php.net so we can mail you a copy immediately.               |
+  +----------------------------------------------------------------------+
+  | Author: Georg Richter <georg@php.net>                                |
+  +----------------------------------------------------------------------+
+
+  $Id$ 
+*/
+
+#include <mysql.h>
+
+#ifndef PHP_MYSQLI_H
+#define PHP_MYSQLI_H
+
+typedef struct {
+       ulong           buflen;
+       char            *buffer;
+       ulong           type;
+} BIND_BUFFER;
+
+typedef struct {
+       MYSQL_STMT      *stmt;
+       unsigned int    var_cnt;
+       zval            **vars;
+       BIND_BUFFER     *bind;
+       char            *is_null;
+       char            type;
+} STMT;
+
+typedef struct _mysqli_object {
+       zend_object zo;
+       void *ptr;
+} mysqli_object; /* extends zend_object */
+
+#define phpext_mysqli_ptr &mysqli_module_entry
+
+#ifdef PHP_WIN32
+#define PHP_MYSQLI_API __declspec(dllexport)
+#else
+#define PHP_MYSQLI_API
+#endif
+
+#ifdef ZTS
+#include "TSRM.h"
+#endif
+
+#define PHP_MYSQLI_EXPORT(__type) PHP_MYSQLI_API __type
+
+extern zend_module_entry mysqli_module_entry;
+extern function_entry mysqli_functions[];
+extern function_entry mysqli_link_methods[];
+extern function_entry mysqli_stmt_methods[];
+extern function_entry mysqli_result_methods[];
+extern void php_mysqli_fetch_into_hash(INTERNAL_FUNCTION_PARAMETERS, int flag);
+extern void php_clear_stmt_bind(STMT *stmt);
+zend_class_entry *mysqli_link_class_entry;
+zend_class_entry *mysqli_stmt_class_entry;
+zend_class_entry *mysqli_result_class_entry;
+
+zend_class_entry _mysqli_link_class_entry;
+zend_class_entry _mysqli_stmt_class_entry;
+zend_class_entry _mysqli_result_class_entry;
+
+PHP_MYSQLI_EXPORT(zend_object_value) mysqli_objects_new(zend_class_entry * TSRMLS_DC);
+
+#define REGISTER_MYSQLI_CLASS_ENTRY(name, mysqli_entry, class_functions) { \
+       INIT_CLASS_ENTRY(_##mysqli_entry,name,class_functions); \
+       _##mysqli_entry.create_object = mysqli_objects_new; \
+       mysqli_entry = zend_register_internal_class(&_##mysqli_entry TSRMLS_CC); \
+} \
+
+#define MYSQLI_REGISTER_RESOURCE_EX(__ptr, __zval, __ce)  \
+       ((mysqli_object *) zend_object_store_get_object(__zval TSRMLS_CC))->ptr = __ptr;
+
+#define MYSQLI_RETURN_RESOURCE(__ptr, __ce) \
+       Z_TYPE_P(return_value) = IS_OBJECT; \
+       (return_value)->value.obj = mysqli_objects_new(__ce TSRMLS_CC); \
+       MYSQLI_REGISTER_RESOURCE_EX(__ptr, return_value, __ce)
+
+#define MYSQLI_REGISTER_RESOURCE(__ptr, __ce) \
+{\
+       zval *object = getThis();\
+       if (!object) {\
+               object = return_value;\
+               Z_TYPE_P(object) = IS_OBJECT;\
+               (object)->value.obj = mysqli_objects_new(__ce TSRMLS_CC);\
+       }\
+       MYSQLI_REGISTER_RESOURCE_EX(__ptr, object, __ce)\
+}
+
+#define MYSQLI_FETCH_RESOURCE(__ptr, __type, __id, __name) \
+{ \
+       mysqli_object *intern = (mysqli_object *)zend_object_store_get_object(*(__id) TSRMLS_CC);\
+       if (!((__ptr) != (__type)intern->ptr)) {\
+               php_error(E_WARNING, "Couldn' fetch %s", intern->zo.ce->name);\
+               RETURN_NULL();\
+       }\
+       __ptr = (__type)intern->ptr; \
+}
+
+#define MYSQLI_CLEAR_RESOURCE(__id) \
+{ \
+       mysqli_object *intern = (mysqli_object *)zend_object_store_get_object(*(__id) TSRMLS_CC);\
+       intern->ptr = NULL; \
+}
+
+#define MYSQLI_STORE_RESULT    0
+#define MYSQLI_USE_RESULT      1
+
+/* for mysqli_fetch_assoc */
+#define MYSQLI_ASSOC           1
+#define MYSQLI_NUM             2
+#define MYSQLI_BOTH            3
+
+/* for mysqli_bind_param */
+#define MYSQLI_BIND_INT                1
+#define MYSQLI_BIND_DOUBLE     2
+#define MYSQLI_BIND_STRING     3
+#define MYSQLI_BIND_SEND_DATA  4
+
+/* fetch types */
+#define FETCH_SIMPLE           0
+#define FETCH_RESULT           1
+
+PHP_MYSQLI_API void mysqli_register_link(zval *return_value, void *link TSRMLS_DC);
+PHP_MYSQLI_API void mysqli_register_stmt(zval *return_value, void *stmt TSRMLS_DC);
+PHP_MYSQLI_API void mysqli_register_result(zval *return_value, void *result TSRMLS_DC);
+
+PHP_MINIT_FUNCTION(mysqli);
+PHP_MSHUTDOWN_FUNCTION(mysqli);
+PHP_RINIT_FUNCTION(mysqli);
+PHP_RSHUTDOWN_FUNCTION(mysqli);
+PHP_MINFO_FUNCTION(mysqli);
+
+PHP_FUNCTION(mysqli_affected_rows);
+PHP_FUNCTION(mysqli_autocommit);
+PHP_FUNCTION(mysqli_bind_param);
+PHP_FUNCTION(mysqli_bind_result);
+PHP_FUNCTION(mysqli_change_user);
+PHP_FUNCTION(mysqli_character_set_name);
+PHP_FUNCTION(mysqli_close);
+PHP_FUNCTION(mysqli_commit);
+PHP_FUNCTION(mysqli_connect);
+PHP_FUNCTION(mysqli_data_seek);
+PHP_FUNCTION(mysqli_debug);
+PHP_FUNCTION(mysqli_disable_reads_from_master);
+PHP_FUNCTION(mysqli_disable_rpl_parse);
+PHP_FUNCTION(mysqli_dump_debug_info);
+PHP_FUNCTION(mysqli_enable_reads_from_master);
+PHP_FUNCTION(mysqli_enable_rpl_parse);
+PHP_FUNCTION(mysqli_errno);
+PHP_FUNCTION(mysqli_error);
+PHP_FUNCTION(mysqli_execute);
+PHP_FUNCTION(mysqli_fetch);
+PHP_FUNCTION(mysqli_fetch_array);
+PHP_FUNCTION(mysqli_fetch_assoc);
+PHP_FUNCTION(mysqli_fetch_object);
+PHP_FUNCTION(mysqli_fetch_field);
+PHP_FUNCTION(mysqli_fetch_fields);
+PHP_FUNCTION(mysqli_fetch_field_direct);
+PHP_FUNCTION(mysqli_fetch_lengths);
+PHP_FUNCTION(mysqli_fetch_row);
+PHP_FUNCTION(mysqli_field_count);
+PHP_FUNCTION(mysqli_field_seek);
+PHP_FUNCTION(mysqli_field_tell);
+PHP_FUNCTION(mysqli_free_result);
+PHP_FUNCTION(mysqli_get_client_info);
+PHP_FUNCTION(mysqli_get_host_info);
+PHP_FUNCTION(mysqli_get_proto_info);
+PHP_FUNCTION(mysqli_get_server_info);
+PHP_FUNCTION(mysqli_info);
+PHP_FUNCTION(mysqli_insert_id);
+PHP_FUNCTION(mysqli_init);
+PHP_FUNCTION(mysqli_kill);
+PHP_FUNCTION(mysqli_master_query);
+PHP_FUNCTION(mysqli_num_fields);
+PHP_FUNCTION(mysqli_num_rows);
+PHP_FUNCTION(mysqli_num_warnings);
+PHP_FUNCTION(mysqli_options);
+PHP_FUNCTION(mysqli_param_count);
+PHP_FUNCTION(mysqli_ping);
+PHP_FUNCTION(mysqli_prepare);
+PHP_FUNCTION(mysqli_query);
+PHP_FUNCTION(mysqli_prepare_result);
+PHP_FUNCTION(mysqli_read_query_result);
+PHP_FUNCTION(mysqli_real_connect);
+PHP_FUNCTION(mysqli_real_query);
+PHP_FUNCTION(mysqli_real_escape_string);
+PHP_FUNCTION(mysqli_reload);
+PHP_FUNCTION(mysqli_rollback);
+PHP_FUNCTION(mysqli_row_seek);
+PHP_FUNCTION(mysqli_rpl_parse_enabled);
+PHP_FUNCTION(mysqli_rpl_probe);
+PHP_FUNCTION(mysqli_rpl_query_type);
+PHP_FUNCTION(mysqli_select_db);
+PHP_FUNCTION(mysqli_send_long_data);
+PHP_FUNCTION(mysqli_send_query);
+PHP_FUNCTION(mysqli_slave_query);
+PHP_FUNCTION(mysqli_ssl_set);
+PHP_FUNCTION(mysqli_stat);
+PHP_FUNCTION(mysqli_stmt_close);
+PHP_FUNCTION(mysqli_stmt_errno);
+PHP_FUNCTION(mysqli_stmt_error);
+PHP_FUNCTION(mysqli_store_result);
+PHP_FUNCTION(mysqli_thread_id);
+PHP_FUNCTION(mysqli_thread_safe);
+PHP_FUNCTION(mysqli_use_result);
+PHP_FUNCTION(mysqli_warning_count);
+
+ZEND_BEGIN_MODULE_GLOBALS(mysqli)
+       long default_link;
+       long num_links;
+       long max_links;
+       unsigned int default_port;
+       char *default_host;
+       char *default_user;
+       char *default_pw;
+       char *default_socket;
+       long error_no;
+       char *error_msg;
+ZEND_END_MODULE_GLOBALS(mysqli)
+
+#ifdef ZTS
+#define MyG(v) TSRMG(mysqli_globals_id, zend_mysqli_globals *, v)
+#else
+#define MyG(v) (mysqli_globals.v)
+#endif
+
+ZEND_EXTERN_MODULE_GLOBALS(mysqli);
+
+#endif /* PHP_MYSQLI.H */
+
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * indent-tabs-mode: t
+ * End:
+ */