--- parser3/src/classes/Attic/root.C 2001/04/04 06:16:18 1.56 +++ parser3/src/classes/Attic/root.C 2001/04/05 13:19:40 1.60 @@ -5,7 +5,7 @@ Author: Alexander Petrosyan (http://design.ru/paf) - $Id: root.C,v 1.56 2001/04/04 06:16:18 paf Exp $ + $Id: root.C,v 1.60 2001/04/05 13:19:40 paf Exp $ */ #include "pa_config_includes.h" @@ -15,6 +15,7 @@ #include "pa_request.h" #include "_root.h" #include "pa_vint.h" +#include "pa_sql_connection.h" static void _if(Request& r, const String& method_name, Array *params) { Value& condition_code=*static_cast(params->get(0)); @@ -79,15 +80,13 @@ static void _taint(Request& r, const Str } { - Value *vbody=static_cast(params->get(params->size()-1)); - // forcing {this param type} - r.fail_if_junction_(true, *vbody, method_name, "body must not be junction"); + Value& vbody=*static_cast(params->get(params->size()-1)); + // forcing [this param type] + r.fail_if_junction_(true, vbody, method_name, "body must not be junction"); - // set temporarily as-is language - Temp_lang temp_lang(r, String::UL_PASS_APPENDED); String result(r.pool()); result.append( - r.process(*vbody).as_string(), // process marking tainted with that lang + vbody.as_string(), // process marking tainted with that lang lang, true); // force result language to specified r.write_pass_lang(result); } @@ -283,37 +282,49 @@ static void _sign(Request& r, const Stri static void _connect(Request& r, const String& method_name, Array *params) { Pool& pool=r.pool(); - Value& connect_string=*static_cast(params->get(0)); - r.fail_if_junction_(true, connect_string, - method_name, "connect string must not be junction"); + Value& url=*static_cast(params->get(0)); + r.fail_if_junction_(true, url, + method_name, "url must not be junction"); Value& body_code=*static_cast(params->get(1)); r.fail_if_junction_(false, body_code, method_name, "body must be junction"); - // remember/set current connection - const String *saved_connection=r.connection; - r.connection=&connect_string.as_string(); + // connect + SQL_Connection& connection=SQL_driver_manager->get_connection( + url.as_string(), r.protocol2library); - bool need_rethrow=false; Exception rethrow_me; - PTRY { + Exception rethrow_me; + // remember/set current connection + SQL_Connection *saved_connection=r.connection; + r.connection=&connection; + // execute body + bool body_failed=false; + PTRY r.write_assign_lang(r.process(body_code)); - } PCATCH(e) { // connect/process problem - rethrow_me=e; need_rethrow=true; + rethrow_me=e; body_failed=true; } PEND_CATCH - // FINALLY - if(need_rethrow) - ;//rollback - else - ;//commit - + bool finalizer_failed=false; + PTRY + // FINALLY + if(body_failed) + connection.rollback(); + else + connection.commit(); + PCATCH(e) { // commit/rollback problem + rethrow_me=e; finalizer_failed=true; + } + PEND_CATCH + + // close connection [cache it] + connection.close(); // recall current connection from remembered r.connection=saved_connection; - if(need_rethrow) // were there an exception for us to rethrow? + if(body_failed || finalizer_failed) // were there an exception for us to rethrow? PTHROW(rethrow_me.type(), rethrow_me.code(), rethrow_me.problem_source(), rethrow_me.comment());