diff options
author | jsdelfino <jsdelfino@13f79535-47bb-0310-9956-ffa450edef68> | 2011-08-28 02:50:02 +0000 |
---|---|---|
committer | jsdelfino <jsdelfino@13f79535-47bb-0310-9956-ffa450edef68> | 2011-08-28 02:50:02 +0000 |
commit | 29edc4e6fb2c8fb3a93aac36d9666efd21b92bd0 (patch) | |
tree | 2b1998d904a16cdce69f69041c89cc56d474e69e /sca-cpp/trunk/components | |
parent | d93ec216d63aed8ff2f08b4cba7de965dc14639c (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.cpp | 15 | ||||
-rw-r--r-- | sca-cpp/trunk/components/http/httpget.cpp | 17 | ||||
-rw-r--r-- | sca-cpp/trunk/components/http/httppatch.cpp | 16 | ||||
-rw-r--r-- | sca-cpp/trunk/components/http/httppost.cpp | 16 | ||||
-rw-r--r-- | sca-cpp/trunk/components/http/httpput.cpp | 16 | ||||
-rw-r--r-- | sca-cpp/trunk/components/sqldb/sqldb.cpp | 32 |
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))); |