--- parser3/src/include/pa_sql_connection.h 2003/11/20 15:35:30 1.32 +++ parser3/src/include/pa_sql_connection.h 2026/04/25 13:38:46 1.50 @@ -1,14 +1,14 @@ /** @file Parser: sql fconnection decl. - Copyright (c) 2001-2003 ArtLebedev Group (http://www.artlebedev.com) - Author: Alexandr Petrosian (http://paf.design.ru) + Copyright (c) 2001-2026 Art. Lebedev Studio (https://www.artlebedev.com) + Authors: Konstantin Morshnev , Alexandr Petrosian */ #ifndef PA_SQL_CONNECTION_H #define PA_SQL_CONNECTION_H -static const char* IDENT_SQL_CONNECTION_H="$Date: 2003/11/20 15:35:30 $"; +#define IDENT_PA_SQL_CONNECTION_H "$Id: pa_sql_connection.h,v 1.50 2026/04/25 13:38:46 moko Exp $" #include "pa_sql_driver.h" @@ -18,9 +18,12 @@ static const char* IDENT_SQL_CONNECTION_ /// @see SQL_Driver_services_impl::_throw #ifdef PA_WITH_SJLJ_EXCEPTIONS - #define SQL_CONNECTION_SERVICED_FUNC_GUARDED(actions) actions + #define SQL_CONNECTION_SERVICED_FUNC_GUARDED(actions) \ + use(); \ + actions #else #define SQL_CONNECTION_SERVICED_FUNC_GUARDED(actions) \ + use(); \ if(!setjmp(fservices.mark)) { \ actions; \ } else \ @@ -31,13 +34,25 @@ static const char* IDENT_SQL_CONNECTION_ class SQL_Driver_services_impl: public SQL_Driver_services { const String* furl; Exception fexception; + const char* frequest_charset; + const char* fdocument_root; public: - SQL_Driver_services_impl(): furl(0) {} + SQL_Driver_services_impl(const char* arequest_charset, const char* adocument_root): furl(0), frequest_charset(arequest_charset), fdocument_root(adocument_root) {} void set_url(const String& aurl) { furl=&aurl;} + const String& url_without_login() const; + + override void* malloc(size_t size) { return pa_malloc(size); } + override void* malloc_atomic(size_t size) { return pa_malloc_atomic(size); } + override void* realloc(void *ptr, size_t size) { return pa_realloc(ptr, size); } - override void *malloc(size_t size) { return pa_malloc(size); } - override void *malloc_atomic(size_t size) { return pa_malloc_atomic(size); } - override void *realloc(void *ptr, size_t size) { return pa_realloc(ptr, size); } + override const char* request_charset() { return frequest_charset; } + override const char* request_document_root() { return fdocument_root; } + + override void transcode(const char* src, size_t src_length, + const char*& dst, size_t& dst_length, + const char* charset_from_name, + const char* charset_to_name + ); /** normally we can't 'throw' from dynamic library, so @@ -49,7 +64,7 @@ public: one can simply 'throw' from dynamic library. [sad story: one can not longjump/throw due to some bug in gcc as of 3.2.1 version] */ - override void _throw(const SQL_Error& aexception) { + override void _throw(const SQL_Error& aexception) { // converting SQL_exception to parser Exception // hiding passwords and addresses from accidental show [imagine user forgot @exception] #ifdef PA_WITH_SJLJ_EXCEPTIONS @@ -57,22 +72,18 @@ public: #else fexception= #endif - Exception(aexception.type(), - &url_without_login(), - aexception.comment()); + Exception(aexception.type() ? aexception.type() : "sql.connect", &url_without_login(), aexception.comment()); #ifndef PA_WITH_SJLJ_EXCEPTIONS longjmp(mark, 1); #endif } + virtual void propagate_exception() { #ifndef PA_WITH_SJLJ_EXCEPTIONS throw fexception; #endif } - -private: - const String& url_without_login() const; }; /// SQL connection. handy wrapper around low level SQL_Driver @@ -82,17 +93,18 @@ class SQL_Connection: public PA_Object { SQL_Driver_services_impl fservices; void *fconnection; time_t time_used; - bool marked_to_rollback; public: - SQL_Connection(const String& aurl, SQL_Driver& adriver): + SQL_Connection(const String& aurl, SQL_Driver& adriver, const char* arequest_charset, const char* adocument_root): furl(aurl), fdriver(adriver), + fservices(arequest_charset, adocument_root), fconnection(0), - time_used(0), - marked_to_rollback(false) { + time_used(0) { } + + SQL_Driver_services_impl& services() { return fservices; } const String& get_url() { return furl; } @@ -103,7 +115,7 @@ public: time_used=time(0); // they started to use at this time } bool expired(time_t older_dies) { - return /*!freferences && */time_usedclose_connection(furl, this); } };