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