|
|
| version 1.78, 2003/12/11 09:22:09 | version 1.82, 2004/02/11 15:33:16 |
|---|---|
| Line 1 | Line 1 |
| /** @file | /** @file |
| Parser: sql driver manager implementation. | Parser: sql driver manager implementation. |
| Copyright (c) 2001-2003 ArtLebedev Group (http://www.artlebedev.com) | Copyright (c) 2001-2004 ArtLebedev Group (http://www.artlebedev.com) |
| Author: Alexandr Petrosian <paf@design.ru> (http://paf.design.ru) | Author: Alexandr Petrosian <paf@design.ru> (http://paf.design.ru) |
| */ | */ |
| Line 15 static const char * const IDENT_SQL_DRIV | Line 15 static const char * const IDENT_SQL_DRIV |
| #include "pa_common.h" | #include "pa_common.h" |
| #include "pa_vhash.h" | #include "pa_vhash.h" |
| #include "pa_vtable.h" | #include "pa_vtable.h" |
| #include "pa_charsets.h" | |
| // globals | // globals |
| Line 38 const String& SQL_Driver_services_impl:: | Line 39 const String& SQL_Driver_services_impl:: |
| return result; | return result; |
| } | } |
| void SQL_Driver_services_impl::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 | |
| ) | |
| { | |
| try { | |
| String::C result=Charset::transcode(String::C(src, src_length), | |
| charsets.get(charset_from_name), | |
| charsets.get(charset_to_name)); | |
| dst=result.str; | |
| dst_length=result.length; | |
| } catch(const Exception& e) { | |
| _throw(SQL_Error(e.type(), e.comment())); | |
| } catch(...) { | |
| _throw(SQL_Error(0, "unknown error while transcoding in sql driver")); | |
| } | |
| } | |
| // helpers | // helpers |
| static void expire_connection(SQL_Connection& connection, time_t older_dies) { | static void expire_connection(SQL_Connection& connection, time_t older_dies) { |
| Line 58 SQL_Driver_manager::SQL_Driver_manager() | Line 78 SQL_Driver_manager::SQL_Driver_manager() |
| } | } |
| SQL_Driver_manager::~SQL_Driver_manager() { | SQL_Driver_manager::~SQL_Driver_manager() { |
| connection_cache.for_each(expire_connections, time(0)+(time_t)1/*=in future=expire all*/); | connection_cache.for_each(expire_connections, time(0)+(time_t)10/*=in future=expire all*/); |
| if(is_dlinited) | if(is_dlinited) |
| lt_dlexit(); | lt_dlexit(); |
| Line 66 SQL_Driver_manager::~SQL_Driver_manager( | Line 86 SQL_Driver_manager::~SQL_Driver_manager( |
| /// @param aurl protocol://[driver-dependent] | /// @param aurl protocol://[driver-dependent] |
| SQL_Connection* SQL_Driver_manager::get_connection(const String& aurl, | SQL_Connection* SQL_Driver_manager::get_connection(const String& aurl, |
| Table *protocol2driver_and_client) { | Table *protocol2driver_and_client, |
| const char* arequest_charset) { | |
| // we have table for locating protocol's library | // we have table for locating protocol's library |
| if(!protocol2driver_and_client) | if(!protocol2driver_and_client) |
| throw Exception("parser.runtime", | throw Exception("parser.runtime", |
| Line 131 SQL_Connection* SQL_Driver_manager::get_ | Line 152 SQL_Connection* SQL_Driver_manager::get_ |
| const char* filename=library->cstr(String::L_FILE_SPEC); | const char* filename=library->cstr(String::L_FILE_SPEC); |
| lt_dlhandle handle=lt_dlopen(filename); | lt_dlhandle handle=lt_dlopen(filename); |
| if (!handle) | if (!handle) { |
| const char* error=lt_dlerror(); | |
| throw Exception(0, | throw Exception(0, |
| library, | library, |
| "can not open the module, %s", lt_dlerror()); | error?error:"can not open the module"); |
| } | |
| SQL_Driver_create_func create=(SQL_Driver_create_func)lt_dlsym(handle, | SQL_Driver_create_func create=(SQL_Driver_create_func)lt_dlsym(handle, |
| SQL_DRIVER_CREATE_NAME); | SQL_DRIVER_CREATE_NAME); |
| Line 169 SQL_Connection* SQL_Driver_manager::get_ | Line 192 SQL_Connection* SQL_Driver_manager::get_ |
| put_driver_to_cache(protocol, driver); | put_driver_to_cache(protocol, driver); |
| } | } |
| connection=new SQL_Connection(aurl, *driver); | connection=new SQL_Connection(aurl, *driver, arequest_charset); |
| // associate with pool[request] (deassociates at close) | // associate with pool[request] (deassociates at close) |
| connection->set_url(); | connection->set_url(); |
| } | } |