Annotation of embedaddon/php/ext/mysqli/mysqli_warning.c, revision 1.1
1.1 ! misho 1: /*
! 2: +----------------------------------------------------------------------+
! 3: | PHP Version 5 |
! 4: +----------------------------------------------------------------------+
! 5: | Copyright (c) 1997-2012 The PHP Group |
! 6: +----------------------------------------------------------------------+
! 7: | This source file is subject to version 3.01 of the PHP license, |
! 8: | that is bundled with this package in the file LICENSE, and is |
! 9: | available through the world-wide-web at the following url: |
! 10: | http://www.php.net/license/3_01.txt |
! 11: | If you did not receive a copy of the PHP license and are unable to |
! 12: | obtain it through the world-wide-web, please send a note to |
! 13: | license@php.net so we can mail you a copy immediately. |
! 14: +----------------------------------------------------------------------+
! 15: | Author: Georg Richter <georg@php.net> |
! 16: +----------------------------------------------------------------------+
! 17:
! 18: */
! 19: #ifdef HAVE_CONFIG_H
! 20: #include "config.h"
! 21: #endif
! 22:
! 23: #include <signal.h>
! 24:
! 25: #include "php.h"
! 26: #include "php_ini.h"
! 27: #include "ext/standard/info.h"
! 28: #include "php_mysqli_structs.h"
! 29: #include "mysqli_priv.h"
! 30:
! 31: /* Define these in the PHP5 tree to make merging easy process */
! 32: #define ZSTR_DUPLICATE (1<<0)
! 33: #define ZSTR_AUTOFREE (1<<1)
! 34:
! 35: #define ZVAL_UTF8_STRING(z, s, flags) ZVAL_STRING((z), (char*)(s), ((flags) & ZSTR_DUPLICATE))
! 36: #define ZVAL_UTF8_STRINGL(z, s, l, flags) ZVAL_STRINGL((z), (char*)(s), (l), ((flags) & ZSTR_DUPLICATE))
! 37:
! 38:
! 39: /* {{{ void php_clear_warnings() */
! 40: void php_clear_warnings(MYSQLI_WARNING *w)
! 41: {
! 42: MYSQLI_WARNING *n;
! 43:
! 44: while (w) {
! 45: n = w;
! 46: zval_dtor(&(w->reason));
! 47: zval_dtor(&(w->sqlstate));
! 48: w = w->next;
! 49: efree(n);
! 50: }
! 51: }
! 52: /* }}} */
! 53:
! 54:
! 55: #ifndef MYSQLI_USE_MYSQLND
! 56: /* {{{ MYSQLI_WARNING *php_new_warning */
! 57: static
! 58: MYSQLI_WARNING *php_new_warning(const char *reason, int errorno TSRMLS_DC)
! 59: {
! 60: MYSQLI_WARNING *w;
! 61:
! 62: w = (MYSQLI_WARNING *)ecalloc(1, sizeof(MYSQLI_WARNING));
! 63:
! 64: ZVAL_UTF8_STRING(&(w->reason), reason, ZSTR_DUPLICATE);
! 65:
! 66: ZVAL_UTF8_STRINGL(&(w->sqlstate), "HY000", sizeof("HY000") - 1, ZSTR_DUPLICATE);
! 67:
! 68: w->errorno = errorno;
! 69:
! 70: return w;
! 71: }
! 72: /* }}} */
! 73:
! 74:
! 75: /* {{{ MYSQLI_WARNING *php_get_warnings(MYSQL *mysql TSRMLS_DC) */
! 76: MYSQLI_WARNING *php_get_warnings(MYSQL *mysql TSRMLS_DC)
! 77: {
! 78: MYSQLI_WARNING *w, *first = NULL, *prev = NULL;
! 79: MYSQL_RES *result;
! 80: MYSQL_ROW row;
! 81:
! 82: if (mysql_real_query(mysql, "SHOW WARNINGS", 13)) {
! 83: return NULL;
! 84: }
! 85:
! 86: result = mysql_store_result(mysql);
! 87:
! 88: while ((row = mysql_fetch_row(result))) {
! 89: w = php_new_warning(row[2], atoi(row[1]) TSRMLS_CC);
! 90: if (!first) {
! 91: first = w;
! 92: }
! 93: if (prev) {
! 94: prev->next = w;
! 95: }
! 96: prev = w;
! 97: }
! 98: mysql_free_result(result);
! 99: return first;
! 100: }
! 101: /* }}} */
! 102: #else
! 103: /* {{{ MYSQLI_WARNING *php_new_warning */
! 104: static
! 105: MYSQLI_WARNING *php_new_warning(const zval *reason, int errorno TSRMLS_DC)
! 106: {
! 107: MYSQLI_WARNING *w;
! 108:
! 109: w = (MYSQLI_WARNING *)ecalloc(1, sizeof(MYSQLI_WARNING));
! 110:
! 111: w->reason = *reason;
! 112: zval_copy_ctor(&(w->reason));
! 113:
! 114: ZVAL_UTF8_STRINGL(&(w->reason), Z_STRVAL(w->reason), Z_STRLEN(w->reason), ZSTR_AUTOFREE);
! 115:
! 116: ZVAL_UTF8_STRINGL(&(w->sqlstate), "HY000", sizeof("HY000") - 1, ZSTR_DUPLICATE);
! 117:
! 118: w->errorno = errorno;
! 119:
! 120: return w;
! 121: }
! 122: /* }}} */
! 123:
! 124:
! 125: /* {{{ MYSQLI_WARNING *php_get_warnings(MYSQL *mysql TSRMLS_DC) */
! 126: MYSQLI_WARNING *php_get_warnings(MYSQL *mysql TSRMLS_DC)
! 127: {
! 128: MYSQLI_WARNING *w, *first = NULL, *prev = NULL;
! 129: MYSQL_RES *result;
! 130: zval *row;
! 131:
! 132: if (mysql_real_query(mysql, "SHOW WARNINGS", 13)) {
! 133: return NULL;
! 134: }
! 135:
! 136: result = mysql_use_result(mysql);
! 137:
! 138: for (;;) {
! 139: zval **entry;
! 140: int errno;
! 141:
! 142: MAKE_STD_ZVAL(row);
! 143: mysqlnd_fetch_into(result, MYSQLND_FETCH_NUM, row, MYSQLND_MYSQLI);
! 144: if (Z_TYPE_P(row) != IS_ARRAY) {
! 145: zval_ptr_dtor(&row);
! 146: break;
! 147: }
! 148: zend_hash_internal_pointer_reset(Z_ARRVAL_P(row));
! 149: /* 0. we don't care about the first */
! 150: zend_hash_move_forward(Z_ARRVAL_P(row));
! 151:
! 152: /* 1. Here comes the error no */
! 153: zend_hash_get_current_data(Z_ARRVAL_P(row), (void **)&entry);
! 154: convert_to_long_ex(entry);
! 155: errno = Z_LVAL_PP(entry);
! 156: zend_hash_move_forward(Z_ARRVAL_P(row));
! 157:
! 158: /* 2. Here comes the reason */
! 159: zend_hash_get_current_data(Z_ARRVAL_P(row), (void **)&entry);
! 160:
! 161: w = php_new_warning(*entry, errno TSRMLS_CC);
! 162: /*
! 163: Don't destroy entry, because the row destroy will decrease
! 164: the refcounter. Decreased twice then mysqlnd_free_result()
! 165: will crash, because it will try to access already freed memory.
! 166: */
! 167: if (!first) {
! 168: first = w;
! 169: }
! 170: if (prev) {
! 171: prev->next = (void *)w;
! 172: }
! 173: prev = w;
! 174:
! 175: zval_ptr_dtor(&row);
! 176: }
! 177:
! 178: mysql_free_result(result);
! 179: return first;
! 180: }
! 181: /* }}} */
! 182: #endif
! 183:
! 184:
! 185: /* {{{ bool mysqli_warning::next() */
! 186: PHP_METHOD(mysqli_warning, next)
! 187: {
! 188: MYSQLI_WARNING *w;
! 189: zval *mysqli_warning;
! 190: mysqli_object *obj = (mysqli_object *)zend_objects_get_address(getThis() TSRMLS_CC);
! 191:
! 192: if (obj->ptr) {
! 193: if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O",
! 194: &mysqli_warning, mysqli_warning_class_entry) == FAILURE) {
! 195: return;
! 196: }
! 197:
! 198: MYSQLI_FETCH_RESOURCE(w, MYSQLI_WARNING *, &mysqli_warning, "mysqli_warning", MYSQLI_STATUS_VALID);
! 199:
! 200: if (w && w->next) {
! 201: w = w->next;
! 202: ((MYSQLI_RESOURCE *)(obj->ptr))->ptr = w;
! 203: RETURN_TRUE;
! 204: }
! 205: }
! 206: RETURN_FALSE;
! 207: }
! 208: /* }}} */
! 209:
! 210:
! 211: /* {{{ property mysqli_warning_message */
! 212: static
! 213: int mysqli_warning_message(mysqli_object *obj, zval **retval TSRMLS_DC)
! 214: {
! 215: MYSQLI_WARNING *w;
! 216:
! 217: if (!obj->ptr || !((MYSQLI_RESOURCE *)(obj->ptr))->ptr) {
! 218: return FAILURE;
! 219: }
! 220:
! 221: w = (MYSQLI_WARNING *)((MYSQLI_RESOURCE *)(obj->ptr))->ptr;
! 222: MAKE_STD_ZVAL(*retval);
! 223: **retval = w->reason;
! 224: zval_copy_ctor(*retval);
! 225: return SUCCESS;
! 226: }
! 227: /* }}} */
! 228:
! 229:
! 230: /* {{{ property mysqli_warning_sqlstate */
! 231: static
! 232: int mysqli_warning_sqlstate(mysqli_object *obj, zval **retval TSRMLS_DC)
! 233: {
! 234: MYSQLI_WARNING *w;
! 235:
! 236: if (!obj->ptr || !((MYSQLI_RESOURCE *)(obj->ptr))->ptr) {
! 237: return FAILURE;
! 238: }
! 239:
! 240: w = (MYSQLI_WARNING *)((MYSQLI_RESOURCE *)(obj->ptr))->ptr;
! 241: MAKE_STD_ZVAL(*retval);
! 242: **retval = w->sqlstate;
! 243: zval_copy_ctor(*retval);
! 244: return SUCCESS;
! 245: }
! 246: /* }}} */
! 247:
! 248:
! 249: /* {{{ property mysqli_warning_error */
! 250: static
! 251: int mysqli_warning_errno(mysqli_object *obj, zval **retval TSRMLS_DC)
! 252: {
! 253: MYSQLI_WARNING *w;
! 254:
! 255: if (!obj->ptr || !((MYSQLI_RESOURCE *)(obj->ptr))->ptr) {
! 256: return FAILURE;
! 257: }
! 258: w = (MYSQLI_WARNING *)((MYSQLI_RESOURCE *)(obj->ptr))->ptr;
! 259: MAKE_STD_ZVAL(*retval);
! 260: ZVAL_LONG(*retval, w->errorno);
! 261: return SUCCESS;
! 262: }
! 263: /* }}} */
! 264:
! 265: /* {{{ mysqli_warning_construct(object obj) */
! 266: PHP_METHOD(mysqli_warning, __construct)
! 267: {
! 268: zval *z;
! 269: mysqli_object *obj;
! 270: MYSQL *hdl;
! 271: MYSQLI_WARNING *w;
! 272: MYSQLI_RESOURCE *mysqli_resource;
! 273:
! 274: if (ZEND_NUM_ARGS() != 1) {
! 275: WRONG_PARAM_COUNT;
! 276: }
! 277: if (zend_parse_parameters(1 TSRMLS_CC, "o", &z)==FAILURE) {
! 278: return;
! 279: }
! 280: obj = (mysqli_object *)zend_object_store_get_object(z TSRMLS_CC);\
! 281:
! 282: if (obj->zo.ce == mysqli_link_class_entry) {
! 283: MY_MYSQL *mysql;
! 284: MYSQLI_FETCH_RESOURCE_CONN(mysql, &z, MYSQLI_STATUS_VALID);
! 285: hdl = mysql->mysql;
! 286: } else if (obj->zo.ce == mysqli_stmt_class_entry) {
! 287: MY_STMT *stmt;
! 288: MYSQLI_FETCH_RESOURCE_STMT(stmt, &z, MYSQLI_STATUS_VALID);
! 289: hdl = mysqli_stmt_get_connection(stmt->stmt);
! 290: } else {
! 291: php_error_docref(NULL TSRMLS_CC, E_WARNING, "invalid class argument");
! 292: RETURN_FALSE;
! 293: }
! 294:
! 295: if (mysql_warning_count(hdl)) {
! 296: w = php_get_warnings(hdl TSRMLS_CC);
! 297: } else {
! 298: php_error_docref(NULL TSRMLS_CC, E_WARNING, "No warnings found");
! 299: RETURN_FALSE;
! 300: }
! 301:
! 302: mysqli_resource = (MYSQLI_RESOURCE *)ecalloc (1, sizeof(MYSQLI_RESOURCE));
! 303: mysqli_resource->ptr = mysqli_resource->info = (void *)w;
! 304: mysqli_resource->status = MYSQLI_STATUS_VALID;
! 305:
! 306: if (!getThis() || !instanceof_function(Z_OBJCE_P(getThis()), mysqli_warning_class_entry TSRMLS_CC)) {
! 307: MYSQLI_RETURN_RESOURCE(mysqli_resource, mysqli_warning_class_entry);
! 308: } else {
! 309: ((mysqli_object *) zend_object_store_get_object(getThis() TSRMLS_CC))->ptr = mysqli_resource;
! 310: }
! 311:
! 312: }
! 313: /* }}} */
! 314:
! 315: /* {{{ mysqli_warning_methods */
! 316: const zend_function_entry mysqli_warning_methods[] = {
! 317: PHP_ME(mysqli_warning, __construct, NULL, ZEND_ACC_PROTECTED)
! 318: PHP_ME(mysqli_warning, next, NULL, ZEND_ACC_PUBLIC)
! 319: {NULL, NULL, NULL}
! 320: };
! 321: /* }}} */
! 322:
! 323: /* {{{ mysqli_warning_property_entries */
! 324: const mysqli_property_entry mysqli_warning_property_entries[] = {
! 325: {"message", sizeof("message") - 1, mysqli_warning_message, NULL},
! 326: {"sqlstate", sizeof("sqlstate") - 1, mysqli_warning_sqlstate, NULL},
! 327: {"errno", sizeof("errno") - 1, mysqli_warning_errno, NULL},
! 328: {NULL, 0, NULL, NULL}
! 329: };
! 330: /* }}} */
! 331:
! 332: /* {{{ mysqli_warning_property_info_entries */
! 333: zend_property_info mysqli_warning_property_info_entries[] = {
! 334: {ZEND_ACC_PUBLIC, "message", sizeof("message") - 1, 0, NULL, 0, NULL},
! 335: {ZEND_ACC_PUBLIC, "sqlstate", sizeof("sqlstate") - 1, 0, NULL, 0, NULL},
! 336: {ZEND_ACC_PUBLIC, "errno", sizeof("errno") - 1, 0, NULL, 0, NULL},
! 337: {0, NULL, 0, 0, NULL, 0, NULL}
! 338: };
! 339: /* }}} */
! 340:
! 341:
! 342: /*
! 343: * Local variables:
! 344: * tab-width: 4
! 345: * c-basic-offset: 4
! 346: * indent-tabs-mode: t
! 347: * End:
! 348: * vim600: noet sw=4 ts=4 fdm=marker
! 349: * vim<600: noet sw=4 ts=4
! 350: */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>