--- parser3/src/include/pa_sql_connection.h 2001/04/05 11:01:55 1.2 +++ parser3/src/include/pa_sql_connection.h 2002/08/01 11:41:16 1.26 @@ -1,64 +1,168 @@ /** @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.2 2001/04/05 11:01:55 paf Exp $ + Copyright (c) 2001, 2002 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: 2002/08/01 11:41:16 $"; + #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 +#define SQL_CONNECTION_SERVICED_FUNC_GUARDED(actions) \ + if(!fservices || !setjmp(fservices->mark)) { \ + actions; \ + } else \ + fservices->propagate_exception(); -/// sql connection +/// SQL connection. handy wrapper around low level SQL_Driver class SQL_Connection : public Pooled { + friend class SQL_Connection_ptr; + public: - void set_services(Services_for_SQL_driver *services) { - fdriver.set_services(services); + SQL_Connection(Pool& pool, const String& aurl, SQL_Driver& adriver) : Pooled(pool), + furl(aurl), + fdriver(adriver), + fconnection(0), + time_used(0), used(0), + marked_to_rollback(false) { } + + const String& 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 !used && time_usedclose_connection(furl, *this); } - void disconnect() { fdriver.disconnect(connection); } - void commit() { fdriver.commit(connection); } - void rollback() { fdriver.rollback(connection); } - void query( - const char *statement, - unsigned int *column_count, SQL_Driver::Cell **columns, - unsigned long *row_count, SQL_Driver::Cell ***rows) { - fdriver.query(connection, - statement, - column_count, columns, - row_count, rows); +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: - SQL_Driver& fdriver; - void *connection; const String& furl; + 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