Remove duplicated code

master
Vitaliy Filippov 2015-03-20 21:18:57 +03:00
parent 539473c434
commit 2eed7ebcb8
2 changed files with 44 additions and 163 deletions

View File

@ -5,16 +5,9 @@ use strict;
use vars qw($AUTOLOAD $VERSION $ABSTRACT @ISA @EXPORT);
BEGIN {
$VERSION = 0.8;
$VERSION = 1.2;
$ABSTRACT = "Sophia is a modern embeddable key-value database designed for a high load environment (XS for Sophia)";
@ISA = qw(Exporter DynaLoader);
@EXPORT = qw(
SPDIR SPALLOC SPCMP SPPAGE SPGC SPGCF
SPGROW SPMERGE SPMERGEWM SPMERGEFORCE SPVERSION
SPO_RDONLY SPO_RDWR SPO_CREAT SPO_SYNC
SPGT SPGTE SPLT SPLTE
);
@ISA = qw(DynaLoader);
};
bootstrap Database::Sophia $VERSION;
@ -22,6 +15,36 @@ bootstrap Database::Sophia $VERSION;
use DynaLoader ();
use Exporter ();
package Database::Sophia::Txn;
sub get
{
my ($self, $db, $key) = @_;
$db->get($key, $self);
}
sub delete
{
my ($self, $db, $key) = @_;
$db->delete($key, $self);
}
sub set
{
my ($self, $db, $key, $value) = @_;
$db->set($key, $value, $self);
}
package Database::Sophia::Snapshot;
*get = *Database::Sophia::Txn::get;
sub cursor
{
my ($self, $db, $key, $order) = @_;
$db->cursor($key, $order, $self);
}
1;

166
Sophia.xs
View File

@ -257,9 +257,10 @@ open(db)
RETVAL
SV*
get(db, key)
get(db, key, txn = &PL_sv_undef)
Database::Sophia::DB db;
SV *key;
SV *txn;
CODE:
int err;
@ -274,7 +275,7 @@ get(db, key)
if (obj)
{
sp_set(obj, "key", key_c, len_k);
ret = sp_get(db->ptr, obj);
ret = sp_get(SvOK(txn) ? (INT2PTR(sophia_txn_t*, (SvIV((SV*)SvRV(txn)))))->ptr : db->ptr, obj);
if (!err)
{
value = sp_get(ret, "value", &size);
@ -287,9 +288,10 @@ get(db, key)
RETVAL
SV*
delete(db, key)
delete(db, key, txn_or_snapshot = &PL_sv_undef)
Database::Sophia::DB db;
SV *key;
SV *txn_or_snapshot;
CODE:
int err;
@ -302,7 +304,7 @@ delete(db, key)
if (obj)
{
sp_set(obj, "key", key_c, len_k);
err = sp_delete(db->ptr, obj);
err = sp_delete(SvOK(txn_or_snapshot) ? (INT2PTR(sophia_txn_t*, (SvIV((SV*)SvRV(txn_or_snapshot)))))->ptr : db->ptr, obj);
sp_destroy(obj);
}
RETVAL = newSViv(err);
@ -310,10 +312,11 @@ delete(db, key)
RETVAL
SV*
set(db, key, value)
set(db, key, value, txn_or_snapshot = &PL_sv_undef)
Database::Sophia::DB db;
SV *key;
SV *value;
SV *txn_or_snapshot;
CODE:
int err;
@ -329,7 +332,7 @@ set(db, key, value)
{
sp_set(obj, "key", key_c, len_k);
sp_set(obj, "value", value_c, len_v);
err = sp_set(db->ptr, obj);
err = sp_set(SvOK(txn_or_snapshot) ? (INT2PTR(sophia_txn_t*, (SvIV((SV*)SvRV(txn_or_snapshot)))))->ptr : db->ptr, obj);
sp_destroy(obj);
}
RETVAL = newSViv(err);
@ -337,10 +340,11 @@ set(db, key, value)
RETVAL
Database::Sophia::Cursor
cursor(db, key, order)
cursor(db, key, order, snapshot = &PL_sv_undef)
Database::Sophia::DB db;
SV *key;
SV *order;
SV *snapshot;
CODE:
void *c;
@ -355,7 +359,7 @@ cursor(db, key, order)
{
sp_set(obj, "key", key_c, len_k);
sp_set(obj, "order", order_c, len_o);
c = sp_cursor(db->ptr, obj);
c = sp_cursor(SvOK(snapshot) ? (INT2PTR(sophia_snapshot_t*, (SvIV((SV*)SvRV(snapshot)))))->ptr : db->ptr, obj);
sp_destroy(obj);
if (c)
{
@ -392,89 +396,6 @@ commit(txn)
OUTPUT:
RETVAL
SV*
get(txn, db, key)
Database::Sophia::Txn txn;
Database::Sophia::DB db;
SV *key;
CODE:
int err;
STRLEN len_k = 0;
char *key_c = SvPV(key, len_k);
void *value;
size_t size;
RETVAL = &PL_sv_undef;
void *obj = sp_object(db->ptr);
void *ret;
if (obj)
{
sp_set(obj, "key", key_c, len_k);
ret = sp_get(txn->ptr, obj);
if (!err)
{
value = sp_get(ret, "value", &size);
RETVAL = newSVpv(value, size);
sp_destroy(ret);
}
sp_destroy(obj);
}
OUTPUT:
RETVAL
SV*
delete(txn, db, key)
Database::Sophia::Txn txn;
Database::Sophia::DB db;
SV *key;
CODE:
int err;
STRLEN len_k = 0;
char *key_c = SvPV(key, len_k);
RETVAL = &PL_sv_undef;
void *obj = sp_object(db->ptr);
void *ret;
if (obj)
{
sp_set(obj, "key", key_c, len_k);
err = sp_delete(txn->ptr, obj);
sp_destroy(obj);
}
RETVAL = newSViv(err);
OUTPUT:
RETVAL
SV*
set(txn, db, key, value)
Database::Sophia::Txn txn;
Database::Sophia::DB db;
SV *key;
SV *value;
CODE:
int err;
STRLEN len_k = 0;
char *key_c = SvPV(key, len_k);
STRLEN len_v = 0;
char *value_c = SvPV(value, len_v);
RETVAL = &PL_sv_undef;
void *obj = sp_object(db->ptr);
void *ret;
if (obj)
{
sp_set(obj, "key", key_c, len_k);
sp_set(obj, "value", value_c, len_v);
err = sp_set(txn->ptr, obj);
sp_destroy(obj);
}
RETVAL = newSViv(err);
OUTPUT:
RETVAL
void
DESTROY(ptr)
Database::Sophia::Txn ptr;
@ -500,69 +421,6 @@ drop(snapshot)
OUTPUT:
RETVAL
SV*
get(snapshot, db, key)
Database::Sophia::Snapshot snapshot;
Database::Sophia::DB db;
SV *key;
CODE:
int err;
STRLEN len_k = 0;
char *key_c = SvPV(key, len_k);
void *value;
size_t size;
RETVAL = &PL_sv_undef;
void *obj = sp_object(db->ptr);
void *ret;
if (obj)
{
sp_set(obj, "key", key_c, len_k);
ret = sp_get(snapshot->ptr, obj);
if (!err)
{
value = sp_get(ret, "value", &size);
RETVAL = newSVpv(value, size);
sp_destroy(ret);
}
sp_destroy(obj);
}
OUTPUT:
RETVAL
Database::Sophia::Cursor
cursor(snapshot, db, key, order)
Database::Sophia::Snapshot snapshot;
Database::Sophia::DB db;
SV *key;
SV *order;
CODE:
void *c;
STRLEN len_k = 0;
char *key_c = SvPV(key, len_k);
STRLEN len_o = 0;
char *order_c = SvPV(order, len_o);
void *obj = sp_object(db->ptr);
RETVAL = (void*)&PL_sv_undef;
if (obj)
{
sp_set(obj, "key", key_c, len_k);
sp_set(obj, "order", order_c, len_o);
c = sp_cursor(snapshot->ptr, obj);
sp_destroy(obj);
if (c)
{
sophia_cursor_t *cur = malloc(sizeof(sophia_cursor_t));
cur->ptr = c;
RETVAL = cur;
}
}
OUTPUT:
RETVAL
void
DESTROY(ptr)
Database::Sophia::Snapshot ptr;