--- parser3/src/include/pa_sql_connection.h 2002/08/01 11:41:16 1.26 +++ parser3/src/include/pa_sql_connection.h 2003/01/27 16:00:41 1.30.2.1 @@ -1,14 +1,14 @@ /** @file Parser: sql fconnection decl. - Copyright (c) 2001, 2002 ArtLebedev Group (http://www.artlebedev.com) + 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: 2002/08/01 11:41:16 $"; +static const char* IDENT_SQL_CONNECTION_H="$Date: 2003/01/27 16:00:41 $"; #include "pa_pool.h" #include "pa_sql_driver.h" @@ -17,20 +17,22 @@ static const char* IDENT_SQL_CONNECTION_ // defines /// @see SQL_Driver_services_impl::_throw -#define SQL_CONNECTION_SERVICED_FUNC_GUARDED(actions) \ - if(!fservices || !setjmp(fservices->mark)) { \ - actions; \ - } else \ - fservices->propagate_exception(); +#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; +class SQL_Connection: public PA_Object { public: - SQL_Connection(Pool& pool, const String& aurl, SQL_Driver& adriver) : Pooled(pool), + SQL_Connection(ConstStringPtr aurl, SQL_Driver& adriver) : Pooled(pool), furl(aurl), fdriver(adriver), fconnection(0), @@ -72,12 +74,23 @@ public: void query( const char *statement, unsigned long offset, unsigned long limit, - SQL_Driver_query_event_handlers& handlers) { - SQL_CONNECTION_SERVICED_FUNC_GUARDED( - fdriver.query(*fservices, fconnection, - statement, offset, limit, - handlers) - ); + SQL_Driver_query_event_handlers& handlers, + const String& 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() { @@ -108,22 +121,6 @@ private: // closing process SQL_driver_manager->close_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: const String& furl; @@ -134,35 +131,4 @@ private: 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