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

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

E-mail: