--- parser3/src/main/pa_stylesheet_manager.C 2001/11/05 10:21:28 1.2 +++ parser3/src/main/pa_stylesheet_manager.C 2002/02/08 07:27:49 1.12 @@ -1,22 +1,22 @@ /** @file Parser: sql driver manager implementation. - Copyright (c) 2001 ArtLebedev Group (http://www.artlebedev.com) - Author: Alexander Petrosyan (http://design.ru/paf) + Copyright (c) 2001, 2002 ArtLebedev Group (http://www.artlebedev.com) + Author: Alexander Petrosyan (http://paf.design.ru) - $Id: pa_stylesheet_manager.C,v 1.2 2001/11/05 10:21:28 paf Exp $ + $Id: pa_stylesheet_manager.C,v 1.12 2002/02/08 07:27:49 paf Exp $ */ #include "pa_config_includes.h" #ifdef XML #include "pa_stylesheet_manager.h" #include "pa_stylesheet_connection.h" -#include "ltdl.h" #include "pa_exception.h" #include "pa_common.h" #include "pa_threads.h" #include "pa_stack.h" #include "pa_vhash.h" +#include "pa_vtable.h" // globals @@ -44,21 +44,21 @@ static void expire_connections(const Has // Stylesheet_manager -Stylesheet_manager::Stylesheet_manager(Pool& pool) : Pooled(pool), - connection_cache(pool), +Stylesheet_manager::Stylesheet_manager(Pool& apool) : Cache_manager(apool), + connection_cache(apool), prev_expiration_pass_time(0) { -} + } Stylesheet_manager::~Stylesheet_manager() { connection_cache.for_each(expire_connections, - reinterpret_cast((time_t)0/*=in past=expire all*/)); + reinterpret_cast(time(0)+1/*=in future=expire all*/)); } -Stylesheet_connection& Stylesheet_manager::get_connection(const String& request_file_spec) { +Stylesheet_connection_ptr Stylesheet_manager::get_connection(const String& request_file_spec) { Pool& pool=request_file_spec.pool(); // request pool // first trying to get cached stylesheet - Stylesheet_connection *result=get_connection_from_cache(request_file_spec); - if(!result) { + Stylesheet_connection *connection=get_connection_from_cache(request_file_spec); + if(!connection) { // then just construct it // make global_file_spec C-string on global pool @@ -68,12 +68,12 @@ Stylesheet_connection& Stylesheet_manage // make global_file_spec string on global pool String& global_file_spec=*new(this->pool()) String(this->pool(), global_file_spec_cstr); - result=new(this->pool()) Stylesheet_connection(this->pool(), global_file_spec); + connection=new(this->pool()) Stylesheet_connection(this->pool(), global_file_spec); } // associate with services[request] (deassociates at close) - result->set_services(&pool); - // return it - return *result; + connection->set_services(&pool); + // return autoclosing object for it + return Stylesheet_connection_ptr(connection); } void Stylesheet_manager::close_connection(const String& file_spec, @@ -89,8 +89,6 @@ void Stylesheet_manager::close_connectio Stylesheet_connection *Stylesheet_manager::get_connection_from_cache(const String& file_spec) { SYNCHRONIZED; - maybe_expire_connection_cache(); - if(Stack *connections=static_cast(connection_cache.get(file_spec))) while(connections->top_index()>=0) { // there are cached stylesheets to that 'file_spec' Stylesheet_connection *result=static_cast(connections->pop()); @@ -113,7 +111,7 @@ void Stylesheet_manager::put_connection_ connections->push(&connection); } -void Stylesheet_manager::maybe_expire_connection_cache() { +void Stylesheet_manager::maybe_expire_cache() { time_t now=time(0); if(prev_expiration_pass_time(value); + Table& table=*static_cast(info); + + if(connection.connected()) { + Pool& pool=table.pool(); + Array& row=*new(pool) Array(pool); + + // file + row+=&connection.file_spec(); + // time + time_t time_stamp=connection.get_time_used(); + const char *unsafe_time_cstr=ctime(&time_stamp); + int time_buf_size=strlen(unsafe_time_cstr); + char *safe_time_buf=(char *)pool.malloc(time_buf_size); + memcpy(safe_time_buf, unsafe_time_cstr, time_buf_size); + row+=new(pool) String(pool, safe_time_buf, time_buf_size); + + table+=&row; + } +} +static void add_connections_to_status_cache_table(const Hash::Key& key, Hash::Val *value, void *info) { + Stack& stack=*static_cast(value); + Array_iter iter(stack); + for(int countdown=stack.top_index(); countdown-->=0; ) + add_connection_to_status_cache_table(iter.next(), info); +} Value& Stylesheet_manager::get_status(Pool& pool, const String *source) { VHash& result=*new(pool) VHash(pool); -/* + // cache { - Array& columns=*new(pool) Array(pool, 3); - columns+=new(pool) String(pool, "protocol"); + Array& columns=*new(pool) Array(pool); + columns+=new(pool) String(pool, "file"); columns+=new(pool) String(pool, "time"); - columns+=new(pool) String(pool, "times"); Table& table=*new(pool) Table(pool, 0, &columns, connection_cache.size()); connection_cache.for_each(add_connections_to_status_cache_table, &table); result.hash(source).put(*new(pool) String(pool, "cache"), new(pool) VTable(pool, &table)); } -*/ + return result; }