1
0
Files
irix-657m-src/eoe/cmd/perl5/ext/MDBM_File/MDBM_File.xs
2022-09-29 17:59:04 +03:00

183 lines
2.9 KiB
Plaintext

#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"
#include <mdbm.h>
#include <alloca.h>
typedef MDBM* MDBM_File;
#define mdbm_TIEHASH(dbtype,filename,flags,mode,pagesize) mdbm_open(filename,flags,mode,pagesize)
MODULE = MDBM_File PACKAGE = MDBM_File PREFIX = mdbm_
MDBM_File
mdbm_TIEHASH(dbtype, filename, flags, mode, pagesize = 0)
char * dbtype
char * filename
int flags
int mode
int pagesize
void
mdbm_DESTROY(db)
MDBM_File db
CODE:
mdbm_close(db);
int
mdbm_FETCH(db, key)
MDBM_File db
datum key
CODE:
{
kvpair kv;
int pagesize;
kv.key = key;
pagesize = MDBM_PAGE_SIZE(db);
if (_Mdbm_chaining(db)) {
kv.val.dsize = 0;
kv.val = mdbm_chain_fetch(db, kv);
if (kv.val.dsize) {
kv.val.dptr = alloca(kv.val.dsize);
kv.val = mdbm_chain_fetch(db, kv);
}
} else {
kv.val.dptr = alloca(pagesize);
kv.val.dsize = pagesize;
kv.val = mdbm_fetch(db, kv);
}
ST(0) = sv_newmortal();
if (kv.val.dptr) {
sv_setpvn(ST(0), kv.val.dptr, kv.val.dsize);
}
}
int
mdbm_STORE(db, key, value, flags = MDBM_REPLACE)
MDBM_File db
datum key
datum value
int flags
CODE:
{
if (_Mdbm_chaining(db)) {
RETVAL = mdbm_chain_store(db, key, value, flags);
} else {
RETVAL = mdbm_store(db, key, value, flags);
}
}
OUTPUT:
RETVAL
CLEANUP:
if (RETVAL) {
if (RETVAL < 0 && errno == EPERM)
croak("No write permission to mdbm file");
croak("mdbm store returned %d, errno %d, key \"%s\"",
RETVAL,errno,key.dptr);
}
int
mdbm_DELETE(db, key)
MDBM_File db
datum key
CODE:
{
if (_Mdbm_chaining(db)) {
RETVAL = mdbm_chain_delete(db, key);
} else {
RETVAL = mdbm_delete(db, key);
}
}
OUTPUT:
RETVAL
int
mdbm_FIRSTKEY(db)
MDBM_File db
CODE:
{
kvpair kv;
int pagesize;
pagesize = MDBM_PAGE_SIZE(db);
kv.key.dptr = alloca(pagesize);
kv.key.dsize = pagesize;
kv.val.dptr = 0;
kv.val.dsize = 0;
if (_Mdbm_chaining(db)) {
kv = mdbm_chain_first(db, kv);
} else {
kv = mdbm_first(db, kv);
}
ST(0) = sv_newmortal();
if (kv.key.dptr) {
sv_setpvn(ST(0), kv.key.dptr, kv.key.dsize);
}
}
int
mdbm_NEXTKEY(db, key)
MDBM_File db
datum key
CODE:
{
kvpair kv;
int pagesize;
pagesize = MDBM_PAGE_SIZE(db);
kv.key.dptr = alloca(pagesize);
kv.key.dsize = pagesize;
kv.val.dptr = 0;
kv.val.dsize = 0;
if (_Mdbm_chaining(db)) {
kv = mdbm_chain_next(db, kv);
} else {
kv = mdbm_next(db, kv);
}
ST(0) = sv_newmortal();
if (kv.key.dptr) {
sv_setpvn(ST(0), kv.key.dptr, kv.key.dsize);
}
}
int
mdbm_chain(db)
MDBM_File db
CODE:
mdbm_set_chain(db);
int
mdbm_fd(db)
MDBM_File db
CODE:
RETVAL = db->m_fd;
OUTPUT:
RETVAL
int
mdbm_invalidate(db)
MDBM_File db
CODE:
RETVAL = mdbm_invalidate(db);
OUTPUT:
RETVAL
void
mdbm_sethash(db, number)
MDBM_File db
int number
CODE:
mdbm_sethash(db, number);
void
mdbm_sync(db)
MDBM_File db
CODE:
mdbm_sync(db);