Skip to content

Commit deb420e

Browse files
committed
new parameter-parsing API
1 parent 2b0df36 commit deb420e

File tree

1 file changed

+104
-66
lines changed

1 file changed

+104
-66
lines changed

ext/dba/dba.c

+104-66
Original file line numberDiff line numberDiff line change
@@ -207,33 +207,28 @@ ZEND_GET_MODULE(dba)
207207
/* {{{ macromania */
208208

209209
#define DBA_ID_PARS \
210-
zval **id; \
210+
zval *id; \
211211
dba_info *info = NULL; \
212212
int ac = ZEND_NUM_ARGS()
213213

214214
/* these are used to get the standard arguments */
215215

216-
#define DBA_GET1 \
217-
if(ac != 1 || zend_get_parameters_ex(ac, &id) != SUCCESS) { \
218-
WRONG_PARAM_COUNT; \
219-
}
220-
221216
/* {{{ php_dba_myke_key */
222-
static size_t php_dba_make_key(zval **key, char **key_str, char **key_free TSRMLS_DC)
217+
static size_t php_dba_make_key(zval *key, char **key_str, char **key_free TSRMLS_DC)
223218
{
224-
if (Z_TYPE_PP(key) == IS_ARRAY) {
219+
if (Z_TYPE_P(key) == IS_ARRAY) {
225220
zval **group, **name;
226221
HashPosition pos;
227222
size_t len;
228223

229-
if (zend_hash_num_elements(Z_ARRVAL_PP(key)) != 2) {
224+
if (zend_hash_num_elements(Z_ARRVAL_P(key)) != 2) {
230225
php_error_docref(NULL TSRMLS_CC, E_RECOVERABLE_ERROR, "Key does not have exactly two elements: (key, name)");
231226
return -1;
232227
}
233-
zend_hash_internal_pointer_reset_ex(Z_ARRVAL_PP(key), &pos);
234-
zend_hash_get_current_data_ex(Z_ARRVAL_PP(key), (void **) &group, &pos);
235-
zend_hash_move_forward_ex(Z_ARRVAL_PP(key), &pos);
236-
zend_hash_get_current_data_ex(Z_ARRVAL_PP(key), (void **) &name, &pos);
228+
zend_hash_internal_pointer_reset_ex(Z_ARRVAL_P(key), &pos);
229+
zend_hash_get_current_data_ex(Z_ARRVAL_P(key), (void **) &group, &pos);
230+
zend_hash_move_forward_ex(Z_ARRVAL_P(key), &pos);
231+
zend_hash_get_current_data_ex(Z_ARRVAL_P(key), (void **) &name, &pos);
237232
convert_to_string_ex(group);
238233
convert_to_string_ex(name);
239234
if (Z_STRLEN_PP(group) == 0) {
@@ -245,43 +240,42 @@ static size_t php_dba_make_key(zval **key, char **key_str, char **key_free TSRML
245240
*key_free = *key_str;
246241
return len;
247242
} else {
248-
convert_to_string_ex(key);
249-
*key_str = Z_STRVAL_PP(key);
250243
*key_free = NULL;
251-
return Z_STRLEN_PP(key);
244+
245+
convert_to_string(key);
246+
*key_str = Z_STRVAL_P(key);
247+
248+
return Z_STRLEN_P(key);
252249
}
253250
}
254251
/* }}} */
255252

256253
#define DBA_GET2 \
257-
zval **key; \
254+
zval *key; \
258255
char *key_str, *key_free; \
259256
size_t key_len; \
260-
if(ac != 2 || zend_get_parameters_ex(ac, &key, &id) != SUCCESS) { \
261-
WRONG_PARAM_COUNT; \
257+
if (zend_parse_parameters(ac TSRMLS_CC, "zr", &key, &id) == FAILURE) { \
258+
return; \
262259
} \
263260
if ((key_len = php_dba_make_key(key, &key_str, &key_free TSRMLS_CC)) == 0) {\
264261
RETURN_FALSE; \
265262
}
266263

267264
#define DBA_GET2_3 \
268-
zval **key; \
265+
zval *key; \
269266
char *key_str, *key_free; \
270267
size_t key_len; \
271-
zval **tmp; \
272268
int skip = 0; \
273269
switch(ac) { \
274270
case 2: \
275-
if (zend_get_parameters_ex(ac, &key, &id) != SUCCESS) { \
276-
WRONG_PARAM_COUNT; \
271+
if (zend_parse_parameters(ac TSRMLS_CC, "zr", &key, &id) == FAILURE) { \
272+
return; \
277273
} \
278274
break; \
279275
case 3: \
280-
if (zend_get_parameters_ex(ac, &key, &tmp, &id) != SUCCESS) { \
281-
WRONG_PARAM_COUNT; \
276+
if (zend_parse_parameters(ac TSRMLS_CC, "zlr", &key, &skip, &id) == FAILURE) { \
277+
return; \
282278
} \
283-
convert_to_long_ex(tmp); \
284-
skip = Z_LVAL_PP(tmp); \
285279
break; \
286280
default: \
287281
WRONG_PARAM_COUNT; \
@@ -290,25 +284,12 @@ static size_t php_dba_make_key(zval **key, char **key_str, char **key_free TSRML
290284
RETURN_FALSE; \
291285
}
292286

293-
#define DBA_GET3 \
294-
zval **key, **val; \
295-
char *key_str, *key_free; \
296-
size_t key_len; \
297-
if(ac != 3 || zend_get_parameters_ex(ac, &key, &val, &id) != SUCCESS) { \
298-
WRONG_PARAM_COUNT; \
299-
} \
300-
convert_to_string_ex(val); \
301-
if ((key_len = php_dba_make_key(key, &key_str, &key_free TSRMLS_CC)) == 0) {\
302-
RETURN_FALSE; \
303-
}
304287

305-
#define DBA_ID_GET \
288+
#define DBA_FETCH_RESOURCE(info, id) \
306289
ZEND_FETCH_RESOURCE2(info, dba_info *, id, -1, "DBA identifier", le_db, le_pdb);
307-
308-
#define DBA_ID_GET1 DBA_ID_PARS; DBA_GET1; DBA_ID_GET
309-
#define DBA_ID_GET2 DBA_ID_PARS; DBA_GET2; DBA_ID_GET
310-
#define DBA_ID_GET2_3 DBA_ID_PARS; DBA_GET2_3; DBA_ID_GET
311-
#define DBA_ID_GET3 DBA_ID_PARS; DBA_GET3; DBA_ID_GET
290+
291+
#define DBA_ID_GET2 DBA_ID_PARS; DBA_GET2; DBA_FETCH_RESOURCE(info, &id)
292+
#define DBA_ID_GET2_3 DBA_ID_PARS; DBA_GET2_3; DBA_FETCH_RESOURCE(info, &id)
312293

313294
#define DBA_ID_DONE \
314295
if (key_free) efree(key_free)
@@ -566,28 +547,43 @@ PHP_MINFO_FUNCTION(dba)
566547
static void php_dba_update(INTERNAL_FUNCTION_PARAMETERS, int mode)
567548
{
568549
char *v;
569-
int len;
570-
DBA_ID_GET3;
550+
int val_len;
551+
zval *id;
552+
dba_info *info = NULL;
553+
int ac = ZEND_NUM_ARGS();
554+
zval *key;
555+
char *val;
556+
char *key_str, *key_free;
557+
size_t key_len;
558+
559+
if (zend_parse_parameters(ac TSRMLS_CC, "zsr", &key, &val, &val_len, &id) == FAILURE) {
560+
return;
561+
}
562+
563+
if ((key_len = php_dba_make_key(key, &key_str, &key_free TSRMLS_CC)) == 0) {
564+
RETURN_FALSE;
565+
}
566+
567+
DBA_FETCH_RESOURCE(info, &id);
571568

572569
DBA_WRITE_CHECK;
573-
570+
574571
if (PG(magic_quotes_runtime)) {
575-
len = Z_STRLEN_PP(val);
576-
v = estrndup(Z_STRVAL_PP(val), len);
577-
php_stripslashes(v, &len TSRMLS_CC);
578-
if(info->hnd->update(info, key_str, key_len, v, len, mode TSRMLS_CC) == SUCCESS) {
572+
v = estrndup(val, val_len);
573+
php_stripslashes(v, &val_len TSRMLS_CC);
574+
if (info->hnd->update(info, key_str, key_len, v, val_len, mode TSRMLS_CC) == SUCCESS) {
579575
efree(v);
580576
DBA_ID_DONE;
581577
RETURN_TRUE;
582578
}
583579
efree(v);
584580
} else {
585-
if(info->hnd->update(info, key_str, key_len, VALLEN(val), mode TSRMLS_CC) == SUCCESS)
586-
{
581+
if (info->hnd->update(info, key_str, key_len, val, val_len, mode TSRMLS_CC) == SUCCESS) {
587582
DBA_ID_DONE;
588583
RETURN_TRUE;
589584
}
590585
}
586+
591587
DBA_ID_DONE;
592588
RETURN_FALSE;
593589
}
@@ -980,9 +976,16 @@ PHP_FUNCTION(dba_open)
980976
Closes database */
981977
PHP_FUNCTION(dba_close)
982978
{
983-
DBA_ID_GET1;
984-
985-
zend_list_delete(Z_RESVAL_PP(id));
979+
zval *id;
980+
dba_info *info = NULL;
981+
982+
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &id) == FAILURE) {
983+
return;
984+
}
985+
986+
DBA_FETCH_RESOURCE(info, &id);
987+
988+
zend_list_delete(Z_RESVAL_P(id));
986989
}
987990
/* }}} */
988991

@@ -1081,11 +1084,20 @@ PHP_FUNCTION(dba_firstkey)
10811084
{
10821085
char *fkey;
10831086
int len;
1084-
DBA_ID_GET1;
1087+
zval *id;
1088+
dba_info *info = NULL;
1089+
1090+
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &id) == FAILURE) {
1091+
return;
1092+
}
1093+
1094+
DBA_FETCH_RESOURCE(info, &id);
10851095

10861096
fkey = info->hnd->firstkey(info, &len TSRMLS_CC);
1087-
if(fkey)
1097+
1098+
if (fkey)
10881099
RETURN_STRINGL(fkey, len, 0);
1100+
10891101
RETURN_FALSE;
10901102
}
10911103
/* }}} */
@@ -1096,11 +1108,20 @@ PHP_FUNCTION(dba_nextkey)
10961108
{
10971109
char *nkey;
10981110
int len;
1099-
DBA_ID_GET1;
1111+
zval *id;
1112+
dba_info *info = NULL;
1113+
1114+
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &id) == FAILURE) {
1115+
return;
1116+
}
1117+
1118+
DBA_FETCH_RESOURCE(info, &id);
11001119

11011120
nkey = info->hnd->nextkey(info, &len TSRMLS_CC);
1102-
if(nkey)
1121+
1122+
if (nkey)
11031123
RETURN_STRINGL(nkey, len, 0);
1124+
11041125
RETURN_FALSE;
11051126
}
11061127
/* }}} */
@@ -1146,12 +1167,21 @@ PHP_FUNCTION(dba_replace)
11461167
Optimizes (e.g. clean up, vacuum) database */
11471168
PHP_FUNCTION(dba_optimize)
11481169
{
1149-
DBA_ID_GET1;
1150-
1170+
zval *id;
1171+
dba_info *info = NULL;
1172+
1173+
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &id) == FAILURE) {
1174+
return;
1175+
}
1176+
1177+
DBA_FETCH_RESOURCE(info, &id);
1178+
11511179
DBA_WRITE_CHECK;
1152-
if(info->hnd->optimize(info TSRMLS_CC) == SUCCESS) {
1180+
1181+
if (info->hnd->optimize(info TSRMLS_CC) == SUCCESS) {
11531182
RETURN_TRUE;
11541183
}
1184+
11551185
RETURN_FALSE;
11561186
}
11571187
/* }}} */
@@ -1160,11 +1190,19 @@ PHP_FUNCTION(dba_optimize)
11601190
Synchronizes database */
11611191
PHP_FUNCTION(dba_sync)
11621192
{
1163-
DBA_ID_GET1;
1164-
1165-
if(info->hnd->sync(info TSRMLS_CC) == SUCCESS) {
1193+
zval *id;
1194+
dba_info *info = NULL;
1195+
1196+
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &id) == FAILURE) {
1197+
return;
1198+
}
1199+
1200+
DBA_FETCH_RESOURCE(info, &id);
1201+
1202+
if (info->hnd->sync(info TSRMLS_CC) == SUCCESS) {
11661203
RETURN_TRUE;
11671204
}
1205+
11681206
RETURN_FALSE;
11691207
}
11701208
/* }}} */

0 commit comments

Comments
 (0)