summaryrefslogtreecommitdiffstats
path: root/sca-cpp/trunk/components/nosqldb
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--sca-cpp/trunk/components/nosqldb/Makefile.am3
-rw-r--r--sca-cpp/trunk/components/nosqldb/nosqldb.composite2
-rw-r--r--sca-cpp/trunk/components/nosqldb/tinycdb.hpp108
3 files changed, 75 insertions, 38 deletions
diff --git a/sca-cpp/trunk/components/nosqldb/Makefile.am b/sca-cpp/trunk/components/nosqldb/Makefile.am
index 608de23527..12e88308b9 100644
--- a/sca-cpp/trunk/components/nosqldb/Makefile.am
+++ b/sca-cpp/trunk/components/nosqldb/Makefile.am
@@ -27,9 +27,12 @@ tinycdb.prefix: $(top_builddir)/config.status
echo ${TINYCDB_PREFIX} >tinycdb.prefix
comp_LTLIBRARIES = libnosqldb.la
+noinst_DATA = libnosqldb.so
libnosqldb_la_SOURCES = nosqldb.cpp
libnosqldb_la_LDFLAGS = -L${TINYCDB_LIB} -R${TINYCDB_LIB} -lcdb
+libnosqldb.so:
+ ln -s .libs/libnosqldb.so
tinycdb_test_SOURCES = tinycdb-test.cpp
tinycdb_test_LDFLAGS = -L${TINYCDB_LIB} -R${TINYCDB_LIB} -lcdb
diff --git a/sca-cpp/trunk/components/nosqldb/nosqldb.composite b/sca-cpp/trunk/components/nosqldb/nosqldb.composite
index 812f0739fe..af2d3a18d7 100644
--- a/sca-cpp/trunk/components/nosqldb/nosqldb.composite
+++ b/sca-cpp/trunk/components/nosqldb/nosqldb.composite
@@ -23,7 +23,7 @@
name="nosqldb">
<component name="nosqldb">
- <implementation.cpp path=".libs" library="libnosqldb"/>
+ <implementation.cpp path="." library="libnosqldb"/>
<property name="dbname">tmp/test.cdb</property>
<service name="nosqldb">
<t:binding.http uri="nosqldb"/>
diff --git a/sca-cpp/trunk/components/nosqldb/tinycdb.hpp b/sca-cpp/trunk/components/nosqldb/tinycdb.hpp
index a22cd81fd1..143b3da308 100644
--- a/sca-cpp/trunk/components/nosqldb/tinycdb.hpp
+++ b/sca-cpp/trunk/components/nosqldb/tinycdb.hpp
@@ -120,13 +120,6 @@ private:
int fd;
struct stat st;
- //friend const failable<bool> post(const value& key, const value& val, TinyCDB& cdb);
- //friend const failable<bool> put(const value& key, const value& val, TinyCDB& cdb);
- //friend const failable<value> get(const value& key, const TinyCDB& cdb);
- //friend const failable<bool> del(const value& key, TinyCDB& cdb);
- //friend const failable<bool> rewrite(const lambda<failable<bool>(buffer& buf, const unsigned int klen, const unsigned int vlen)>& update, const lambda<failable<bool>(struct cdb_make&)>& finish, TinyCDB& cdb);
- //friend const failable<bool> rewrite(const lambda<failable<bool>(buffer& buf, const unsigned int klen, const unsigned int vlen)>& update, const lambda<failable<bool>(struct cdb_make&)>& finish, buffer& buf, const int fd, TinyCDB& cdb);
-
friend const string dbname(const TinyCDB& cdb);
friend const failable<int> cdbopen(TinyCDB& cdb);
friend const failable<bool> cdbclose(TinyCDB& cdb);
@@ -306,6 +299,29 @@ const failable<bool> rewrite(const lambda<failable<bool>(buffer& buf, const unsi
/**
* Post a new item to the database.
*/
+struct postUpdate {
+ const string ks;
+ postUpdate(const string& ks) : ks(ks) {
+ }
+ const failable<bool> operator()(buffer& buf, const unsigned int klen, unused const unsigned int vlen) const {
+ if (ks == string((char*)buf, klen))
+ return mkfailure<bool>("Key already exists");
+ return true;
+ }
+};
+
+struct postFinish {
+ const string ks;
+ const string vs;
+ postFinish(const string& ks, const string& vs) : ks(ks), vs(vs) {
+ }
+ const failable<bool> operator()(struct cdb_make& cdbm) const {
+ if (cdb_make_add(&cdbm, c_str(ks), length(ks), c_str(vs), length(vs)) == -1)
+ return mkfailure<bool>("Could not add entry");
+ return true;
+ }
+};
+
const failable<bool> post(const value& key, const value& val, TinyCDB& cdb) {
debug(key, "tinycdb::post::key");
debug(val, "tinycdb::post::value");
@@ -315,18 +331,10 @@ const failable<bool> post(const value& key, const value& val, TinyCDB& cdb) {
const string vs(scheme::writeValue(val));
// Process each entry and detect existing key
- auto update = [=](buffer& buf, const unsigned int klen, unused const unsigned int vlen)->const failable<bool> {
- if (ks == string((char*)buf, klen))
- return mkfailure<bool>("Key already exists");
- return true;
- };
+ const lambda<failable<bool>(buffer& buf, const unsigned int klen, const unsigned int vlen)> update = postUpdate(ks);
// Add the new entry to the db
- auto finish = [=](struct cdb_make& cdbm)->const failable<bool> {
- if (cdb_make_add(&cdbm, c_str(ks), length(ks), c_str(vs), length(vs)) == -1)
- return mkfailure<bool>("Could not add entry");
- return true;
- };
+ const lambda<failable<bool>(struct cdb_make& cdbm)> finish = postFinish(ks, vs);
// Rewrite the db
const failable<bool> r = rewrite(update, finish, cdb);
@@ -337,6 +345,29 @@ const failable<bool> post(const value& key, const value& val, TinyCDB& cdb) {
/**
* Update an item in the database. If the item doesn't exist it is added.
*/
+struct putUpdate {
+ const string ks;
+ putUpdate(const string& ks) : ks(ks) {
+ }
+ const failable<bool> operator()(buffer& buf, const unsigned int klen, unused const unsigned int vlen) const {
+ if (ks == string((char*)buf, klen))
+ return false;
+ return true;
+ }
+};
+
+struct putFinish {
+ const string ks;
+ const string vs;
+ putFinish(const string& ks, const string& vs) : ks(ks), vs(vs) {
+ }
+ const failable<bool> operator()(struct cdb_make& cdbm) const {
+ if (cdb_make_add(&cdbm, c_str(ks), length(ks), c_str(vs), length(vs)) == -1)
+ return mkfailure<bool>("Could not add entry");
+ return true;
+ }
+};
+
const failable<bool> put(const value& key, const value& val, TinyCDB& cdb) {
debug(key, "tinycdb::put::key");
debug(val, "tinycdb::put::value");
@@ -346,18 +377,10 @@ const failable<bool> put(const value& key, const value& val, TinyCDB& cdb) {
const string vs(scheme::writeValue(val));
// Process each entry and skip existing key
- auto update = [&](buffer& buf, const unsigned int klen, unused const unsigned int vlen)->const failable<bool> {
- if (ks == string((char*)buf, klen))
- return false;
- return true;
- };
+ const lambda<failable<bool>(buffer& buf, const unsigned int klen, const unsigned int vlen)> update = putUpdate(ks);
// Add the new entry to the db
- auto finish = [&](struct cdb_make& cdbm)->const failable<bool> {
- if (cdb_make_add(&cdbm, c_str(ks), length(ks), c_str(vs), length(vs)) == -1)
- return mkfailure<bool>("Could not add entry");
- return true;
- };
+ const lambda<failable<bool>(struct cdb_make& cdbm)> finish = putFinish(ks, vs);
// Rewrite the db
const failable<bool> r = rewrite(update, finish, cdb);
@@ -394,6 +417,25 @@ const failable<value> get(const value& key, TinyCDB& cdb) {
/**
* Delete an item from the database
*/
+struct delUpdate {
+ const string ks;
+ delUpdate(const string& ks) : ks(ks) {
+ }
+ const failable<bool> operator()(buffer& buf, const unsigned int klen, unused const unsigned int vlen) const {
+ if (ks == string((char*)buf, klen))
+ return false;
+ return true;
+ }
+};
+
+struct delFinish {
+ delFinish() {
+ }
+ const failable<bool> operator()(unused struct cdb_make& cdbm) const {
+ return true;
+ }
+};
+
const failable<bool> del(const value& key, TinyCDB& cdb) {
debug(key, "tinycdb::delete::key");
debug(dbname(cdb), "tinycdb::delete::dbname");
@@ -401,18 +443,10 @@ const failable<bool> del(const value& key, TinyCDB& cdb) {
const string ks(scheme::writeValue(key));
// Process each entry and skip existing key
- auto update = [=](buffer& buf, const unsigned int klen, unused const unsigned int vlen)->const failable<bool> {
- if (ks == string((char*)buf, klen))
- return false;
- return true;
- };
+ const lambda<failable<bool>(buffer& buf, const unsigned int klen, const unsigned int vlen)> update = delUpdate(ks);
// Nothing to do to finish
- auto finish = [=](unused struct cdb_make& cdbm)->const failable<bool> {
- // hack: reference a variable from outer scope to workaround GCC internal error
- const string xs(ks);
- return true;
- };
+ const lambda<failable<bool>(struct cdb_make& cdbm)> finish = delFinish();
// Rewrite the db
const failable<bool> r = rewrite(update, finish, cdb);