patch for tdb-perl to use arbitrary perl strings
Al Borchers
ABorchers at tricord.com
Fri Oct 12 09:36:02 GMT 2001
tdb-perl (in the sourceforge CVS archives for tdb) is currently
restricted to using null terminated strings for keys and data.
This patch allows tdb-perl to use arbitrary Perl strings (which
might contain null bytes) for keys and data.
This is handy when trying to read/write binary data in a tdb
database from perl. For example, we needed it to get/set the
high water mark in winbindd_idmap.tdb, which is an int, not a
string.
Any comments welcome.
-- Al
-------------- next part --------------
--- tdb-perl.orig/Tdb.xs Tue Oct 9 09:33:30 2001
+++ tdb-perl/Tdb.xs Fri Oct 12 10:42:15 2001
@@ -152,43 +152,40 @@
RETVAL
-char *
+SV *
xs_tdb_fetch(dbref, key)
void *dbref
- char *key
+ SV *key
CODE:
TDB_DATA tdata;
TDB_DATA rdata;
- tdata.dptr = key;
- tdata.dsize = strlen(key) + 1;
+ tdata.dptr = (char *)SvPV(key,tdata.dsize);
rdata = tdb_fetch((TDB_CONTEXT*)dbref, tdata);
- RETVAL = rdata.dptr;
+ RETVAL = newSVpvn(rdata.dptr,rdata.dsize);
OUTPUT:
RETVAL
int
xs_tdb_store(dbref, key, data, flag)
void *dbref
- char *key
- char *data
+ SV *key
+ SV *data
int flag
CODE:
TDB_DATA tkey;
TDB_DATA tdata;
- tkey.dptr = key;
- tkey.dsize = strlen(key) + 1;
- tdata.dptr = data;
- tdata.dsize = strlen(data) + 1;
+ tkey.dptr = (char *)SvPV(key,tkey.dsize);
+ tdata.dptr = (char *)SvPV(data,tdata.dsize);
RETVAL = tdb_store((TDB_CONTEXT*)dbref, tkey, tdata, flag);
OUTPUT:
RETVAL
-char *
+SV *
xs_tdb_firstkey(dbref)
void *dbref
CODE:
@@ -196,34 +193,32 @@
rdata = tdb_firstkey((TDB_CONTEXT*)dbref);
- RETVAL = rdata.dptr;
+ RETVAL = newSVpvn(rdata.dptr,rdata.dsize);
OUTPUT:
RETVAL
-char *
+SV *
xs_tdb_nextkey(dbref, key)
void *dbref
- char *key
+ SV *key
CODE:
TDB_DATA rdata;
TDB_DATA kdata;
- kdata.dptr = key;
- kdata.dsize = strlen(key) + 1;
+ kdata.dptr = (char *)SvPV(key,kdata.dsize);
rdata = tdb_nextkey((TDB_CONTEXT*)dbref, kdata);
- RETVAL = rdata.dptr;
+ RETVAL = newSVpvn(rdata.dptr,rdata.dsize);
OUTPUT:
RETVAL
int
xs_tdb_exists(dbref, key)
void *dbref
- char *key
+ SV *key
CODE:
TDB_DATA kdata;
- kdata.dptr = key;
- kdata.dsize = strlen(key) + 1;
+ kdata.dptr = (char *)SvPV(key,kdata.dsize);
RETVAL = tdb_exists((TDB_CONTEXT*)dbref, kdata);
OUTPUT:
@@ -238,11 +233,10 @@
int
xs_tdb_delete(dbref, key)
void *dbref
- char *key
+ SV *key
CODE:
TDB_DATA kdata;
- kdata.dptr = key;
- kdata.dsize = strlen(key) + 1;
+ kdata.dptr = (char *)SvPV(key,kdata.dsize);
RETVAL = tdb_delete((TDB_CONTEXT*)dbref, kdata);
OUTPUT:
More information about the samba-technical
mailing list