|
|
| version 1.16.2.7.2.2, 2003/03/20 08:11:15 | version 1.22, 2003/12/10 14:28:46 |
|---|---|
| Line 7 | Line 7 |
| #include "pa_config_includes.h" | #include "pa_config_includes.h" |
| #ifdef XML | #ifdef XML |
| static const char* IDENT_STYLESHEET_MANAGER_C="$Date$"; | static const char * const IDENT_STYLESHEET_MANAGER_C="$Date$"; |
| #include "pa_stylesheet_manager.h" | #include "pa_stylesheet_manager.h" |
| #include "pa_stylesheet_connection.h" | |
| #include "pa_exception.h" | #include "pa_exception.h" |
| #include "pa_common.h" | #include "pa_common.h" |
| #include "pa_threads.h" | #include "pa_threads.h" |
| Line 35 static void expire_connection(Stylesheet | Line 34 static void expire_connection(Stylesheet |
| connection.disconnect(); | connection.disconnect(); |
| } | } |
| static void expire_connections( | static void expire_connections( |
| Stylesheet_manager::connection_cache_type::key_type /*key*/, | Stylesheet_manager::connection_cache_type::key_type /*key*/, |
| Stylesheet_manager::connection_cache_type::value_type stack, | Stylesheet_manager::connection_cache_type::value_type stack, |
| time_t older_dies) { | time_t older_dies) { |
| for(int i=0; i<=stack->top_index(); i++) | for(size_t i=0; i<stack->top_index(); i++) |
| expire_connection(*stack->get(i), older_dies); | expire_connection(*stack->get(i), older_dies); |
| } | } |
| // Stylesheet_manager | // Stylesheet_connection methods |
| void Stylesheet_connection::close() { | |
| stylesheet_manager.close_connection(ffile_spec, *this); | |
| } | |
| // Stylesheet_manager methods | |
| Stylesheet_manager::Stylesheet_manager(): prev_expiration_pass_time(0) { | Stylesheet_manager::Stylesheet_manager(): prev_expiration_pass_time(0) { |
| cache_managers.put(String* (new String("stylesheet")), this); | cache_managers.put(String::Body("stylesheet"), this); |
| } | } |
| Stylesheet_manager::~Stylesheet_manager() { | Stylesheet_manager::~Stylesheet_manager() { |
| connection_cache.for_each(expire_connections, time(0)+SECOND/*=in future=expire all*/); | connection_cache.for_each(expire_connections, time(0)+SECOND/*=in future=expire all*/); |
| } | } |
| Stylesheet_connectionPtr Stylesheet_manager::get_connection(const String& file_spec) { | Stylesheet_connection_ptr Stylesheet_manager::get_connection(String::Body file_spec) { |
| Stylesheet_connectionPtr result=get_connection_from_cache(file_spec); | Stylesheet_connection* result=get_connection_from_cache(file_spec); |
| if(!result) | if(!result) |
| result=Stylesheet_connectionPtr(new Stylesheet_connection(file_spec)); | result=new Stylesheet_connection(file_spec); |
| return result; | return Stylesheet_connection_ptr(result); |
| } | } |
| void Stylesheet_manager::close_connection(const String& file_spec, | void Stylesheet_manager::close_connection(String::Body file_spec, Stylesheet_connection& connection) { |
| Stylesheet_connection& connection) { | put_connection_to_cache(file_spec, connection); |
| put_connection_to_cache(file_spec, Stylesheet_connectionPtr(&connection)); | |
| } | } |
| // stylesheet cache | // stylesheet cache |
| /// @todo get rid of memory spending Stack [zeros deep inside got accumulated] | /// @todo get rid of memory spending Stack [zeros deep inside got accumulated] |
| Stylesheet_connectionPtr Stylesheet_manager::get_connection_from_cache(const String& file_spec) { | Stylesheet_connection* Stylesheet_manager::get_connection_from_cache(String::Body file_spec) { |
| SYNCHRONIZED; | SYNCHRONIZED; |
| if(connection_cache_type::value_type connections=connection_cache.get(file_spec)) | if(connection_cache_type::value_type connections=connection_cache.get(file_spec)) |
| while(connections->top_index()>=0) { // there are cached stylesheets to that 'file_spec' | while(!connections->is_empty()) { // there are cached stylesheets to that 'file_spec' |
| Stylesheet_connectionPtr result=connections->pop(); | Stylesheet_connection* result=connections->pop(); |
| if(result->connected()) // not expired? | if(result->connected()) // not expired? |
| return result; | return result; |
| } | } |
| return Stylesheet_connectionPtr(0); | return 0; |
| } | } |
| void Stylesheet_manager::put_connection_to_cache(const String& file_spec, | void Stylesheet_manager::put_connection_to_cache(String::Body file_spec, |
| Stylesheet_connectionPtr connection) { | Stylesheet_connection& connection) { |
| SYNCHRONIZED; | SYNCHRONIZED; |
| connection_cache_type::value_type connections=connection_cache.get(file_spec); | connection_cache_type::value_type connections=connection_cache.get(file_spec); |
| if(!connections) { // there are no cached stylesheets to that 'file_spec' yet? | if(!connections) { // there are no cached stylesheets to that 'file_spec' yet? |
| connections=connection_cache_type::value_type(new connection_cache_type::value_type::element_type); | connections=new connection_cache_value_type; |
| connection_cache.put(file_spec, connections); | connection_cache.put(file_spec, connections); |
| } | } |
| connections->push(connection); | connections->push(&connection); |
| } | } |
| void Stylesheet_manager::maybe_expire_cache() { | void Stylesheet_manager::maybe_expire_cache() { |
| Line 101 void Stylesheet_manager::maybe_expire_ca | Line 105 void Stylesheet_manager::maybe_expire_ca |
| prev_expiration_pass_time=now; | prev_expiration_pass_time=now; |
| } | } |
| } | } |
| /* | |
| static void add_connection_to_status_cache_table(Array::Item *value, void *info) { | |
| Stylesheet_connection& connection=*static_cast<Stylesheet_connection *>(value); | |
| Table& table=*static_cast<Table *>(info); | |
| static void add_connection_to_status_cache_table(Stylesheet_connection& connection, Table* table) { | |
| if(connection.connected()) { | if(connection.connected()) { |
| =table.pool(); | ArrayString& row=*new ArrayString; |
| Array& row=*new Array(); | |
| // file | // file |
| row+=&connection.file_spec(); | row+=new String(connection.file_spec(), String::L_AS_IS); |
| // time | // time |
| time_t time_stamp=connection.get_time_used(); | time_t time_used=connection.get_time_used(); |
| row+=new String(pool.copy(ctime(&time_stamp))); | row+=new String(pa_strdup(ctime(&time_used))); |
| table+=&row; | *table+=&row; |
| } | } |
| } | } |
| static void add_connections_to_status_cache_table(const Hash::Key& key, Hash::Val *value, void *info) { | static void add_connections_to_status_cache_table( |
| Stack& stack=*static_cast<Stack *>(value); | Stylesheet_manager::connection_cache_type::key_type /*key*/, |
| Array_iter iter(stack); | Stylesheet_manager::connection_cache_type::value_type stack, Table* table) |
| for(int countdown=stack.top_index(); countdown-->=0; ) | { |
| add_connection_to_status_cache_table(iter.next(), info); | for(Array_iterator<Stylesheet_connection*> i(*stack); i.has_next(); ) |
| } | add_connection_to_status_cache_table(*i.next(), table); |
| */ | } |
| ValuePtr Stylesheet_manager::get_statusconst String* source) { | |
| VHashPtr result(new VHash); | Value* Stylesheet_manager::get_status() { |
| /* | VHash* result=new VHash; |
| // cache | // cache |
| { | { |
| Array& columns=*new Array(); | ArrayString& columns=*new ArrayString; |
| columns+=new String("file"); | columns+=new String("file"); |
| columns+=new String("time"); | columns+=new String("time"); |
| Table& table=*new Table(0, &columns, connection_cache.size()); | Table& table=*new Table(&columns, connection_cache.count()); |
| connection_cache.for_each(add_connections_to_status_cache_table, &table); | connection_cache.for_each(add_connections_to_status_cache_table, &table); |
| result.hash(source).put(*new String("cache"), new VTable(&table)); | result->get_hash()->put(*new String("cache"), new VTable(&table)); |
| } | } |
| */ | |
| return result; | return result; |
| } | } |