summaryrefslogtreecommitdiff
path: root/ext/dba/dba.c
diff options
context:
space:
mode:
Diffstat (limited to 'ext/dba/dba.c')
-rw-r--r--ext/dba/dba.c185
1 files changed, 81 insertions, 104 deletions
diff --git a/ext/dba/dba.c b/ext/dba/dba.c
index 4811a45ef5..22ea355939 100644
--- a/ext/dba/dba.c
+++ b/ext/dba/dba.c
@@ -52,6 +52,7 @@
#include "php_qdbm.h"
/* {{{ arginfo */
+static
ZEND_BEGIN_ARG_INFO_EX(arginfo_dba_popen, 0, 0, 2)
ZEND_ARG_INFO(0, path)
ZEND_ARG_INFO(0, mode)
@@ -59,6 +60,7 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_dba_popen, 0, 0, 2)
ZEND_ARG_INFO(0, ...)
ZEND_END_ARG_INFO()
+static
ZEND_BEGIN_ARG_INFO_EX(arginfo_dba_open, 0, 0, 2)
ZEND_ARG_INFO(0, path)
ZEND_ARG_INFO(0, mode)
@@ -66,62 +68,75 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_dba_open, 0, 0, 2)
ZEND_ARG_INFO(0, ...)
ZEND_END_ARG_INFO()
+static
ZEND_BEGIN_ARG_INFO(arginfo_dba_close, 0)
ZEND_ARG_INFO(0, handle)
ZEND_END_ARG_INFO()
+static
ZEND_BEGIN_ARG_INFO(arginfo_dba_exists, 0)
ZEND_ARG_INFO(0, key)
ZEND_ARG_INFO(0, handle)
ZEND_END_ARG_INFO()
+static
ZEND_BEGIN_ARG_INFO_EX(arginfo_dba_fetch, 0, 0, 2)
ZEND_ARG_INFO(0, key)
ZEND_ARG_INFO(0, skip)
ZEND_ARG_INFO(0, handle)
ZEND_END_ARG_INFO()
+static
ZEND_BEGIN_ARG_INFO(arginfo_dba_key_split, 0)
ZEND_ARG_INFO(0, key)
ZEND_END_ARG_INFO()
+static
ZEND_BEGIN_ARG_INFO(arginfo_dba_firstkey, 0)
ZEND_ARG_INFO(0, handle)
ZEND_END_ARG_INFO()
+static
ZEND_BEGIN_ARG_INFO(arginfo_dba_nextkey, 0)
ZEND_ARG_INFO(0, handle)
ZEND_END_ARG_INFO()
+static
ZEND_BEGIN_ARG_INFO(arginfo_dba_delete, 0)
ZEND_ARG_INFO(0, key)
ZEND_ARG_INFO(0, handle)
ZEND_END_ARG_INFO()
+static
ZEND_BEGIN_ARG_INFO(arginfo_dba_insert, 0)
ZEND_ARG_INFO(0, key)
ZEND_ARG_INFO(0, value)
ZEND_ARG_INFO(0, handle)
ZEND_END_ARG_INFO()
+static
ZEND_BEGIN_ARG_INFO(arginfo_dba_replace, 0)
ZEND_ARG_INFO(0, key)
ZEND_ARG_INFO(0, value)
ZEND_ARG_INFO(0, handle)
ZEND_END_ARG_INFO()
+static
ZEND_BEGIN_ARG_INFO(arginfo_dba_optimize, 0)
ZEND_ARG_INFO(0, handle)
ZEND_END_ARG_INFO()
+static
ZEND_BEGIN_ARG_INFO(arginfo_dba_sync, 0)
ZEND_ARG_INFO(0, handle)
ZEND_END_ARG_INFO()
+static
ZEND_BEGIN_ARG_INFO_EX(arginfo_dba_handlers, 0, 0, 0)
ZEND_ARG_INFO(0, full_info)
ZEND_END_ARG_INFO()
+static
ZEND_BEGIN_ARG_INFO(arginfo_dba_list, 0)
ZEND_END_ARG_INFO()
@@ -192,28 +207,33 @@ ZEND_GET_MODULE(dba)
/* {{{ macromania */
#define DBA_ID_PARS \
- zval *id; \
+ zval **id; \
dba_info *info = NULL; \
int ac = ZEND_NUM_ARGS()
/* these are used to get the standard arguments */
+#define DBA_GET1 \
+ if(ac != 1 || zend_get_parameters_ex(ac, &id) != SUCCESS) { \
+ WRONG_PARAM_COUNT; \
+ }
+
/* {{{ php_dba_myke_key */
-static size_t php_dba_make_key(zval *key, char **key_str, char **key_free TSRMLS_DC)
+static size_t php_dba_make_key(zval **key, char **key_str, char **key_free TSRMLS_DC)
{
- if (Z_TYPE_P(key) == IS_ARRAY) {
+ if (Z_TYPE_PP(key) == IS_ARRAY) {
zval **group, **name;
HashPosition pos;
size_t len;
- if (zend_hash_num_elements(Z_ARRVAL_P(key)) != 2) {
+ if (zend_hash_num_elements(Z_ARRVAL_PP(key)) != 2) {
php_error_docref(NULL TSRMLS_CC, E_RECOVERABLE_ERROR, "Key does not have exactly two elements: (key, name)");
return -1;
}
- zend_hash_internal_pointer_reset_ex(Z_ARRVAL_P(key), &pos);
- zend_hash_get_current_data_ex(Z_ARRVAL_P(key), (void **) &group, &pos);
- zend_hash_move_forward_ex(Z_ARRVAL_P(key), &pos);
- zend_hash_get_current_data_ex(Z_ARRVAL_P(key), (void **) &name, &pos);
+ zend_hash_internal_pointer_reset_ex(Z_ARRVAL_PP(key), &pos);
+ zend_hash_get_current_data_ex(Z_ARRVAL_PP(key), (void **) &group, &pos);
+ zend_hash_move_forward_ex(Z_ARRVAL_PP(key), &pos);
+ zend_hash_get_current_data_ex(Z_ARRVAL_PP(key), (void **) &name, &pos);
convert_to_string_ex(group);
convert_to_string_ex(name);
if (Z_STRLEN_PP(group) == 0) {
@@ -225,42 +245,43 @@ static size_t php_dba_make_key(zval *key, char **key_str, char **key_free TSRMLS
*key_free = *key_str;
return len;
} else {
+ convert_to_string_ex(key);
+ *key_str = Z_STRVAL_PP(key);
*key_free = NULL;
-
- convert_to_string(key);
- *key_str = Z_STRVAL_P(key);
-
- return Z_STRLEN_P(key);
+ return Z_STRLEN_PP(key);
}
}
/* }}} */
#define DBA_GET2 \
- zval *key; \
+ zval **key; \
char *key_str, *key_free; \
size_t key_len; \
- if (zend_parse_parameters(ac TSRMLS_CC, "zr", &key, &id) == FAILURE) { \
- return; \
+ if(ac != 2 || zend_get_parameters_ex(ac, &key, &id) != SUCCESS) { \
+ WRONG_PARAM_COUNT; \
} \
if ((key_len = php_dba_make_key(key, &key_str, &key_free TSRMLS_CC)) == 0) {\
RETURN_FALSE; \
}
#define DBA_GET2_3 \
- zval *key; \
+ zval **key; \
char *key_str, *key_free; \
size_t key_len; \
+ zval **tmp; \
int skip = 0; \
switch(ac) { \
case 2: \
- if (zend_parse_parameters(ac TSRMLS_CC, "zr", &key, &id) == FAILURE) { \
- return; \
+ if (zend_get_parameters_ex(ac, &key, &id) != SUCCESS) { \
+ WRONG_PARAM_COUNT; \
} \
break; \
case 3: \
- if (zend_parse_parameters(ac TSRMLS_CC, "zlr", &key, &skip, &id) == FAILURE) { \
- return; \
+ if (zend_get_parameters_ex(ac, &key, &tmp, &id) != SUCCESS) { \
+ WRONG_PARAM_COUNT; \
} \
+ convert_to_long_ex(tmp); \
+ skip = Z_LVAL_PP(tmp); \
break; \
default: \
WRONG_PARAM_COUNT; \
@@ -269,12 +290,25 @@ static size_t php_dba_make_key(zval *key, char **key_str, char **key_free TSRMLS
RETURN_FALSE; \
}
+#define DBA_GET3 \
+ zval **key, **val; \
+ char *key_str, *key_free; \
+ size_t key_len; \
+ if(ac != 3 || zend_get_parameters_ex(ac, &key, &val, &id) != SUCCESS) { \
+ WRONG_PARAM_COUNT; \
+ } \
+ convert_to_string_ex(val); \
+ if ((key_len = php_dba_make_key(key, &key_str, &key_free TSRMLS_CC)) == 0) {\
+ RETURN_FALSE; \
+ }
-#define DBA_FETCH_RESOURCE(info, id) \
+#define DBA_ID_GET \
ZEND_FETCH_RESOURCE2(info, dba_info *, id, -1, "DBA identifier", le_db, le_pdb);
-
-#define DBA_ID_GET2 DBA_ID_PARS; DBA_GET2; DBA_FETCH_RESOURCE(info, &id)
-#define DBA_ID_GET2_3 DBA_ID_PARS; DBA_GET2_3; DBA_FETCH_RESOURCE(info, &id)
+
+#define DBA_ID_GET1 DBA_ID_PARS; DBA_GET1; DBA_ID_GET
+#define DBA_ID_GET2 DBA_ID_PARS; DBA_GET2; DBA_ID_GET
+#define DBA_ID_GET2_3 DBA_ID_PARS; DBA_GET2_3; DBA_ID_GET
+#define DBA_ID_GET3 DBA_ID_PARS; DBA_GET3; DBA_ID_GET
#define DBA_ID_DONE \
if (key_free) efree(key_free)
@@ -532,43 +566,28 @@ PHP_MINFO_FUNCTION(dba)
static void php_dba_update(INTERNAL_FUNCTION_PARAMETERS, int mode)
{
char *v;
- int val_len;
- zval *id;
- dba_info *info = NULL;
- int ac = ZEND_NUM_ARGS();
- zval *key;
- char *val;
- char *key_str, *key_free;
- size_t key_len;
-
- if (zend_parse_parameters(ac TSRMLS_CC, "zsr", &key, &val, &val_len, &id) == FAILURE) {
- return;
- }
-
- if ((key_len = php_dba_make_key(key, &key_str, &key_free TSRMLS_CC)) == 0) {
- RETURN_FALSE;
- }
-
- DBA_FETCH_RESOURCE(info, &id);
+ int len;
+ DBA_ID_GET3;
DBA_WRITE_CHECK;
-
+
if (PG(magic_quotes_runtime)) {
- v = estrndup(val, val_len);
- php_stripslashes(v, &val_len TSRMLS_CC);
- if (info->hnd->update(info, key_str, key_len, v, val_len, mode TSRMLS_CC) == SUCCESS) {
+ len = Z_STRLEN_PP(val);
+ v = estrndup(Z_STRVAL_PP(val), len);
+ php_stripslashes(v, &len TSRMLS_CC);
+ if(info->hnd->update(info, key_str, key_len, v, len, mode TSRMLS_CC) == SUCCESS) {
efree(v);
DBA_ID_DONE;
RETURN_TRUE;
}
efree(v);
} else {
- if (info->hnd->update(info, key_str, key_len, val, val_len, mode TSRMLS_CC) == SUCCESS) {
+ if(info->hnd->update(info, key_str, key_len, VALLEN(val), mode TSRMLS_CC) == SUCCESS)
+ {
DBA_ID_DONE;
RETURN_TRUE;
}
}
-
DBA_ID_DONE;
RETURN_FALSE;
}
@@ -961,16 +980,9 @@ PHP_FUNCTION(dba_open)
Closes database */
PHP_FUNCTION(dba_close)
{
- zval *id;
- dba_info *info = NULL;
-
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &id) == FAILURE) {
- return;
- }
-
- DBA_FETCH_RESOURCE(info, &id);
-
- zend_list_delete(Z_RESVAL_P(id));
+ DBA_ID_GET1;
+
+ zend_list_delete(Z_RESVAL_PP(id));
}
/* }}} */
@@ -1069,20 +1081,11 @@ PHP_FUNCTION(dba_firstkey)
{
char *fkey;
int len;
- zval *id;
- dba_info *info = NULL;
-
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &id) == FAILURE) {
- return;
- }
-
- DBA_FETCH_RESOURCE(info, &id);
+ DBA_ID_GET1;
fkey = info->hnd->firstkey(info, &len TSRMLS_CC);
-
- if (fkey)
+ if(fkey)
RETURN_STRINGL(fkey, len, 0);
-
RETURN_FALSE;
}
/* }}} */
@@ -1093,20 +1096,11 @@ PHP_FUNCTION(dba_nextkey)
{
char *nkey;
int len;
- zval *id;
- dba_info *info = NULL;
-
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &id) == FAILURE) {
- return;
- }
-
- DBA_FETCH_RESOURCE(info, &id);
+ DBA_ID_GET1;
nkey = info->hnd->nextkey(info, &len TSRMLS_CC);
-
- if (nkey)
+ if(nkey)
RETURN_STRINGL(nkey, len, 0);
-
RETURN_FALSE;
}
/* }}} */
@@ -1152,21 +1146,12 @@ PHP_FUNCTION(dba_replace)
Optimizes (e.g. clean up, vacuum) database */
PHP_FUNCTION(dba_optimize)
{
- zval *id;
- dba_info *info = NULL;
-
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &id) == FAILURE) {
- return;
- }
-
- DBA_FETCH_RESOURCE(info, &id);
-
+ DBA_ID_GET1;
+
DBA_WRITE_CHECK;
-
- if (info->hnd->optimize(info TSRMLS_CC) == SUCCESS) {
+ if(info->hnd->optimize(info TSRMLS_CC) == SUCCESS) {
RETURN_TRUE;
}
-
RETURN_FALSE;
}
/* }}} */
@@ -1175,19 +1160,11 @@ PHP_FUNCTION(dba_optimize)
Synchronizes database */
PHP_FUNCTION(dba_sync)
{
- zval *id;
- dba_info *info = NULL;
-
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &id) == FAILURE) {
- return;
- }
-
- DBA_FETCH_RESOURCE(info, &id);
-
- if (info->hnd->sync(info TSRMLS_CC) == SUCCESS) {
+ DBA_ID_GET1;
+
+ if(info->hnd->sync(info TSRMLS_CC) == SUCCESS) {
RETURN_TRUE;
}
-
RETURN_FALSE;
}
/* }}} */