From 2eed7ebcb8102e8d10d470cf2b79514a0fb08443 Mon Sep 17 00:00:00 2001 From: Vitaliy Filippov Date: Fri, 20 Mar 2015 21:18:57 +0300 Subject: [PATCH] Remove duplicated code --- Sophia.pm | 41 +++++++++++--- Sophia.xs | 166 ++++-------------------------------------------------- 2 files changed, 44 insertions(+), 163 deletions(-) diff --git a/Sophia.pm b/Sophia.pm index 5bb1b66..750d5c5 100755 --- a/Sophia.pm +++ b/Sophia.pm @@ -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; diff --git a/Sophia.xs b/Sophia.xs index 3cbd1a2..70895d4 100755 --- a/Sophia.xs +++ b/Sophia.xs @@ -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;