--- parser3/src/include/pa_sql_connection.h 2001/11/05 11:46:25 1.19 +++ parser3/src/include/pa_sql_connection.h 2002/02/08 07:27:45 1.22 @@ -1,16 +1,15 @@ /** @file Parser: sql fconnection decl. - Copyright (c) 2001 ArtLebedev Group (http://www.artlebedev.com) + Copyright (c) 2001, 2002 ArtLebedev Group (http://www.artlebedev.com) Author: Alexander Petrosyan (http://paf.design.ru) - $Id: pa_sql_connection.h,v 1.19 2001/11/05 11:46:25 paf Exp $ + $Id: pa_sql_connection.h,v 1.22 2002/02/08 07:27:45 paf Exp $ */ #ifndef PA_SQL_CONNECTION_H #define PA_SQL_CONNECTION_H -#include "pa_config_includes.h" #include "pa_pool.h" #include "pa_sql_driver.h" #include "pa_sql_driver_manager.h" @@ -27,29 +26,27 @@ /// 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), fconnection(0), - time_stamp(0) { + time_used(0), used(0), + marked_to_rollback(false) { } const String& get_url() { return furl; } void set_services(SQL_Driver_services *aservices) { - time_stamp=time(0); // they started to use at this time fservices=aservices; } bool expired(time_t older_dies) { - return time_stampclose_connection(furl, *this); + 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: @@ -100,7 +129,39 @@ private: SQL_Driver& fdriver; SQL_Driver_services *fservices; void *fconnection; - time_t time_stamp; + 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