X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=ext%2FNDBM_File%2FNDBM_File.xs;h=53403a54d645f780b8731854fa5d2617e7e7680e;hb=58a9407439d0a351f8fbc4e66b3f56e5d81df3c0;hp=d129a9c490539bdba7b6353cd6b9c8252e2aa187;hpb=748a93069b3d16374a9859d1456065dd3ae11394;p=p5sagit%2Fp5-mst-13.2.git diff --git a/ext/NDBM_File/NDBM_File.xs b/ext/NDBM_File/NDBM_File.xs index d129a9c..53403a5 100644 --- a/ext/NDBM_File/NDBM_File.xs +++ b/ext/NDBM_File/NDBM_File.xs @@ -3,39 +3,75 @@ #include "XSUB.h" #include -typedef DBM* NDBM_File; -#define dbm_TIEHASH(dbtype,filename,flags,mode) dbm_open(filename,flags,mode) -#define dbm_FETCH(db,key) dbm_fetch(db,key) -#define dbm_STORE(db,key,value,flags) dbm_store(db,key,value,flags) -#define dbm_DELETE(db,key) dbm_delete(db,key) -#define dbm_FIRSTKEY(db) dbm_firstkey(db) -#define dbm_NEXTKEY(db,key) dbm_nextkey(db) +typedef struct { + DBM * dbp ; + SV * filter_fetch_key ; + SV * filter_store_key ; + SV * filter_fetch_value ; + SV * filter_store_value ; + int filtering ; + } NDBM_File_type; -MODULE = NDBM_File PACKAGE = NDBM_File PREFIX = dbm_ +typedef NDBM_File_type * NDBM_File ; +typedef datum datum_key ; +typedef datum datum_value ; + + +#if defined(__cplusplus) && defined(HAS_GDBM) +/* gdbm's header file used for compatibility with gdbm */ +/* isn't compatible to C++ syntax, so we need these */ +/* declarations to make everyone happy. */ +EXTERN_C DBM *dbm_open(const char *, int, mode_t); +EXTERN_C void dbm_close(DBM *); +EXTERN_C datum dbm_fetch(DBM *, datum); +EXTERN_C int dbm_store(DBM *, datum, datum, int); +EXTERN_C int dbm_delete(DBM *, datum); +EXTERN_C datum dbm_firstkey(DBM *); +EXTERN_C datum dbm_nextkey(DBM *); +#endif + +MODULE = NDBM_File PACKAGE = NDBM_File PREFIX = ndbm_ NDBM_File -dbm_TIEHASH(dbtype, filename, flags, mode) +ndbm_TIEHASH(dbtype, filename, flags, mode) char * dbtype char * filename int flags int mode + CODE: + { + DBM * dbp ; + + RETVAL = NULL ; + if ((dbp = dbm_open(filename, flags, mode))) { + RETVAL = (NDBM_File)safemalloc(sizeof(NDBM_File_type)) ; + Zero(RETVAL, 1, NDBM_File_type) ; + RETVAL->dbp = dbp ; + } + + } + OUTPUT: + RETVAL void -dbm_DESTROY(db) +ndbm_DESTROY(db) NDBM_File db CODE: - dbm_close(db); + dbm_close(db->dbp); + safefree(db); -datum -dbm_FETCH(db, key) +#define ndbm_FETCH(db,key) dbm_fetch(db->dbp,key) +datum_value +ndbm_FETCH(db, key) NDBM_File db - datum key + datum_key key +#define ndbm_STORE(db,key,value,flags) dbm_store(db->dbp,key,value,flags) int -dbm_STORE(db, key, value, flags = DBM_REPLACE) +ndbm_STORE(db, key, value, flags = DBM_REPLACE) NDBM_File db - datum key - datum value + datum_key key + datum_value value int flags CLEANUP: if (RETVAL) { @@ -43,28 +79,66 @@ dbm_STORE(db, key, value, flags = DBM_REPLACE) croak("No write permission to ndbm file"); croak("ndbm store returned %d, errno %d, key \"%s\"", RETVAL,errno,key.dptr); - dbm_clearerr(db); + dbm_clearerr(db->dbp); } +#define ndbm_DELETE(db,key) dbm_delete(db->dbp,key) int -dbm_DELETE(db, key) +ndbm_DELETE(db, key) NDBM_File db - datum key + datum_key key -datum -dbm_FIRSTKEY(db) +#define ndbm_FIRSTKEY(db) dbm_firstkey(db->dbp) +datum_key +ndbm_FIRSTKEY(db) NDBM_File db -datum -dbm_NEXTKEY(db, key) +#define ndbm_NEXTKEY(db,key) dbm_nextkey(db->dbp) +datum_key +ndbm_NEXTKEY(db, key) NDBM_File db - datum key + datum_key key = NO_INIT +#define ndbm_error(db) dbm_error(db->dbp) int -dbm_error(db) +ndbm_error(db) NDBM_File db +#define ndbm_clearerr(db) dbm_clearerr(db->dbp) void -dbm_clearerr(db) +ndbm_clearerr(db) NDBM_File db + +SV * +filter_fetch_key(db, code) + NDBM_File db + SV * code + SV * RETVAL = &PL_sv_undef ; + CODE: + DBM_setFilter(db->filter_fetch_key, code) ; + +SV * +filter_store_key(db, code) + NDBM_File db + SV * code + SV * RETVAL = &PL_sv_undef ; + CODE: + DBM_setFilter(db->filter_store_key, code) ; + +SV * +filter_fetch_value(db, code) + NDBM_File db + SV * code + SV * RETVAL = &PL_sv_undef ; + CODE: + DBM_setFilter(db->filter_fetch_value, code) ; + +SV * +filter_store_value(db, code) + NDBM_File db + SV * code + SV * RETVAL = &PL_sv_undef ; + CODE: + DBM_setFilter(db->filter_store_value, code) ; +