summaryrefslogtreecommitdiffstats
path: root/sca-cpp/trunk/components/filedb
diff options
context:
space:
mode:
Diffstat (limited to 'sca-cpp/trunk/components/filedb')
-rw-r--r--sca-cpp/trunk/components/filedb/Makefile.am6
-rw-r--r--sca-cpp/trunk/components/filedb/client-test.cpp71
-rw-r--r--sca-cpp/trunk/components/filedb/file-test.cpp32
-rw-r--r--sca-cpp/trunk/components/filedb/filedb.cpp43
-rw-r--r--sca-cpp/trunk/components/filedb/filedb.hpp57
5 files changed, 83 insertions, 126 deletions
diff --git a/sca-cpp/trunk/components/filedb/Makefile.am b/sca-cpp/trunk/components/filedb/Makefile.am
index c6589a1b7b..e15eb2002e 100644
--- a/sca-cpp/trunk/components/filedb/Makefile.am
+++ b/sca-cpp/trunk/components/filedb/Makefile.am
@@ -26,15 +26,15 @@ comp_LTLIBRARIES = libfiledb.la
noinst_DATA = libfiledb${libsuffix}
libfiledb_la_SOURCES = filedb.cpp
-libfiledb_la_LDFLAGS = -lxml2 -lmozjs
+libfiledb_la_LDFLAGS = -lxml2 -ljansson
libfiledb${libsuffix}:
ln -s .libs/libfiledb${libsuffix}
file_test_SOURCES = file-test.cpp
-file_test_LDFLAGS = -lxml2 -lmozjs
+file_test_LDFLAGS = -lxml2 -ljansson
client_test_SOURCES = client-test.cpp
-client_test_LDFLAGS = -lxml2 -lcurl -lmozjs
+client_test_LDFLAGS = -lxml2 -lcurl -ljansson
dist_noinst_SCRIPTS = filedb-test server-test
noinst_PROGRAMS = file-test client-test
diff --git a/sca-cpp/trunk/components/filedb/client-test.cpp b/sca-cpp/trunk/components/filedb/client-test.cpp
index e0f98d8c3b..5694d97522 100644
--- a/sca-cpp/trunk/components/filedb/client-test.cpp
+++ b/sca-cpp/trunk/components/filedb/client-test.cpp
@@ -38,15 +38,15 @@ namespace filedb {
const string uri("http://localhost:8090/filedb");
-bool testFileDB() {
- http::CURLSession cs("", "", "", "", 0);
-
- const list<value> i = list<value>() + "content" + (list<value>() + "item"
- + (list<value>() + "name" + string("Apple"))
- + (list<value>() + "price" + string("$2.99")));
- const list<value> a = list<value>() + (list<value>() + "entry"
- + (list<value>() + "title" + string("item"))
- + (list<value>() + "id" + string("cart-53d67a61-aa5e-4e5e-8401-39edeba8b83b"))
+const bool testFileDB() {
+ const http::CURLSession cs("", "", "", "", 0);
+
+ const list<value> i = nilListValue + "content" + (nilListValue + "item"
+ + (nilListValue + "name" + string("Apple"))
+ + (nilListValue + "price" + string("$2.99")));
+ const list<value> a = nilListValue + (nilListValue + "entry"
+ + (nilListValue + "title" + string("item"))
+ + (nilListValue + "id" + string("cart-53d67a61-aa5e-4e5e-8401-39edeba8b83b"))
+ i);
const failable<value> id = http::post(a, uri, cs);
@@ -59,18 +59,18 @@ bool testFileDB() {
assert(content(val) == a);
}
- const list<value> j = list<value>() + "content" + (list<value>() + "item"
- + (list<value>() + "name" + string("Apple"))
- + (list<value>() + "price" + string("$3.55")));
- const list<value> b = list<value>() + (list<value>() + "entry"
- + (list<value>() + "title" + string("item"))
- + (list<value>() + "id" + string("cart-53d67a61-aa5e-4e5e-8401-39edeba8b83b"))
+ const list<value> j = nilListValue + "content" + (nilListValue + "item"
+ + (nilListValue + "name" + string("Apple"))
+ + (nilListValue + "price" + string("$3.55")));
+ const list<value> b = nilListValue + (nilListValue + "entry"
+ + (nilListValue + "title" + string("item"))
+ + (nilListValue + "id" + string("cart-53d67a61-aa5e-4e5e-8401-39edeba8b83b"))
+ j);
{
const failable<value> r = http::put(b, uri + p, cs);
assert(hasContent(r));
- assert(content(r) == value(true));
+ assert(content(r) == trueValue);
}
{
const failable<value> val = http::get(uri + p, cs);
@@ -80,7 +80,7 @@ bool testFileDB() {
{
const failable<value> r = http::del(uri + p, cs);
assert(hasContent(r));
- assert(content(r) == value(true));
+ assert(content(r) == trueValue);
}
{
const failable<value> val = http::get(uri + p, cs);
@@ -90,35 +90,26 @@ bool testFileDB() {
return true;
}
-struct getLoop {
- const string path;
- const value entry;
- http::CURLSession& cs;
- getLoop(const string& path, const value& entry, http::CURLSession& cs) : path(path), entry(entry), cs(cs) {
- }
- const bool operator()() const {
- const failable<value> val = http::get(uri + path, cs);
- assert(hasContent(val));
- assert(content(val) == entry);
- return true;
- }
-};
-
-bool testGetPerf() {
- const list<value> i = list<value>() + "content" + (list<value>() + "item"
- + (list<value>() + "name" + string("Apple"))
- + (list<value>() + "price" + string("$4.55")));
- const list<value> a = list<value>() + (list<value>() + "entry"
- + (list<value>() + "title" + string("item"))
- + (list<value>() + "id" + string("cart-53d67a61-aa5e-4e5e-8401-39edeba8b83b"))
+const bool testGetPerf() {
+ const list<value> i = nilListValue + "content" + (nilListValue + "item"
+ + (nilListValue + "name" + string("Apple"))
+ + (nilListValue + "price" + string("$4.55")));
+ const list<value> a = nilListValue + (nilListValue + "entry"
+ + (nilListValue + "title" + string("item"))
+ + (nilListValue + "id" + string("cart-53d67a61-aa5e-4e5e-8401-39edeba8b83b"))
+ i);
- http::CURLSession cs("", "", "", "", 0);
+ const http::CURLSession cs("", "", "", "", 0);
const failable<value> id = http::post(a, uri, cs);
assert(hasContent(id));
const string p = path(content(id));
- const lambda<bool()> gl = getLoop(p, a, cs);
+ const blambda gl = [p, a, cs]() -> const bool {
+ const failable<value> val = http::get(uri + p, cs);
+ assert(hasContent(val));
+ assert(content(val) == a);
+ return true;
+ };
cout << "FileDB get test " << time(gl, 5, 200) << " ms" << endl;
return true;
diff --git a/sca-cpp/trunk/components/filedb/file-test.cpp b/sca-cpp/trunk/components/filedb/file-test.cpp
index ff57bd79ce..5270967ccb 100644
--- a/sca-cpp/trunk/components/filedb/file-test.cpp
+++ b/sca-cpp/trunk/components/filedb/file-test.cpp
@@ -32,12 +32,12 @@
namespace tuscany {
namespace filedb {
-bool testFileDB(const string& dbname, const string& format) {
- FileDB db(dbname, format);
+const bool testFileDB(const string& dbname, const string& format) {
+ const FileDB db(dbname, format);
const value k = mklist<value>("a", "b");
- const list<value> a = mklist<value>(list<value>() + "ns1:a" + (list<value>() + "@xmlns:ns1" + string("http://aaa")) + (list<value>() + "text" + string("Hey!")));
- const list<value> b = mklist<value>(list<value>() + "ns1:b" + (list<value>() + "@xmlns:ns1" + string("http://bbb")) + (list<value>() + "text" + string("Hey!")));
+ const list<value> a = mklist<value>(nilListValue + "ns1:a" + (nilListValue + "@xmlns:ns1" + string("http://aaa")) + (nilListValue + "text" + string("Hey!")));
+ const list<value> b = mklist<value>(nilListValue + "ns1:b" + (nilListValue + "@xmlns:ns1" + string("http://bbb")) + (nilListValue + "text" + string("Hey!")));
assert(hasContent(post(k, a, db)));
assert((get(k, db)) == value(a));
@@ -50,27 +50,17 @@ bool testFileDB(const string& dbname, const string& format) {
return true;
}
-struct getLoop {
- const value k;
- FileDB& db;
- const list<value> c;
- getLoop(const value& k, FileDB& db) : k(k), db(db),
- c(mklist<value>(list<value>() + "ns1:c" + (list<value>() + "@xmlns:ns1" + string("http://ccc")) + (list<value>() + "text" + string("Hey!")))) {
- }
- const bool operator()() const {
- assert((get(k, db)) == value(c));
- return true;
- }
-};
-
-bool testGetPerf(const string& dbname, const string& format) {
- FileDB db(dbname, format);
+const bool testGetPerf(const string& dbname, const string& format) {
+ const FileDB db(dbname, format);
const value k = mklist<value>("c");
- const list<value> c = mklist<value>(list<value>() + "ns1:c" + (list<value>() + "@xmlns:ns1" + string("http://ccc")) + (list<value>() + "text" + string("Hey!")));
+ const list<value> c = mklist<value>(nilListValue + "ns1:c" + (nilListValue + "@xmlns:ns1" + string("http://ccc")) + (nilListValue + "text" + string("Hey!")));
assert(hasContent(post(k, c, db)));
- const lambda<bool()> gl = getLoop(k, db);
+ const blambda gl = [k, c, db]() -> const bool {
+ assert((get(k, db)) == value(c));
+ return true;
+ };
cout << "FileDB get test " << time(gl, 5, 5000) << " ms" << endl;
return true;
}
diff --git a/sca-cpp/trunk/components/filedb/filedb.cpp b/sca-cpp/trunk/components/filedb/filedb.cpp
index 8644a78574..37cb6c5260 100644
--- a/sca-cpp/trunk/components/filedb/filedb.cpp
+++ b/sca-cpp/trunk/components/filedb/filedb.cpp
@@ -37,14 +37,14 @@ namespace filedb {
/**
* Get an item from the database.
*/
-const failable<value> get(const list<value>& params, filedb::FileDB& db) {
+const failable<value> get(const list<value>& params, const filedb::FileDB& db) {
return filedb::get(car(params), db);
}
/**
* Post an item to the database.
*/
-const failable<value> post(const list<value>& params, filedb::FileDB& db) {
+const failable<value> post(const list<value>& params, const filedb::FileDB& db) {
const value id = append<value>(car(params), mklist(mkuuid()));
const failable<bool> val = filedb::post(id, cadr(params), db);
if (!hasContent(val))
@@ -55,7 +55,7 @@ const failable<value> post(const list<value>& params, filedb::FileDB& db) {
/**
* Put an item into the database.
*/
-const failable<value> put(const list<value>& params, filedb::FileDB& db) {
+const failable<value> put(const list<value>& params, const filedb::FileDB& db) {
const failable<bool> val = filedb::put(car(params), cadr(params), db);
if (!hasContent(val))
return mkfailure<value>(val);
@@ -65,7 +65,7 @@ const failable<value> put(const list<value>& params, filedb::FileDB& db) {
/**
* Delete an item from the database.
*/
-const failable<value> del(const list<value>& params, filedb::FileDB& db) {
+const failable<value> del(const list<value>& params, const filedb::FileDB& db) {
const failable<bool> val = filedb::del(car(params), db);
if (!hasContent(val))
return mkfailure<value>(val);
@@ -73,14 +73,17 @@ const failable<value> del(const list<value>& params, filedb::FileDB& db) {
}
/**
- * Component implementation lambda function.
+ * Start the component.
*/
-class applyfiledb {
-public:
- applyfiledb(filedb::FileDB& db) : db(db) {
- }
+const failable<value> start(const list<value>& params) {
+ // Connect to the configured database and table
+ const value dbname = ((lvvlambda)car(params))(nilListValue);
+ const value format = ((lvvlambda)cadr(params))(nilListValue);
+
+ const filedb::FileDB& db = *(new (gc_new<filedb::FileDB>()) filedb::FileDB(absdbname(dbname), format));
- const value operator()(const list<value>& params) const {
+ // Return the component implementation lambda function
+ const lvvlambda applyfiledb = [db](const list<value>& params) -> const value {
const value func(car(params));
if (func == "get")
return get(cdr(params), db);
@@ -91,24 +94,8 @@ public:
if (func == "delete")
return del(cdr(params), db);
return mkfailure<value>();
- }
-
-private:
- filedb::FileDB& db;
-};
-
-/**
- * Start the component.
- */
-const failable<value> start(const list<value>& params) {
- // Connect to the configured database and table
- const value dbname = ((lambda<value(const list<value>&)>)car(params))(list<value>());
- const value format = ((lambda<value(const list<value>&)>)cadr(params))(list<value>());
-
- filedb::FileDB& db = *(new (gc_new<filedb::FileDB>()) filedb::FileDB(absdbname(dbname), format));
-
- // Return the component implementation lambda function
- return value(lambda<value(const list<value>&)>(applyfiledb(db)));
+ };
+ return value(applyfiledb);
}
}
diff --git a/sca-cpp/trunk/components/filedb/filedb.hpp b/sca-cpp/trunk/components/filedb/filedb.hpp
index 9c3017d0d8..2855cebfc6 100644
--- a/sca-cpp/trunk/components/filedb/filedb.hpp
+++ b/sca-cpp/trunk/components/filedb/filedb.hpp
@@ -32,8 +32,8 @@
#include "monad.hpp"
#include "fstream.hpp"
#include "element.hpp"
-#include "xml.hpp"
#include "../../modules/scheme/eval.hpp"
+#include "../../modules/xml/xml.hpp"
#include "../../modules/json/json.hpp"
namespace tuscany {
@@ -68,30 +68,22 @@ public:
debug("filedb::filedb::copy");
}
- const FileDB& operator=(const FileDB& c) {
- debug("filedb::filedb::operator=");
- if(this == &c)
- return *this;
- owner = false;
- name = c.name;
- format = c.format;
- return *this;
- }
+ FileDB& operator=(const FileDB& c) = delete;
~FileDB() {
}
private:
- bool owner;
- string name;
- string format;
+ const bool owner;
+ const string name;
+ const string format;
friend const failable<bool> write(const value& v, ostream& os, const string& format);
friend const failable<value> read(istream& is, const string& format);
- friend const failable<bool> post(const value& key, const value& val, FileDB& db);
- friend const failable<bool> put(const value& key, const value& val, FileDB& db);
- friend const failable<value> get(const value& key, FileDB& db);
- friend const failable<bool> del(const value& key, FileDB& db);
+ friend const failable<bool> post(const value& key, const value& val, const FileDB& db);
+ friend const failable<bool> put(const value& key, const value& val, const FileDB& db);
+ friend const failable<value> get(const value& key, const FileDB& db);
+ friend const failable<bool> del(const value& key, const FileDB& db);
};
/**
@@ -100,7 +92,7 @@ private:
const string filename(const list<value>& path, const string& root) {
if (isNil(path))
return root;
- const string name = root + "/" + (isString(car(path))? (string)car(path) : scheme::writeValue(car(path)));
+ const string name = root + "/" + (isString(car(path))? (string)car(path) : write(content(scheme::writeValue(car(path)))));
return filename(cdr(path), name);
}
@@ -116,7 +108,7 @@ const string filename(const value& key, const string& root) {
const failable<bool> mkdirs(const list<value>& path, const string& root) {
if (isNil(cdr(path)))
return true;
- const string dir = root + "/" + (isString(car(path))? (string)car(path) : scheme::writeValue(car(path)));
+ const string dir = root + "/" + (isString(car(path))? (string)car(path) : write(content(scheme::writeValue(car(path)))));
mkdir(c_str(dir), S_IRWXU);
return mkdirs(cdr(path), dir);
}
@@ -126,20 +118,19 @@ const failable<bool> mkdirs(const list<value>& path, const string& root) {
*/
const failable<bool> write(const value& v, ostream& os, const string& format) {
if (format == "scheme") {
- const string vs(scheme::writeValue(v));
+ const string vs(write(content(scheme::writeValue(v))));
os << vs;
return true;
}
if (format == "xml") {
- failable<list<string> > s = writeXML(valuesToElements(v));
+ failable<list<string> > s = xml::writeElements(valuesToElements(v));
if (!hasContent(s))
return mkfailure<bool>(s);
write(content(s), os);
return true;
}
if (format == "json") {
- js::JSContext jscx;
- failable<list<string> > s = json::writeJSON(valuesToElements(v), jscx);
+ failable<list<string> > s = json::writeValue(v);
if (!hasContent(s))
return mkfailure<bool>(s);
write(content(s), os);
@@ -153,27 +144,25 @@ const failable<bool> write(const value& v, ostream& os, const string& format) {
*/
const failable<value> read(istream& is, const string& format) {
if (format == "scheme") {
- return scheme::readValue(is);
+ return scheme::readValue(streamList(is));
}
if (format == "xml") {
- const value v = elementsToValues(readXML(streamList(is)));
- return v;
- }
- if (format == "json") {
- js::JSContext jscx;
- const failable<list<value> > fv = json::readJSON(streamList(is), jscx);
+ const failable<list<value> > fv = xml::readElements(streamList(is));
if (!hasContent(fv))
return mkfailure<value>(fv);
const value v = elementsToValues(content(fv));
return v;
}
+ if (format == "json") {
+ return json::readValue(streamList(is));
+ }
return mkfailure<value>(string("Unsupported database format: ") + format);
}
/**
* Post a new item to the database.
*/
-const failable<bool> post(const value& key, const value& val, FileDB& db) {
+const failable<bool> post(const value& key, const value& val, const FileDB& db) {
debug(key, "filedb::post::key");
debug(val, "filedb::post::value");
debug(db.name, "filedb::post::dbname");
@@ -197,7 +186,7 @@ const failable<bool> post(const value& key, const value& val, FileDB& db) {
/**
* Update an item in the database. If the item doesn't exist it is added.
*/
-const failable<bool> put(const value& key, const value& val, FileDB& db) {
+const failable<bool> put(const value& key, const value& val, const FileDB& db) {
debug(key, "filedb::put::key");
debug(val, "filedb::put::value");
debug(db.name, "filedb::put::dbname");
@@ -221,7 +210,7 @@ const failable<bool> put(const value& key, const value& val, FileDB& db) {
/**
* Get an item from the database.
*/
-const failable<value> get(const value& key, FileDB& db) {
+const failable<value> get(const value& key, const FileDB& db) {
debug(key, "filedb::get::key");
debug(db.name, "filedb::get::dbname");
@@ -242,7 +231,7 @@ const failable<value> get(const value& key, FileDB& db) {
/**
* Delete an item from the database
*/
-const failable<bool> del(const value& key, FileDB& db) {
+const failable<bool> del(const value& key, const FileDB& db) {
debug(key, "filedb::delete::key");
debug(db.name, "filedb::delete::dbname");