Annotation of parser3/src/include/pa_db_table.h, revision 1.10

1.1       paf         1: /** @file
                      2:        Parser: sql db decl.
                      3: 
                      4:        Copyright (c) 2001 ArtLebedev Group (http://www.artlebedev.com)
1.8       paf         5:        Author: Alexander Petrosyan <paf@design.ru> (http://paf.design.ru)
1.1       paf         6: 
1.9       paf         7:        $Id: pa_db_table.h,v 1.8.6.1 2001/11/23 11:53:03 paf Exp $
1.1       paf         8: */
                      9: 
                     10: #ifndef PA_DB_TABLE_H
                     11: #define PA_DB_TABLE_H
                     12: 
                     13: #include "pa_config_includes.h"
1.3       paf        14: #include "pa_globals.h"
1.1       paf        15: #include "pa_pool.h"
                     16: 
1.5       paf        17: #ifdef DB2
1.1       paf        18: #      include <db.h>
1.6       paf        19: #      if DB_VERSION_MAJOR != 2
                     20: #              error Parser needs DB 2.x.x version of libdb to compile
                     21: #      endif
1.1       paf        22: #endif
                     23: 
                     24: // defines
                     25: 
                     26: #define PA_DB_ACCESS_METHOD DB_BTREE
                     27: 
                     28: // forwards
                     29: 
1.3       paf        30: class DB_Connection;
                     31: 
                     32: class DB_Table_ptr;
1.2       paf        33: class DB_Transaction;
1.1       paf        34: class DB_Cursor;
                     35: 
                     36: // class
                     37: 
                     38: /// DB table. handy wrapper around low level <db.h> calls
                     39: class DB_Table : public Pooled {
1.7       paf        40:        friend class DB_Table_ptr;
                     41:        friend class DB_Transaction;
                     42:        friend class DB_Cursor;
1.1       paf        43: public:
                     44: 
1.3       paf        45:        DB_Table(Pool& apool, const String& afile_name, DB_Connection& aconnection);
                     46:        ~DB_Table();
                     47: 
                     48:        const String& file_name() { return ffile_name; }
1.1       paf        49: 
                     50:        bool expired(time_t older_dies) {
1.3       paf        51:                return !used && time_used<older_dies;
1.1       paf        52:        }
1.8       paf        53:        time_t get_time_used() { return time_used; }
                     54:        int get_users_count() { return used; }
1.1       paf        55: 
1.9       paf        56:        void put(DB_Transaction *t, const String& key, const String& data, time_t lifespan);
                     57:        String *get(DB_Transaction *t, Pool& pool, const String& key, time_t lifespan);
1.3       paf        58:        void remove(DB_Transaction *t, const String& key);
                     59: 
                     60: private: // table usage methods
                     61: 
                     62:        void use();
                     63:        void unuse();
1.1       paf        64: 
1.3       paf        65: private: // table usage data
1.1       paf        66: 
1.3       paf        67:        int used;
1.1       paf        68: 
                     69: private:
                     70: 
                     71:        DB_Connection& fconnection;
                     72:        DB_ENV& dbenv;
1.3       paf        73:        const String& ffile_name; const char *file_name_cstr;
1.1       paf        74:        Pool *fservices_pool;
                     75:        DB *db;
                     76:        time_t time_used;
                     77: 
                     78: private:
                     79: 
                     80:        void check(const char *operation, const String *source, int error);
                     81:        void *malloc(size_t size) { return fservices_pool->malloc(size); }
                     82:        void *calloc(size_t size) { return fservices_pool->calloc(size); }
                     83:        /// pass empty dbt, would fill it from string
                     84:        void key_string_to_dbt(const String& key_string, DBT& key_result);
                     85:        /// @returns new string
1.3       paf        86:        String& key_dbt_to_string(Pool& pool, const DBT& key_dbt);
1.1       paf        87:        /// pass empty dbt, would fill it from string
1.9       paf        88:        void data_string_to_dbt(const String& data_string,  time_t lifespan, 
1.1       paf        89:                DBT& data_result);
                     90:        /// @returns new string if it not expired
1.9       paf        91:        String *data_dbt_to_string(Pool& pool, const DBT& data_dbt, time_t lifespan);
1.1       paf        92: 
                     93: };
                     94: 
1.3       paf        95: /// Auto-object used to track DB_Table usage
                     96: class DB_Table_ptr {
                     97:        DB_Table *ftable;
                     98: public:
                     99:        explicit DB_Table_ptr(DB_Table *atable) : ftable(atable) {
                    100:                ftable->use();
                    101:        }
                    102:        ~DB_Table_ptr() {
                    103:                ftable->unuse();
                    104:        }
                    105:        DB_Table* operator->() {
                    106:                return ftable;
                    107:        }
                    108:        DB_Table& operator*() {
                    109:                return *ftable;
                    110:        }
                    111: 
                    112:        // copying
                    113:        DB_Table_ptr(const DB_Table_ptr& src) : ftable(src.ftable) {
                    114:                ftable->use();
                    115:        }
                    116:        DB_Table_ptr& operator =(const DB_Table_ptr& src) {
                    117:                // may do without this=src check
                    118:                ftable->unuse();
                    119:                ftable=src.ftable;
                    120:                ftable->use();
                    121: 
                    122:                return *this;
                    123:        }
                    124: };
                    125: 
1.1       paf       126: ///    Auto-object used for temporary changing DB_Table::tid.
1.2       paf       127: class DB_Transaction {
1.1       paf       128: public:
1.3       paf       129: 
                    130:        DB_Transaction(Pool& apool, DB_Table& atable, DB_Transaction *& aparent_ref);
                    131:        ~DB_Transaction();
                    132:        DB_TXN *id() { return fid; }
                    133:        void mark_to_rollback();
                    134: 
1.9       paf       135:        void put(const String& key, const String& data, time_t lifespan) {
                    136:                ftable.put(this, key, data, lifespan);
1.3       paf       137:        }
1.9       paf       138:        String *get(const String& key, time_t lifespan) {
                    139:                return ftable.get(this, fpool, key, lifespan);
1.1       paf       140:        }
1.3       paf       141:        void remove(const String& key) {
                    142:                ftable.remove(this, key);
1.1       paf       143:        }
1.3       paf       144: 
                    145: private:
                    146: 
                    147:        void check(const char *operation, const String *source, int error) {
                    148:                ftable.check(operation, source, error);
1.1       paf       149:        }
1.3       paf       150: 
                    151: private:
                    152: 
                    153:        Pool& fpool;
                    154:        DB_Table& ftable;
                    155:        DB_Transaction *parent;
                    156:        DB_Transaction *& fparent_ref;
                    157:        DB_TXN *fid;
                    158:        bool marked_to_rollback;
                    159: 
1.1       paf       160: };
                    161: 
                    162: /// DB cursor. handy wrapper around low level <db.h> calls
                    163: class DB_Cursor {
                    164: public:
1.3       paf       165:        DB_Cursor(DB_Table& atable, DB_Transaction *transaction, const String *asource);
1.1       paf       166:        ~DB_Cursor();
                    167:        /// pass empty strings to key&data, would fill them
1.3       paf       168:        bool get(Pool& pool, String *& key, String *& data, u_int32_t flags);
1.4       paf       169:        bool move(u_int32_t flags);
1.1       paf       170:        void remove(u_int32_t flags);
                    171: private:
                    172:        const String *fsource;
                    173:        DB_Table& ftable;
                    174:        DBC *cursor;
                    175: private:
                    176:        void check(const char *operation, const String *source, int error) {
                    177:                ftable.check(operation, source, error);
                    178:        }
                    179:        /// @returns new string
1.3       paf       180:        String& key_dbt_to_string(Pool& pool, DBT& key_dbt) {
                    181:                return ftable.key_dbt_to_string(pool, key_dbt);
1.1       paf       182:        }
                    183:        /// @returns new string if it not expired
1.9       paf       184:        String *data_dbt_to_string(Pool& pool, const DBT& data_dbt, time_t lifespan) {  
                    185:                return ftable.data_dbt_to_string(pool, data_dbt, lifespan);
1.1       paf       186:        }
                    187: };
                    188: 
                    189: #endif

E-mail: