--- parser3/src/include/pa_sql_connection.h 2001/04/05 08:09:21 1.1 +++ parser3/src/include/pa_sql_connection.h 2003/01/27 16:19:11 1.30.2.2 @@ -1,54 +1,134 @@ /** @file - Parser: sql connection decl. + Parser: sql fconnection decl. - Copyright (c) 2001 ArtLebedev Group (http://www.artlebedev.com) - - Author: Alexander Petrosyan (http://design.ru/paf) - - $Id: pa_sql_connection.h,v 1.1 2001/04/05 08:09:21 paf Exp $ + Copyright (c) 2001, 2003 ArtLebedev Group (http://www.artlebedev.com) + Author: Alexandr Petrosian (http://paf.design.ru) */ #ifndef PA_SQL_CONNECTION_H #define PA_SQL_CONNECTION_H +static const char* IDENT_SQL_CONNECTION_H="$Date: 2003/01/27 16:19:11 $"; + #include "pa_pool.h" #include "pa_sql_driver.h" -#include "pa_exception.h" +#include "pa_sql_driver_manager.h" + +// defines + +/// @see SQL_Driver_services_impl::_throw +#ifdef PA_WITH_SJLJ_EXCEPTIONS + #define SQL_CONNECTION_SERVICED_FUNC_GUARDED(actions) actions +#else + #define SQL_CONNECTION_SERVICED_FUNC_GUARDED(actions) \ + if(!fservices || !setjmp(fservices->mark)) { \ + actions; \ + } else \ + fservices->propagate_exception(); +#endif -/// sql connection -class SQL_Connection : public Pooled { +/// SQL connection. handy wrapper around low level SQL_Driver +class SQL_Connection: public PA_Object { public: - void set_services(Services_for_SQL_driver *services) { - fdriver.set_services(services); + SQL_Connection(ConstStringPtr aurl, SQL_Driver& adriver): + furl(aurl), + fdriver(adriver), + fconnection(0), + time_used(0), + marked_to_rollback(false) { } + + ConstStringPtr get_url() { return furl; } - SQL_Connection(Pool& pool, - const String& aurl, - SQL_Driver& adriver, Services_for_SQL_driver& services, - char *url_cstr) : Pooled(pool), - furl(aurl), - fdriver(adriver) { + void set_services(SQL_Driver_services *aservices) { + fservices=aservices; + } + bool expired(time_t older_dies) { + return /*!freferences && */time_usedclose_connection(furl, *this); + void query( + const char *statement, unsigned long offset, unsigned long limit, + SQL_Driver_query_event_handlers& handlers, + ConstStringPtr source) { + try { + SQL_CONNECTION_SERVICED_FUNC_GUARDED( + fdriver.query(*fservices, fconnection, + statement, offset, limit, + handlers) + ); + } catch(const Exception& e) { // query problem + if(strcmp(e.type(), "sql.connect")==0) { // if it is _throw exception, + // give more specific source [were url] + throw Exception("sql.execute", + source, + "%s", e.comment()); + } else + /*re*/throw; + } + } + + void mark_to_rollback() { + marked_to_rollback=true; } - void disconnect() { fdriver.disconnect(info); } - void commit() { fdriver.commit(info); } - void rollback() { fdriver.rollback(info); } +private: // closing process + + void commit() { + SQL_CONNECTION_SERVICED_FUNC_GUARDED( + fdriver.commit(*fservices, fconnection) + ); + } + void rollback() { + SQL_CONNECTION_SERVICED_FUNC_GUARDED( + fdriver.rollback(*fservices, fconnection) + ); + } + + /// return to cache + void close() { + if(marked_to_rollback) { + rollback(); + marked_to_rollback=false; + } else + commit(); + + SQL_driver_manager.close_connection(furl, *this); + } private: + ConstStringPtr furl; SQL_Driver& fdriver; - void *info; - const String& furl; + SQL_Driver_services *fservices; + void *fconnection; + time_t time_used; + bool marked_to_rollback; }; #endif