ZEND_GET_MODULE(dba)
#endif
-typedef struct dba_handler {
- char *name; /* handler name */
- int flags; /* whether and how dba does locking and other flags*/
- int (*open)(dba_info *, char **error TSRMLS_DC);
- void (*close)(dba_info * TSRMLS_DC);
- char* (*fetch)(dba_info *, char *, int, int, int * TSRMLS_DC);
- int (*update)(dba_info *, char *, int, char *, int, int TSRMLS_DC);
- int (*exists)(dba_info *, char *, int TSRMLS_DC);
- int (*delete)(dba_info *, char *, int TSRMLS_DC);
- char* (*firstkey)(dba_info *, int * TSRMLS_DC);
- char* (*nextkey)(dba_info *, int * TSRMLS_DC);
- int (*optimize)(dba_info * TSRMLS_DC);
- int (*sync)(dba_info * TSRMLS_DC);
-} dba_handler;
-
/* {{{ macromania */
#define DBA_ID_PARS \
{\
#alias, flags, dba_open_##name, dba_close_##name, dba_fetch_##name, dba_update_##name, \
dba_exists_##name, dba_delete_##name, dba_firstkey_##name, dba_nextkey_##name, \
- dba_optimize_##name, dba_sync_##name \
+ dba_optimize_##name, dba_sync_##name, dba_info_##name \
},
#define DBA_HND(name, flags) DBA_NAMED_HND(name, name, flags)
#if DBA_FLATFILE
DBA_HND(flatfile, DBA_STREAM_OPEN|DBA_LOCK_ALL) /* No lock in lib */
#endif
- { NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }
+ { NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }
};
#if DBA_FLATFILE
}
/* }}} */
-/* {{{ proto array dba_handlers()
+/* {{{ proto array dba_handlers([bool full_info])
List configured databases */
PHP_FUNCTION(dba_handlers)
{
dba_handler *hptr;
+ zend_bool full_info = 0;
- if (ZEND_NUM_ARGS()!=0) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|b", &full_info) == FAILURE) {
ZEND_WRONG_PARAM_COUNT();
RETURN_FALSE;
}
RETURN_FALSE;
}
for(hptr = handler; hptr->name; hptr++) {
- add_next_index_string(return_value, hptr->name, 1);
+ if (full_info) {
+ add_assoc_string(return_value, hptr->name, hptr->info(hptr, NULL TSRMLS_CC), 0);
+ } else {
+ add_next_index_string(return_value, hptr->name, 1);
+ }
}
}
/* }}} */
extern zend_module_entry dba_module_entry;
#define dba_module_ptr &dba_module_entry
+typedef struct dba_handler {
+ char *name; /* handler name */
+ int flags; /* whether and how dba does locking and other flags*/
+ int (*open)(dba_info *, char **error TSRMLS_DC);
+ void (*close)(dba_info * TSRMLS_DC);
+ char* (*fetch)(dba_info *, char *, int, int, int * TSRMLS_DC);
+ int (*update)(dba_info *, char *, int, char *, int, int TSRMLS_DC);
+ int (*exists)(dba_info *, char *, int TSRMLS_DC);
+ int (*delete)(dba_info *, char *, int TSRMLS_DC);
+ char* (*firstkey)(dba_info *, int * TSRMLS_DC);
+ char* (*nextkey)(dba_info *, int * TSRMLS_DC);
+ int (*optimize)(dba_info * TSRMLS_DC);
+ int (*sync)(dba_info * TSRMLS_DC);
+ char* (*info)(struct dba_handler *hnd, dba_info * TSRMLS_DC);
+ /* dba_info==NULL: Handler info, dba_info!=NULL: Database info */
+} dba_handler;
+
/* common prototypes which must be supplied by modules */
#define DBA_OPEN_FUNC(x) \
int dba_optimize_##x(dba_info *info TSRMLS_DC)
#define DBA_SYNC_FUNC(x) \
int dba_sync_##x(dba_info *info TSRMLS_DC)
+#define DBA_INFO_FUNC(x) \
+ char *dba_info_##x(dba_handler *hnd, dba_info *info TSRMLS_DC)
#define DBA_FUNCS(x) \
DBA_OPEN_FUNC(x); \
DBA_FIRSTKEY_FUNC(x); \
DBA_NEXTKEY_FUNC(x); \
DBA_OPTIMIZE_FUNC(x); \
- DBA_SYNC_FUNC(x)
+ DBA_SYNC_FUNC(x); \
+ DBA_INFO_FUNC(x)
#define VALLEN(p) Z_STRVAL_PP(p), Z_STRLEN_PP(p)