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