From: Marcus Boerger Date: Sat, 19 Feb 2005 23:48:30 +0000 (+0000) Subject: - Add fetch mode PDO_FETCH_UNIQUE X-Git-Tag: RELEASE_0_3~329 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=b788dc9d2a22760967a0727139873eaf4253e81a;p=php - Add fetch mode PDO_FETCH_UNIQUE --- diff --git a/ext/pdo/pdo.c b/ext/pdo/pdo.c index f010a54fe5..0788ff2c6f 100755 --- a/ext/pdo/pdo.c +++ b/ext/pdo/pdo.c @@ -238,6 +238,7 @@ PHP_MINIT_FUNCTION(pdo) REGISTER_LONG_CONSTANT("PDO_FETCH_CLASS",(long)PDO_FETCH_CLASS, CONST_CS|CONST_PERSISTENT); REGISTER_LONG_CONSTANT("PDO_FETCH_INTO", (long)PDO_FETCH_INTO, CONST_CS|CONST_PERSISTENT); REGISTER_LONG_CONSTANT("PDO_FETCH_GROUP",(long)PDO_FETCH_GROUP, CONST_CS|CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("PDO_FETCH_UNIQUE",(long)PDO_FETCH_UNIQUE, CONST_CS|CONST_PERSISTENT); REGISTER_LONG_CONSTANT("PDO_ATTR_AUTOCOMMIT", (long)PDO_ATTR_AUTOCOMMIT, CONST_CS|CONST_PERSISTENT); REGISTER_LONG_CONSTANT("PDO_ATTR_PREFETCH", (long)PDO_ATTR_PREFETCH, CONST_CS|CONST_PERSISTENT); diff --git a/ext/pdo/pdo_stmt.c b/ext/pdo/pdo_stmt.c index e109eeafab..3edec0cd3e 100755 --- a/ext/pdo/pdo_stmt.c +++ b/ext/pdo/pdo_stmt.c @@ -529,6 +529,7 @@ static int do_fetch_common(pdo_stmt_t *stmt, enum pdo_fetch_orientation ori, static int do_fetch(pdo_stmt_t *stmt, int do_bind, zval *return_value, enum pdo_fetch_type how, enum pdo_fetch_orientation ori, long offset, zval *return_all TSRMLS_DC) { + int flags = how & PDO_FETCH_FLAGS; zend_class_entry * ce; how = how & ~PDO_FETCH_FLAGS; @@ -648,15 +649,19 @@ static int do_fetch(pdo_stmt_t *stmt, int do_bind, zval *return_value, INIT_PZVAL(&val); fetch_value(stmt, &val, 0 TSRMLS_CC); convert_to_string(&val); - if (zend_symtable_find(Z_ARRVAL_P(return_all), Z_STRVAL(val), Z_STRLEN(val)+1, (void**)&pgrp) == FAILURE) { - MAKE_STD_ZVAL(grp); - array_init(grp); - add_assoc_zval(return_all, Z_STRVAL(val), grp); + if ((flags & PDO_FETCH_UNIQUE) == PDO_FETCH_UNIQUE) { + add_assoc_zval(return_all, Z_STRVAL(val), return_value); } else { - grp = *pgrp; + if (zend_symtable_find(Z_ARRVAL_P(return_all), Z_STRVAL(val), Z_STRLEN(val)+1, (void**)&pgrp) == FAILURE) { + MAKE_STD_ZVAL(grp); + array_init(grp); + add_assoc_zval(return_all, Z_STRVAL(val), grp); + } else { + grp = *pgrp; + } + add_next_index_zval(grp, return_value); } zval_dtor(&val); - add_next_index_zval(grp, return_value); i = 1; } else { i = 0; diff --git a/ext/pdo/php_pdo_driver.h b/ext/pdo/php_pdo_driver.h index 02d30fdaef..eaf1f742c4 100755 --- a/ext/pdo/php_pdo_driver.h +++ b/ext/pdo/php_pdo_driver.h @@ -83,6 +83,7 @@ enum pdo_fetch_type { #define PDO_FETCH_FLAGS 0xFFFF0000 /* fetchAll() modes or'd to PDO_FETCH_XYZ */ #define PDO_FETCH_GROUP 0x00010000 /* fetch into groups */ +#define PDO_FETCH_UNIQUE 0x00030000 /* fetch into groups assuming first col is unique */ /* fetch orientation for scrollable cursors */ enum pdo_fetch_orientation {