|
|
| version 1.19, 2001/05/17 18:43:06 | version 1.29, 2001/08/28 10:43:33 |
|---|---|
| Line 4 | Line 4 |
| Copyright (c) 2001 ArtLebedev Group (http://www.artlebedev.com) | Copyright (c) 2001 ArtLebedev Group (http://www.artlebedev.com) |
| Author: Alexander Petrosyan <paf@design.ru> (http://design.ru/paf) | Author: Alexander Petrosyan <paf@design.ru> (http://design.ru/paf) |
| $Id$ | |
| */ | */ |
| static const char *RCSId="$Id$"; | |
| #include "pa_sql_driver_manager.h" | #include "pa_sql_driver_manager.h" |
| #include "ltdl.h" | #include "ltdl.h" |
| Line 55 private: | Line 54 private: |
| /// @param request_url protocol://[driver-dependent] | /// @param request_url protocol://[driver-dependent] |
| SQL_Connection& SQL_Driver_manager::get_connection(const String& request_url, | SQL_Connection& SQL_Driver_manager::get_connection(const String& request_url, |
| Table *protocol2driver_and_client) { | Table *protocol2driver_and_client) { |
| ////__asm int 3; | |
| Pool& pool=request_url.pool(); // request pool | Pool& pool=request_url.pool(); // request pool |
| // we have table for locating protocol's library | // we have table for locating protocol's library |
| Line 111 SQL_Connection& SQL_Driver_manager::get_ | Line 109 SQL_Connection& SQL_Driver_manager::get_ |
| protocol2driver_and_client->origin_string(), | protocol2driver_and_client->origin_string(), |
| "driver library column for protocol '%s' is empty", | "driver library column for protocol '%s' is empty", |
| request_protocol_cstr); | request_protocol_cstr); |
| if(!(dlopen_file_spec=protocol2driver_and_client->item(2)) || dlopen_file_spec->size()==0) | dlopen_file_spec=protocol2driver_and_client->item(2); |
| PTHROW(0, 0, | |
| protocol2driver_and_client->origin_string(), | |
| "client library column for protocol '%s' is empty", | |
| request_protocol_cstr); | |
| } else | } else |
| PTHROW(0, 0, | PTHROW(0, 0, |
| &request_url, | &request_url, |
| "undefined protocol '%s'", | "undefined protocol '%s'", |
| request_protocol_cstr); | request_protocol_cstr); |
| if(lt_dlinit()) | |
| PTHROW(0, 0, | |
| library, | |
| "prepare to dynamic loading failed, %s", lt_dlerror()); | |
| const char *filename=library->cstr(String::UL_FILE_NAME); | const char *filename=library->cstr(String::UL_FILE_NAME); |
| lt_dlhandle handle=lt_dlopen(filename); | lt_dlhandle handle=lt_dlopen(filename); |
| if (!handle) | if (!handle) |
| Line 148 SQL_Connection& SQL_Driver_manager::get_ | Line 147 SQL_Connection& SQL_Driver_manager::get_ |
| driver_api_version, SQL_DRIVER_API_VERSION); | driver_api_version, SQL_DRIVER_API_VERSION); |
| // initialise by connecting to sql client dynamic link library | // initialise by connecting to sql client dynamic link library |
| const char *dlopen_file_spec_cstr=dlopen_file_spec->cstr(String::UL_FILE_NAME); | bool specified_dlopen_file_spec=dlopen_file_spec && dlopen_file_spec->size(); |
| const char *dlopen_file_spec_cstr= | |
| specified_dlopen_file_spec? | |
| dlopen_file_spec->cstr(String::UL_FILE_NAME):0; | |
| if(const char *error=driver->initialize( | if(const char *error=driver->initialize( |
| dlopen_file_spec_cstr)) | dlopen_file_spec_cstr)) |
| PTHROW(0, 0, | PTHROW(0, 0, |
| library, | library, |
| "driver failed to initialize client library '%s', %s", | "driver failed to initialize client library '%s', %s", |
| dlopen_file_spec_cstr, error); | specified_dlopen_file_spec?dlopen_file_spec_cstr:"unspecifed", |
| error); | |
| // cache it | // cache it |
| put_driver_to_cache(global_protocol, *driver); | put_driver_to_cache(global_protocol, *driver); |
| Line 199 void SQL_Driver_manager::put_driver_to_c | Line 202 void SQL_Driver_manager::put_driver_to_c |
| } | } |
| // connection cache | // connection cache |
| /// @todo get rid of memory spending Stack [zeros deep inside got accumulated] | |
| SQL_Connection *SQL_Driver_manager::get_connection_from_cache(const String& url) { | SQL_Connection *SQL_Driver_manager::get_connection_from_cache(const String& url) { |
| SYNCHRONIZED; | SYNCHRONIZED; |
| Line 231 static void expire_connection(Array::Ite | Line 234 static void expire_connection(Array::Ite |
| SQL_Connection& connection=*static_cast<SQL_Connection *>(value); | SQL_Connection& connection=*static_cast<SQL_Connection *>(value); |
| time_t older_dies=reinterpret_cast<time_t>(info); | time_t older_dies=reinterpret_cast<time_t>(info); |
| if(connection.expired(older_dies)) | if(connection.connected() && connection.expired(older_dies)) |
| connection.disconnect(); | connection.disconnect(); |
| } | } |
| static void expire_connections(const Hash::Key& key, Hash::Val *value, void *info) { | static void expire_connections(const Hash::Key& key, Hash::Val *value, void *info) { |