@@ -95,38 +95,41 @@ static zend_string* php_dba_make_key(const HashTable *key)
9595 zval * group , * name ;
9696 zend_string * group_str , * name_str ;
9797 HashPosition pos ;
98+ int i = 0 ;
9899
99100 if (zend_hash_num_elements (key ) != 2 ) {
100101 zend_argument_error (NULL , 1 , "must have exactly two elements: \"key\" and \"name\"" );
101102 return NULL ;
102103 }
103104
104- // TODO: Use ZEND_HASH_FOREACH_VAL() API?
105- zend_hash_internal_pointer_reset_ex (key , & pos );
106- group = zend_hash_get_current_data_ex (key , & pos );
107- group_str = zval_try_get_string (group );
108- if (!group_str ) {
109- return NULL ;
110- }
105+ ZEND_HASH_FOREACH_VAL (key , group ) {
106+ zend_string * tmp = zval_try_get_string (group );
107+ if (!tmp ) {
108+ if (group_str ) zend_string_release (group_str );
109+ return NULL ;
110+ }
111111
112- zend_hash_move_forward_ex (key , & pos );
113- name = zend_hash_get_current_data_ex (key , & pos );
114- name_str = zval_try_get_string (name );
115- if (!name_str ) {
116- zend_string_release_ex (group_str , false);
117- return NULL ;
118- }
112+ if (i == 0 ) {
113+ group_str = tmp ;
114+ } else {
115+ name_str = tmp ;
116+ }
119117
120- // TODO: Check ZSTR_LEN(name) != 0
121- if (ZSTR_LEN (group_str ) == 0 ) {
122- zend_string_release_ex (group_str , false);
123- return name_str ;
124- }
118+ i ++ ;
119+ } ZEND_HASH_FOREACH_END ();
120+
121+ if (ZSTR_LEN (group_str ) == 0 ) {
122+ zend_string_release (group_str );
123+ return name_str ;
124+ }
125+
126+ zend_string * key_str = zend_strpprintf (0 , "[%s]%s" ,
127+ ZSTR_VAL (group_str ), ZSTR_VAL (name_str ));
128+
129+ zend_string_release (group_str );
130+ zend_string_release (name_str );
125131
126- zend_string * key_str = zend_strpprintf (0 , "[%s]%s" , ZSTR_VAL (group_str ), ZSTR_VAL (name_str ));
127- zend_string_release_ex (group_str , false);
128- zend_string_release_ex (name_str , false);
129- return key_str ;
132+ return key_str ;
130133}
131134/* }}} */
132135
0 commit comments