summaryrefslogtreecommitdiffstats
path: root/sca-cpp/trunk/components
diff options
context:
space:
mode:
authorjsdelfino <jsdelfino@13f79535-47bb-0310-9956-ffa450edef68>2011-08-28 02:50:02 +0000
committerjsdelfino <jsdelfino@13f79535-47bb-0310-9956-ffa450edef68>2011-08-28 02:50:02 +0000
commit29edc4e6fb2c8fb3a93aac36d9666efd21b92bd0 (patch)
tree2b1998d904a16cdce69f69041c89cc56d474e69e /sca-cpp/trunk/components
parentd93ec216d63aed8ff2f08b4cba7de965dc14639c (diff)
Implement a portable alternative to __thread and get the HTTP and SQLDB components and the Auth modules working with the HTTPD multithreaded event MPM.
git-svn-id: http://svn.us.apache.org/repos/asf/tuscany@1162472 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'sca-cpp/trunk/components')
-rw-r--r--sca-cpp/trunk/components/http/httpdelete.cpp15
-rw-r--r--sca-cpp/trunk/components/http/httpget.cpp17
-rw-r--r--sca-cpp/trunk/components/http/httppatch.cpp16
-rw-r--r--sca-cpp/trunk/components/http/httppost.cpp16
-rw-r--r--sca-cpp/trunk/components/http/httpput.cpp16
-rw-r--r--sca-cpp/trunk/components/sqldb/sqldb.cpp32
6 files changed, 85 insertions, 27 deletions
diff --git a/sca-cpp/trunk/components/http/httpdelete.cpp b/sca-cpp/trunk/components/http/httpdelete.cpp
index 5386ba588f..5f3f8ead11 100644
--- a/sca-cpp/trunk/components/http/httpdelete.cpp
+++ b/sca-cpp/trunk/components/http/httpdelete.cpp
@@ -48,28 +48,35 @@ const failable<value> get(const lambda<value(const list<value>&)> url, http::CUR
*/
class applyhttp {
public:
- applyhttp(const lambda<value(const list<value>&)> url, http::CURLSession& ch) : url(url), ch(ch) {
+ applyhttp(const lambda<value(const list<value>&)> url, const perthread_ptr<http::CURLSession>& ch) : url(url), ch(ch) {
}
const value operator()(const list<value>& params) const {
debug(params, "httpdelete::applyhttp::params");
const value func(car(params));
if (func == "get")
- return get(url, ch);
+ return get(url, *ch);
return tuscany::mkfailure<tuscany::value>();
}
private:
const lambda<value(const list<value>&)> url;
- http::CURLSession& ch;
+ perthread_ptr<http::CURLSession> ch;
};
/**
+ * Create a new CURL session.
+ */
+const gc_ptr<http::CURLSession> newsession() {
+ return new (gc_new<http::CURLSession>()) http::CURLSession("", "", "", "");
+}
+
+/**
* Start the component.
*/
const failable<value> start(const list<value>& params) {
// Create a CURL session
- http::CURLSession& ch = *(new (gc_new<http::CURLSession>()) http::CURLSession("", "", "", ""));
+ const perthread_ptr<http::CURLSession> ch = perthread_ptr<http::CURLSession>(lambda<gc_ptr<http::CURLSession>()>(newsession));
// Return the component implementation lambda function
return value(lambda<value(const list<value>&)>(applyhttp(car(params), ch)));
diff --git a/sca-cpp/trunk/components/http/httpget.cpp b/sca-cpp/trunk/components/http/httpget.cpp
index ac7a99775b..fc89784749 100644
--- a/sca-cpp/trunk/components/http/httpget.cpp
+++ b/sca-cpp/trunk/components/http/httpget.cpp
@@ -28,6 +28,7 @@
#include "list.hpp"
#include "value.hpp"
#include "monad.hpp"
+#include "parallel.hpp"
#include "../../modules/http/http.hpp"
namespace tuscany {
@@ -48,28 +49,36 @@ const failable<value> get(const lambda<value(const list<value>&)> url, http::CUR
*/
class applyhttp {
public:
- applyhttp(const lambda<value(const list<value>&)> url, http::CURLSession& ch) : url(url), ch(ch) {
+ applyhttp(const lambda<value(const list<value>&)> url, const perthread_ptr<http::CURLSession>& ch) : url(url), ch(ch) {
}
const value operator()(const list<value>& params) const {
debug(params, "httpget::applyhttp::params");
const value func(car(params));
if (func == "get")
- return get(url, ch);
+ return get(url, *ch);
return tuscany::mkfailure<tuscany::value>();
}
private:
const lambda<value(const list<value>&)> url;
- http::CURLSession& ch;
+ perthread_ptr<http::CURLSession> ch;
};
+
+/**
+ * Create a new CURL session.
+ */
+const gc_ptr<http::CURLSession> newsession() {
+ return new (gc_new<http::CURLSession>()) http::CURLSession("", "", "", "");
+}
+
/**
* Start the component.
*/
const failable<value> start(const list<value>& params) {
// Create a CURL session
- http::CURLSession& ch = *(new (gc_new<http::CURLSession>()) http::CURLSession("", "", "", ""));
+ const perthread_ptr<http::CURLSession> ch = perthread_ptr<http::CURLSession>(lambda<gc_ptr<http::CURLSession>()>(newsession));
// Return the component implementation lambda function
return value(lambda<value(const list<value>&)>(applyhttp(car(params), ch)));
diff --git a/sca-cpp/trunk/components/http/httppatch.cpp b/sca-cpp/trunk/components/http/httppatch.cpp
index 4debca045e..ef72537185 100644
--- a/sca-cpp/trunk/components/http/httppatch.cpp
+++ b/sca-cpp/trunk/components/http/httppatch.cpp
@@ -28,6 +28,7 @@
#include "list.hpp"
#include "value.hpp"
#include "monad.hpp"
+#include "parallel.hpp"
#include "../../modules/http/http.hpp"
namespace tuscany {
@@ -50,29 +51,36 @@ const failable<value> get(const lambda<value(const list<value>&)> url, const lam
*/
class applyhttp {
public:
- applyhttp(const lambda<value(const list<value>&)> url, const lambda<value(const list<value>&)> val, http::CURLSession& ch) : url(url), val(val), ch(ch) {
+ applyhttp(const lambda<value(const list<value>&)> url, const lambda<value(const list<value>&)> val, const perthread_ptr<http::CURLSession>& ch) : url(url), val(val), ch(ch) {
}
const value operator()(const list<value>& params) const {
debug(params, "httppatch::applyhttp::params");
const value func(car(params));
if (func == "get")
- return get(url, val, ch);
+ return get(url, val, *ch);
return tuscany::mkfailure<tuscany::value>();
}
private:
const lambda<value(const list<value>&)> url;
const lambda<value(const list<value>&)> val;
- http::CURLSession& ch;
+ perthread_ptr<http::CURLSession> ch;
};
/**
+ * Create a new CURL session.
+ */
+const gc_ptr<http::CURLSession> newsession() {
+ return new (gc_new<http::CURLSession>()) http::CURLSession("", "", "", "");
+}
+
+/**
* Start the component.
*/
const failable<value> start(const list<value>& params) {
// Create a CURL session
- http::CURLSession& ch = *(new (gc_new<http::CURLSession>()) http::CURLSession("", "", "", ""));
+ const perthread_ptr<http::CURLSession> ch = perthread_ptr<http::CURLSession>(lambda<gc_ptr<http::CURLSession>()>(newsession));
// Return the component implementation lambda function
return value(lambda<value(const list<value>&)>(applyhttp(car(params), cadr(params), ch)));
diff --git a/sca-cpp/trunk/components/http/httppost.cpp b/sca-cpp/trunk/components/http/httppost.cpp
index 9784c4513c..0879ad2e59 100644
--- a/sca-cpp/trunk/components/http/httppost.cpp
+++ b/sca-cpp/trunk/components/http/httppost.cpp
@@ -28,6 +28,7 @@
#include "list.hpp"
#include "value.hpp"
#include "monad.hpp"
+#include "parallel.hpp"
#include "../../modules/http/http.hpp"
namespace tuscany {
@@ -50,29 +51,36 @@ const failable<value> get(const lambda<value(const list<value>&)> url, const lam
*/
class applyhttp {
public:
- applyhttp(const lambda<value(const list<value>&)> url, const lambda<value(const list<value>&)> val, http::CURLSession& ch) : url(url), val(val), ch(ch) {
+ applyhttp(const lambda<value(const list<value>&)> url, const lambda<value(const list<value>&)> val, const perthread_ptr<http::CURLSession>& ch) : url(url), val(val), ch(ch) {
}
const value operator()(const list<value>& params) const {
debug(params, "httppost::applyhttp::params");
const value func(car(params));
if (func == "get")
- return get(url, val, ch);
+ return get(url, val, *ch);
return tuscany::mkfailure<tuscany::value>();
}
private:
const lambda<value(const list<value>&)> url;
const lambda<value(const list<value>&)> val;
- http::CURLSession& ch;
+ perthread_ptr<http::CURLSession> ch;
};
/**
+ * Create a new CURL session.
+ */
+const gc_ptr<http::CURLSession> newsession() {
+ return new (gc_new<http::CURLSession>()) http::CURLSession("", "", "", "");
+}
+
+/**
* Start the component.
*/
const failable<value> start(const list<value>& params) {
// Create a CURL session
- http::CURLSession& ch = *(new (gc_new<http::CURLSession>()) http::CURLSession("", "", "", ""));
+ const perthread_ptr<http::CURLSession> ch = perthread_ptr<http::CURLSession>(lambda<gc_ptr<http::CURLSession>()>(newsession));
// Return the component implementation lambda function
return value(lambda<value(const list<value>&)>(applyhttp(car(params), cadr(params), ch)));
diff --git a/sca-cpp/trunk/components/http/httpput.cpp b/sca-cpp/trunk/components/http/httpput.cpp
index 4ec63dabce..1eef0bef48 100644
--- a/sca-cpp/trunk/components/http/httpput.cpp
+++ b/sca-cpp/trunk/components/http/httpput.cpp
@@ -28,6 +28,7 @@
#include "list.hpp"
#include "value.hpp"
#include "monad.hpp"
+#include "parallel.hpp"
#include "../../modules/http/http.hpp"
namespace tuscany {
@@ -50,29 +51,36 @@ const failable<value> get(const lambda<value(const list<value>&)> url, const lam
*/
class applyhttp {
public:
- applyhttp(const lambda<value(const list<value>&)> url, const lambda<value(const list<value>&)> val, http::CURLSession& ch) : url(url), val(val), ch(ch) {
+ applyhttp(const lambda<value(const list<value>&)> url, const lambda<value(const list<value>&)> val, const perthread_ptr<http::CURLSession>& ch) : url(url), val(val), ch(ch) {
}
const value operator()(const list<value>& params) const {
debug(params, "httpput::applyhttp::params");
const value func(car(params));
if (func == "get")
- return get(url, val, ch);
+ return get(url, val, *ch);
return tuscany::mkfailure<tuscany::value>();
}
private:
const lambda<value(const list<value>&)> url;
const lambda<value(const list<value>&)> val;
- http::CURLSession& ch;
+ perthread_ptr<http::CURLSession> ch;
};
/**
+ * Create a new CURL session.
+ */
+const gc_ptr<http::CURLSession> newsession() {
+ return new (gc_new<http::CURLSession>()) http::CURLSession("", "", "", "");
+}
+
+/**
* Start the component.
*/
const failable<value> start(const list<value>& params) {
// Create a CURL session
- http::CURLSession& ch = *(new (gc_new<http::CURLSession>()) http::CURLSession("", "", "", ""));
+ const perthread_ptr<http::CURLSession> ch = perthread_ptr<http::CURLSession>(lambda<gc_ptr<http::CURLSession>()>(newsession));
// Return the component implementation lambda function
return value(lambda<value(const list<value>&)>(applyhttp(car(params), cadr(params), ch)));
diff --git a/sca-cpp/trunk/components/sqldb/sqldb.cpp b/sca-cpp/trunk/components/sqldb/sqldb.cpp
index 0524b00bd2..fa82c0ee9f 100644
--- a/sca-cpp/trunk/components/sqldb/sqldb.cpp
+++ b/sca-cpp/trunk/components/sqldb/sqldb.cpp
@@ -28,6 +28,7 @@
#include "list.hpp"
#include "value.hpp"
#include "monad.hpp"
+#include "parallel.hpp"
#include "pgsql.hpp"
namespace tuscany {
@@ -76,24 +77,41 @@ const failable<value> del(const list<value>& params, pgsql::PGSql& pg) {
*/
class applySqldb {
public:
- applySqldb(pgsql::PGSql& pg) : pg(pg) {
+ applySqldb(const perthread_ptr<pgsql::PGSql>& pg) : pg(pg) {
}
const value operator()(const list<value>& params) const {
const value func(car(params));
if (func == "get")
- return get(cdr(params), pg);
+ return get(cdr(params), *pg);
if (func == "post")
- return post(cdr(params), pg);
+ return post(cdr(params), *pg);
if (func == "put")
- return put(cdr(params), pg);
+ return put(cdr(params), *pg);
if (func == "delete")
- return del(cdr(params), pg);
+ return del(cdr(params), *pg);
return tuscany::mkfailure<tuscany::value>();
}
private:
- pgsql::PGSql& pg;
+ const perthread_ptr<pgsql::PGSql> pg;
+};
+
+/**
+ * Lambda function that creates a new database connection.
+ */
+class newPGSql {
+public:
+ newPGSql(const string& conninfo, const string& table) : conninfo(conninfo), table(table) {
+ }
+
+ const gc_ptr<pgsql::PGSql> operator()() const {
+ return new (gc_new<pgsql::PGSql>()) pgsql::PGSql(conninfo, table);
+ }
+
+private:
+ const string conninfo;
+ const string table;
};
/**
@@ -103,7 +121,7 @@ const failable<value> start(unused const list<value>& params) {
// Connect to the configured database and table
const value conninfo = ((lambda<value(list<value>)>)car(params))(list<value>());
const value table = ((lambda<value(list<value>)>)cadr(params))(list<value>());
- pgsql::PGSql& pg = *(new (gc_new<pgsql::PGSql>()) pgsql::PGSql(conninfo, table));
+ const perthread_ptr<pgsql::PGSql> pg(lambda<gc_ptr<pgsql::PGSql>()>(newPGSql(conninfo, table)));
// Return the component implementation lambda function
return value(lambda<value(const list<value>&)>(applySqldb(pg)));