--- parser3/src/include/pa_sql_connection.h 2001/05/17 13:23:28 1.9 +++ parser3/src/include/pa_sql_connection.h 2003/01/21 15:51:11 1.30 @@ -1,59 +1,143 @@ /** @file 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.9 2001/05/17 13:23:28 parser 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 -#include "pa_config_includes.h" +static const char* IDENT_SQL_CONNECTION_H="$Date: 2003/01/21 15:51:11 $"; + #include "pa_pool.h" #include "pa_sql_driver.h" #include "pa_sql_driver_manager.h" -/// SQL fconnection. handy wrapper around low level SQL_Driver +// 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. handy wrapper around low level SQL_Driver class SQL_Connection : public Pooled { + friend class SQL_Connection_ptr; + public: SQL_Connection(Pool& pool, const String& aurl, SQL_Driver& adriver) : Pooled(pool), furl(aurl), - fdriver(adriver) { + fdriver(adriver), + fconnection(0), + time_used(0), used(0), + marked_to_rollback(false) { } + + const String& get_url() { return furl; } + void set_services(SQL_Driver_services *aservices) { fservices=aservices; } - - void close() { - SQL_driver_manager->close_connection(furl, *this); + bool expired(time_t older_dies) { + return !used && time_usedclose_connection(furl, *this); } +private: // connection usage methods + + void use() { + time_used=time(0); // they started to use at this time + used++; + } + void unuse() { + used--; + if(!used) + close(); + } + +private: // connection usage data + + int used; private: @@ -61,6 +145,39 @@ private: SQL_Driver& fdriver; SQL_Driver_services *fservices; void *fconnection; + time_t time_used; + bool marked_to_rollback; +}; + +/// Auto-object used to track SQL_Connection usage +class SQL_Connection_ptr { + SQL_Connection *fconnection; +public: + explicit SQL_Connection_ptr(SQL_Connection *aconnection) : fconnection(aconnection) { + fconnection->use(); + } + ~SQL_Connection_ptr() { + fconnection->unuse(); + } + SQL_Connection* operator->() { + return fconnection; + } + SQL_Connection* get() const { + return fconnection; + } + + // copying + SQL_Connection_ptr(const SQL_Connection_ptr& src) : fconnection(src.fconnection) { + fconnection->use(); + } + SQL_Connection_ptr& operator =(const SQL_Connection_ptr& src) { + // may do without this=src check + fconnection->unuse(); + fconnection=src.fconnection; + fconnection->use(); + + return *this; + } }; #endif