Skip to content

Commit d737741

Browse files
committed
allow keys as array(group, name) for handler inifile
1 parent ce04e8a commit d737741

File tree

1 file changed

+99
-17
lines changed

1 file changed

+99
-17
lines changed

ext/dba/dba.c

Lines changed: 99 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -103,19 +103,60 @@ ZEND_GET_MODULE(dba)
103103
/* these are used to get the standard arguments */
104104

105105
#define DBA_GET1 \
106-
if(ac != 1 || zend_get_parameters_ex(ac, &id) != SUCCESS) { \
106+
if(ac != 1 || zend_get_parameters_ex(ac, &id) != SUCCESS) { \
107107
WRONG_PARAM_COUNT; \
108108
}
109109

110+
/* {{{ php_dba_myke_key */
111+
static size_t php_dba_make_key(zval **key, char **key_str, char **key_free TSRMLS_DC)
112+
{
113+
if (Z_TYPE_PP(key) == IS_ARRAY) {
114+
zval **group, **name;
115+
HashPosition pos;
116+
size_t len;
117+
118+
if (zend_hash_num_elements(Z_ARRVAL_PP(key)) != 2) {
119+
php_error_docref(NULL TSRMLS_CC, E_ERROR, "Key does not have exactly two elements: (key, name)");
120+
return -1;
121+
}
122+
zend_hash_internal_pointer_reset_ex(Z_ARRVAL_PP(key), &pos);
123+
zend_hash_get_current_data_ex(Z_ARRVAL_PP(key), (void **) &group, &pos);
124+
zend_hash_move_forward_ex(Z_ARRVAL_PP(key), &pos);
125+
zend_hash_get_current_data_ex(Z_ARRVAL_PP(key), (void **) &name, &pos);
126+
convert_to_string_ex(group);
127+
convert_to_string_ex(name);
128+
if (Z_STRLEN_PP(group) == 0) {
129+
*key_str = Z_STRVAL_PP(name);
130+
*key_free = NULL;
131+
return Z_STRLEN_PP(name);
132+
}
133+
len = spprintf(key_str, 0, "[%s]%s", Z_STRVAL_PP(group), Z_STRVAL_PP(name));
134+
*key_free = *key_str;
135+
return len;
136+
} else {
137+
convert_to_string_ex(key);
138+
*key_str = Z_STRVAL_PP(key);
139+
*key_free = NULL;
140+
return Z_STRLEN_PP(key);
141+
}
142+
}
143+
/* }}} */
144+
110145
#define DBA_GET2 \
111146
zval **key; \
147+
char *key_str, *key_free; \
148+
size_t key_len; \
112149
if(ac != 2 || zend_get_parameters_ex(ac, &key, &id) != SUCCESS) { \
113150
WRONG_PARAM_COUNT; \
114151
} \
115-
convert_to_string_ex(key)
152+
if ((key_len = php_dba_make_key(key, &key_str, &key_free TSRMLS_CC) < 0)) {\
153+
RETURN_FALSE; \
154+
}
116155

117156
#define DBA_GET2_3 \
118157
zval **key; \
158+
char *key_str, *key_free; \
159+
size_t key_len; \
119160
zval **tmp; \
120161
int skip = 0; \
121162
switch(ac) { \
@@ -134,15 +175,32 @@ ZEND_GET_MODULE(dba)
134175
default: \
135176
WRONG_PARAM_COUNT; \
136177
} \
137-
convert_to_string_ex(key)
178+
if ((key_len = php_dba_make_key(key, &key_str, &key_free TSRMLS_CC) < 0)) {\
179+
RETURN_FALSE; \
180+
}
181+
182+
#define DBA_GET3 \
183+
zval **key, **val; \
184+
char *key_str, *key_free; \
185+
size_t key_len; \
186+
if(ac != 3 || zend_get_parameters_ex(ac, &key, &val, &id) != SUCCESS) { \
187+
WRONG_PARAM_COUNT; \
188+
} \
189+
convert_to_string_ex(val); \
190+
if ((key_len = php_dba_make_key(key, &key_str, &key_free TSRMLS_CC) < 0)) {\
191+
RETURN_FALSE; \
192+
}
138193

139194
#define DBA_ID_GET \
140195
ZEND_FETCH_RESOURCE2(info, dba_info *, id, -1, "DBA identifier", le_db, le_pdb);
141196

142197
#define DBA_ID_GET1 DBA_ID_PARS; DBA_GET1; DBA_ID_GET
143198
#define DBA_ID_GET2 DBA_ID_PARS; DBA_GET2; DBA_ID_GET
144199
#define DBA_ID_GET2_3 DBA_ID_PARS; DBA_GET2_3; DBA_ID_GET
200+
#define DBA_ID_GET3 DBA_ID_PARS; DBA_GET3; DBA_ID_GET
145201

202+
#define DBA_ID_DONE \
203+
if (key_free) efree(key_free)
146204
/* a DBA handler must have specific routines */
147205

148206
#define DBA_NAMED_HND(alias, name, flags) \
@@ -233,6 +291,25 @@ ZEND_DECLARE_MODULE_GLOBALS(dba)
233291

234292
static int le_db;
235293
static int le_pdb;
294+
295+
/* {{{ dba_fetch_resource
296+
PHPAPI void dba_fetch_resource(dba_info **pinfo, zval **id TSRMLS_DC)
297+
{
298+
dba_info *info;
299+
DBA_ID_FETCH
300+
*pinfo = info;
301+
}
302+
*/
303+
/* }}} */
304+
305+
/* {{{ dba_get_handler
306+
PHPAPI dba_handler *dba_get_handler(const char* handler_name)
307+
{
308+
dba_handler *hptr;
309+
for (hptr = handler; hptr->name && strcasecmp(hptr->name, handler_name); hptr++);
310+
return hptr;
311+
}
312+
*/
236313
/* }}} */
237314

238315
/* {{{ dba_close
@@ -350,33 +427,30 @@ PHP_MINFO_FUNCTION(dba)
350427
*/
351428
static void php_dba_update(INTERNAL_FUNCTION_PARAMETERS, int mode)
352429
{
353-
DBA_ID_PARS;
354-
zval **val, **key;
355430
char *v;
356431
int len;
357-
358-
if(ac != 3 || zend_get_parameters_ex(ac, &key, &val, &id) != SUCCESS) {
359-
WRONG_PARAM_COUNT;
360-
}
361-
convert_to_string_ex(key);
362-
convert_to_string_ex(val);
363-
DBA_ID_GET;
432+
DBA_ID_GET3;
364433

365434
DBA_WRITE_CHECK;
366435

367436
if (PG(magic_quotes_runtime)) {
368437
len = Z_STRLEN_PP(val);
369438
v = estrndup(Z_STRVAL_PP(val), len);
370439
php_stripslashes(v, &len TSRMLS_CC);
371-
if(info->hnd->update(info, VALLEN(key), v, len, mode TSRMLS_CC) == SUCCESS) {
440+
if(info->hnd->update(info, key_str, key_len, v, len, mode TSRMLS_CC) == SUCCESS) {
372441
efree(v);
442+
DBA_ID_DONE;
373443
RETURN_TRUE;
374444
}
375445
efree(v);
376446
} else {
377-
if(info->hnd->update(info, VALLEN(key), VALLEN(val), mode TSRMLS_CC) == SUCCESS)
447+
if(info->hnd->update(info, key_str, key_len, VALLEN(val), mode TSRMLS_CC) == SUCCESS)
448+
{
449+
DBA_ID_DONE;
378450
RETURN_TRUE;
451+
}
379452
}
453+
DBA_ID_DONE;
380454
RETURN_FALSE;
381455
}
382456
/* }}} */
@@ -719,9 +793,11 @@ PHP_FUNCTION(dba_exists)
719793
{
720794
DBA_ID_GET2;
721795

722-
if(info->hnd->exists(info, VALLEN(key) TSRMLS_CC) == SUCCESS) {
796+
if(info->hnd->exists(info, key_str, key_len TSRMLS_CC) == SUCCESS) {
797+
DBA_ID_DONE;
723798
RETURN_TRUE;
724799
}
800+
DBA_ID_DONE;
725801
RETURN_FALSE;
726802
}
727803
/* }}} */
@@ -758,12 +834,14 @@ PHP_FUNCTION(dba_fetch)
758834
} else {
759835
skip = 0;
760836
}
761-
if((val = info->hnd->fetch(info, VALLEN(key), skip, &len TSRMLS_CC)) != NULL) {
837+
if((val = info->hnd->fetch(info, key_str, key_len, skip, &len TSRMLS_CC)) != NULL) {
762838
if (val && PG(magic_quotes_runtime)) {
763839
val = php_addslashes(val, len, &len, 1 TSRMLS_CC);
764840
}
841+
DBA_ID_DONE;
765842
RETURN_STRINGL(val, len, 0);
766843
}
844+
DBA_ID_DONE;
767845
RETURN_FALSE;
768846
}
769847
/* }}} */
@@ -807,8 +885,12 @@ PHP_FUNCTION(dba_delete)
807885

808886
DBA_WRITE_CHECK;
809887

810-
if(info->hnd->delete(info, VALLEN(key) TSRMLS_CC) == SUCCESS)
888+
if(info->hnd->delete(info, key_str, key_len TSRMLS_CC) == SUCCESS)
889+
{
890+
DBA_ID_DONE;
811891
RETURN_TRUE;
892+
}
893+
DBA_ID_DONE;
812894
RETURN_FALSE;
813895
}
814896
/* }}} */

0 commit comments

Comments
 (0)