File:  [parser3project] / parser3 / src / include / pa_sql_driver_manager.h
Revision 1.26.2.9.2.1: download - view: text, annotated - select for diffs - revision graph
Tue Mar 18 15:14:16 2003 UTC (23 years, 4 months ago) by paf
started porting to gc:
PA_Object done
lots of replacements also

/** @file
	Parser: sql driver manager decl.
	global sql driver manager, must be thread-safe

	Copyright (c) 2001-2003 ArtLebedev Group (http://www.artlebedev.com)
	Author: Alexandr Petrosian <paf@design.ru> (http://paf.design.ru)
*/

#ifndef PA_SQL_DRIVER_MANAGER_H
#define PA_SQL_DRIVER_MANAGER_H

static const char* IDENT_SQL_DRIVER_MANAGER_H="$Date: 2003/03/18 15:14:16 $";


#include "pa_sql_driver.h"
#include "pa_hash.h"
#include "pa_table.h"
#include "pa_string.h"
#include "pa_cache_managers.h"
#include "pa_stack.h"

// defines

#define MAIN_SQL_NAME "SQL"
#define MAIN_SQL_DRIVERS_NAME "drivers"

// forwards

class SQL_Connection;  DECLARE_OBJECT_PTR (SQL_Connection);

/// sql driver manager
class SQL_Driver_manager: public Cache_manager {
public:

	typedef Hash<String* , SQL_Driver *> driver_cache_type;
	typedef Hash<String* , object_ptr<Stack<SQL_ConnectionPtr> > > connection_cache_type;

private:
	
	friend class SQL_Connection;

	bool is_dlinited;
	Pool driver_cache_pool;
	driver_cache_type driver_cache;
	connection_cache_type connection_cache;

public:

	SQL_Driver_manager();
	override ~SQL_Driver_manager();

	/** 
		connect to specified url, 
		using driver dynamic library found in table, if not loaded yet
		checks driver version
	*/
	SQL_ConnectionPtr get_connection(const String& arequest_url, const String& aorigin,
		Table *protocol2driver_and_client);

private: // driver cache

	SQL_Driver *get_driver_from_cache(driver_cache_type::key_type protocol);
	void put_driver_to_cache(driver_cache_type::key_type protocol, driver_cache_type::value_type driver);

private: // connection cache

	SQL_ConnectionPtr get_connection_from_cache(connection_cache_type::key_type url);
	void put_connection_to_cache(connection_cache_type::key_type url, 
		SQL_ConnectionPtr connection);
private:
	time_t prev_expiration_pass_time;

private: // for SQL_Connection

	/// caches connection
	void close_connection(connection_cache_type::key_type url, 
		SQL_ConnectionPtr connection);

public: // Cache_manager

	override ValuePtr get_status(const String* source);
	override void maybe_expire_cache();

};

/// global
extern SQL_Driver_manager SQL_driver_manager;

#endif

E-mail: