improved patch to tdb-perl

Al Borchers ABorchers at tricord.com
Mon Oct 15 12:23:18 GMT 2001


Here is an improved version of the patch to tdb-perl I
sent last week.

This includes the change to use arbitrary Perl strings
from my earlier patch, and this patch also fixes a 
memory leak in tdb-perl.

-- Al
-------------- next part --------------
--- tdb-perl.orig/Tdb.xs	Tue Oct  9 09:33:30 2001
+++ tdb-perl/Tdb.xs	Mon Oct 15 13:50:37 2001
@@ -152,43 +152,45 @@
   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;
+  if( rdata.dptr ) {
+    RETVAL = newSVpvn(rdata.dptr,rdata.dsize);
+    free( rdata.dptr );
+  } else {
+    RETVAL = &PL_sv_undef;
+  }
 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 +198,42 @@
 
   rdata = tdb_firstkey((TDB_CONTEXT*)dbref);
 
-  RETVAL = rdata.dptr;
+  if( rdata.dptr ) {
+    RETVAL = newSVpvn(rdata.dptr,rdata.dsize);
+    free( rdata.dptr );
+  } else {
+    RETVAL = &PL_sv_undef;
+  }
 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;
+  if( rdata.dptr ) {
+    RETVAL = newSVpvn(rdata.dptr,rdata.dsize);
+    free( rdata.dptr );
+  } else {
+    RETVAL = &PL_sv_undef;
+  }
 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 +248,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