Diff for /parser3/src/main/Attic/pa_db_connection.C between versions 1.27 and 1.31

version 1.27, 2001/10/31 15:00:05 version 1.31, 2001/11/05 16:07:16
Line 2 Line 2
         Parser: sql driver connection implementation.          Parser: sql driver connection implementation.
   
         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://paf.design.ru)
   
         $Id$          $Id$
   
Line 18 Line 18
 #include "pa_threads.h"  #include "pa_threads.h"
 #include "pa_stack.h"  #include "pa_stack.h"
 #include "pa_common.h"  #include "pa_common.h"
   #include "pa_vtable.h"
   
 // defines  // defines
   
Line 26 Line 27
 /// @test increase  /// @test increase
 const int DB_CHECKPOINT_MINUTES=1;   const int DB_CHECKPOINT_MINUTES=1; 
   
 const int EXPIRE_UNUSED_TABLE_SECONDS=60;  const int EXPIRE_UNUSED_TABLE_SECONDS=3; //60;
 const int CHECK_EXPIRED_TABLES_SECONDS=EXPIRE_UNUSED_TABLE_SECONDS*2;  const int CHECK_EXPIRED_TABLES_SECONDS=EXPIRE_UNUSED_TABLE_SECONDS*2;
   
 // callbacks  // callbacks
Line 46  static void db_errcall(const char *, cha Line 47  static void db_errcall(const char *, cha
 }  }
   
 static void expire_table(const Hash::Key& key, Hash::Val *& value, void *info) {  static void expire_table(const Hash::Key& key, Hash::Val *& value, void *info) {
         DB_Table& table=*static_cast<DB_Table *>(value);          if(DB_Table *table=static_cast<DB_Table *>(value)) {
         time_t older_dies=reinterpret_cast<time_t>(info);                  time_t older_dies=reinterpret_cast<time_t>(info);
   
         if(table.expired(older_dies)) {                  if(table->expired(older_dies)) {
                 table.~DB_Table();  value=0;                          table->~DB_Table();  value=0;
                   }
         }          }
 }  }
   
Line 58  static void expire_table(const Hash::Key Line 60  static void expire_table(const Hash::Key
   
 DB_Connection::DB_Connection(Pool& apool, const String& adb_home) : Pooled(apool),  DB_Connection::DB_Connection(Pool& apool, const String& adb_home) : Pooled(apool),
         time_used(0),          time_used(0),
         fdb_home(adb_home),           fdb_home(adb_home), used(0),
         table_cache(apool),          table_cache(apool),
         prev_expiration_pass_time(0) {          prev_expiration_pass_time(0) {
         //_asm  int 3;          //_asm  int 3;
Line 80  DB_Connection::DB_Connection(Pool& apool Line 82  DB_Connection::DB_Connection(Pool& apool
         };          };
   
         u_int32_t flags=          u_int32_t flags=
                 parser_multithreaded?DB_THREAD:0                  (parser_multithreaded?DB_THREAD:0)
                 | DB_CREATE                   | DB_CREATE 
                 | DB_INIT_MPOOL | DB_INIT_LOCK | DB_INIT_LOG | DB_INIT_TXN;                  | DB_INIT_MPOOL | DB_INIT_LOCK | DB_INIT_LOG | DB_INIT_TXN;
   
Line 103  DB_Connection::DB_Connection(Pool& apool Line 105  DB_Connection::DB_Connection(Pool& apool
                 &dbenv,                   &dbenv, 
                 flags                  flags
                 ));                  ));
   
           // after some hang noticed this to be null
           if(!dbenv.tx_info) 
                   throw Exception(0, 0,
                           &fdb_home,
                           "transaction system failed to initialize");
 }  }
   
 DB_Connection::~DB_Connection() {  DB_Connection::~DB_Connection() {
         // close tables          // close tables
         table_cache.for_each(expire_table,           table_cache.for_each(expire_table, 
                 reinterpret_cast<void *>(0/* =in the past = expire[close] all*/));                  reinterpret_cast<void *>(time(0)/* =now= expire[close] all*/));
                   
         // destroy connection data          // destroy connection data
         check("db_appexit", &fdb_home, db_appexit(&dbenv));          check("db_appexit", &fdb_home, db_appexit(&dbenv));
Line 137  void DB_Connection::check(const char *op Line 145  void DB_Connection::check(const char *op
   
 DB_Table_ptr DB_Connection::get_table_ptr(const String& request_file_name, const String *source) {  DB_Table_ptr DB_Connection::get_table_ptr(const String& request_file_name, const String *source) {
         // checkpoint          // checkpoint
         {          { 
                 int error=txn_checkpoint(dbenv.tx_info, 0/*kbyte*/, DB_CHECKPOINT_MINUTES/*min*/);                  int error=txn_checkpoint(dbenv.tx_info, 0/*kbyte*/, DB_CHECKPOINT_MINUTES/*min*/);
                 /*                  /*
                 DB_INCOMPLETE if there were pages that needed to be written                   DB_INCOMPLETE if there were pages that needed to be written 
Line 199  void DB_Connection::maybe_expire_table_c Line 207  void DB_Connection::maybe_expire_table_c
         }          }
 }  }
   
   static void add_table_to_status_table(const Hash::Key& key, Hash::Val *& value, void *info) {
           if(DB_Table *db_table=static_cast<DB_Table *>(value)) {
                   Table& status_table=*static_cast<Table *>(info);
                   Pool& pool=status_table.pool();
   
                   Array& row=*new(pool) Array(pool);
   
                   // name
                   row+=&db_table->file_name();
                   // time
                   time_t time_stamp=db_table->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);
                   // users
                   char *users_buf=(char *)pool.malloc(MAX_NUMBER);
                   row+=new(pool) String(pool, 
                           users_buf, snprintf(users_buf, MAX_NUMBER, "%d", db_table->get_users_count()));
   
                   status_table+=&row;
           }
   }
   Value& DB_Connection::get_status(Pool& pool, const String *source) {
           Array& columns=*new(pool) Array(pool);
           columns+=new(pool) String(pool, "name");
           columns+=new(pool) String(pool, "time");
           columns+=new(pool) String(pool, "users");
           Table& table=*new(pool) Table(pool, 0, &columns, table_cache.size());
   
           table_cache.for_each(add_table_to_status_table, &table);
   
           return *new(pool) VTable(pool, &table);
   }
   
 #endif  #endif

Removed from v.1.27  
changed lines
  Added in v.1.31


E-mail: