Annotation of parser3/src/types/pa_vhashfile.C, revision 1.1

1.1     ! parser      1: /** @file
        !             2:        Parser: @b table class.
        !             3: 
        !             4:        Copyright(c) 2001 ArtLebedev Group(http://www.artlebedev.com)
        !             5:        Author: Alexander Petrosyan <paf@design.ru>(http://design.ru/paf)
        !             6: 
        !             7:        $Id: pa_vtable.C,v 1.6 2001/09/26 10:32:26 parser Exp $
        !             8: */
        !             9: 
        !            10: #include "pa_config_includes.h"
        !            11: #ifdef HAVE_LIBDB
        !            12: 
        !            13: #include "pa_vtable.h"
        !            14: #include "pa_vstring.h"
        !            15: #include "pa_vhashfile.h"
        !            16: #include "pa_threads.h"
        !            17: 
        !            18: 
        !            19: #ifdef HAVE_DB_H
        !            20: #      include <db.h>
        !            21: #endif
        !            22: 
        !            23: // defines
        !            24: 
        !            25: #define PA_DB_ACCESS_METHOD DB_BTREE
        !            26: 
        !            27: // methods
        !            28: 
        !            29: void VHashfile::check(const char *operation, const String *source, int error) {
        !            30:        switch(error) {
        !            31:        case 0: 
        !            32:                // no error
        !            33:                break; 
        !            34:        
        !            35:        case DB_KEYEXIST:
        !            36:                // DB_KEYEXIST is a "normal" return, so should not be
        !            37:         // thrown as an error
        !            38:                break; 
        !            39: 
        !            40:        case DB_RUNRECOVERY:
        !            41:                throw Exception(0, 0, 
        !            42:                        &get_file_spec(source), 
        !            43:                        "db %s error, run recovery utility", 
        !            44:                        operation);
        !            45:                
        !            46:        default:
        !            47:                throw Exception(0, 0, 
        !            48:                        &get_file_spec(source), 
        !            49:                        "db %s error: %s (%d)", 
        !            50:                        operation, strerror(errno), errno);
        !            51:        }
        !            52: }
        !            53: 
        !            54: /** 
        !            55:        @test some caching manager of opened files
        !            56:        @test string pieces [get/put preserve lang]
        !            57: */
        !            58: void VHashfile::put_field(const String& name, Value *value) {
        !            59:        DB *db;
        !            60:        // open
        !            61:        DB_INFO dbinfo;
        !            62:        memset(&dbinfo, 0, sizeof(dbinfo));
        !            63:        check("open/create", &name, db_open(
        !            64:                get_file_spec_cstr(&name), 
        !            65:                PA_DB_ACCESS_METHOD , 
        !            66:                DB_CREATE /*| DB_THREAD*/,
        !            67:                0666, 
        !            68:                0, &dbinfo, &db));
        !            69: 
        !            70:        try {
        !            71:                // put
        !            72: 
        !            73:                // key
        !            74:                const char *cstr_key=name.cstr(String::UL_AS_IS);
        !            75:                DBT key={
        !            76:                        (void *)cstr_key,
        !            77:                        name.size()
        !            78:                };
        !            79: 
        !            80:                // data
        !            81:                const String& string=value->as_string();
        !            82:                const char *cstr_data=string.cstr(String::UL_AS_IS);
        !            83:                DBT data={
        !            84:                        (void *)cstr_data,
        !            85:                        string.size()
        !            86:                };
        !            87:                check("put", &name, db->put(db, 0/*DB_TXN*/, &key, &data, 0/*flags*/));
        !            88: 
        !            89:        } catch(...) {
        !            90:                check("close", &name, db->close(db, 0));
        !            91:                /*re*/throw;
        !            92:        }
        !            93: 
        !            94:        // close
        !            95:        check("close", &name, db->close(db, 0));
        !            96: }
        !            97: 
        !            98: Value *VHashfile::get_field(const String& name) {
        !            99:        Value *result=0;
        !           100: 
        !           101:        DB *db;
        !           102:        // open
        !           103:        DB_INFO dbinfo;
        !           104:        memset(&dbinfo, 0, sizeof(dbinfo));
        !           105:        check("open", &name, db_open(
        !           106:                get_file_spec_cstr(&name), 
        !           107:                PA_DB_ACCESS_METHOD , 
        !           108:                0 /*| DB_THREAD*/,
        !           109:                0, 
        !           110:                0, &dbinfo, &db));
        !           111: 
        !           112:        try {
        !           113:                // get
        !           114: 
        !           115:                // key
        !           116:                const char *cstr_key=name.cstr(String::UL_AS_IS);
        !           117:                DBT key={
        !           118:                        (void *)cstr_key,
        !           119:                        name.size()
        !           120:                };
        !           121: 
        !           122:                // data
        !           123:                DBT data={0}; // must be zeroed
        !           124:                check("get", &name, db->get(db, 0/*DB_TXN*/, &key, &data, 0/*flags*/));
        !           125:                
        !           126:                char *request_data=(char *)malloc(data.size);
        !           127:                memcpy(request_data, data.data, data.size);
        !           128:                result=NEW VString(*NEW String(pool(), request_data, data.size, true/*tainted*/));
        !           129: 
        !           130:        } catch(...) {
        !           131:                check("close", &name, db->close(db, 0));
        !           132:                /*re*/throw;
        !           133:        }
        !           134: 
        !           135:        // close
        !           136:        check("close", &name, db->close(db, 0));
        !           137:        
        !           138:        // return
        !           139:        return result;
        !           140: }
        !           141: 
        !           142: Hash *VHashfile::get_hash() {
        !           143:        return 0;
        !           144: }
        !           145: 
        !           146: #endif

E-mail: