Annotation of parser3/src/types/pa_vhashfile.h, revision 1.7
1.1 parser 1: /** @file
2: Parser: @b hashfile parser type 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.7 ! parser 7: $Id: pa_vhashfile.h,v 1.6 2001/10/24 10:04:54 parser Exp $
1.1 parser 8: */
9:
10: #ifndef PA_VHASHFILE_H
11: #define PA_VHASHFILE_H
12:
13: #include "classes.h"
14: #include "pa_value.h"
15: #include "pa_hash.h"
16: #include "pa_vint.h"
1.2 parser 17: #include "pa_db_connection.h"
1.1 parser 18:
1.7 ! parser 19: // externs
! 20:
1.3 parser 21: extern Methoded *hashfile_base_class;
1.1 parser 22:
1.7 ! parser 23: // forwards
! 24:
! 25: class Autosave_marked_to_cancel_cache ;
! 26:
1.1 parser 27: /// value of type 'hashfile', implemented with GDBM library
28: class VHashfile : public VStateless_class {
1.2 parser 29: friend void VHashfile_cleanup(void *);
1.7 ! parser 30: friend Autosave_marked_to_cancel_cache ;
1.1 parser 31: public: // value
32:
33: const char *type() const { return "hashfile"; }
34:
35: /// VHashfile: true
36: bool is_defined() const { return true; }
37:
38: /// VHashfile: convert to VHash
1.4 parser 39: Hash *get_hash(const String *source);
1.1 parser 40:
41: /// VHashfile: 0
42: VStateless_class *get_class() { return 0; }
43:
44: /// VHashfile: (key)=value
45: Value *get_element(const String& name) {
46: // $CLASS,$method
47: if(Value *result=VStateless_class::get_element(name))
48: return result;
49:
50: // $element
51: return get_field(name);
52: }
53:
1.5 parser 54: /// VHashfile: (key)=value, (key)=(value+expires)
1.6 parser 55: void put_element(const String& name, Value *value) {
56: put_field(name, value);
57: }
1.1 parser 58:
59: public: // usage
60:
1.3 parser 61: VHashfile(Pool& apool) : VStateless_class(apool, hashfile_base_class),
1.7 ! parser 62: fconnection(0), fmarked_to_cancel_cache(false) {
1.2 parser 63: register_cleanup(VHashfile_cleanup, this);
1.1 parser 64: }
1.2 parser 65: private:
66: void cleanup() {
67: if(fconnection)
68: fconnection->close(); // cache it
1.1 parser 69: }
1.2 parser 70: public:
1.1 parser 71:
1.3 parser 72: void set_connection(DB_Connection& aconnection) { fconnection=&aconnection; }
1.2 parser 73: DB_Connection& get_connection(const String *source) const {
74: if(!fconnection)
1.1 parser 75: throw Exception(0, 0,
76: source,
77: "can not be applied to uninitialized instance");
78:
1.2 parser 79: return *fconnection;
1.1 parser 80: }
81:
1.7 ! parser 82: void mark_to_cancel_cache() { fmarked_to_cancel_cache=true; }
! 83: bool marked_to_cancel_cache() { return fmarked_to_cancel_cache; }
! 84:
1.1 parser 85: private:
86:
87: Value *get_field(const String& name);
1.6 parser 88: void put_field(const String& name, Value *value);
1.1 parser 89:
90: private:
91:
1.2 parser 92: DB_Connection *fconnection;
1.7 ! parser 93: bool fmarked_to_cancel_cache;
1.1 parser 94:
1.7 ! parser 95: };
! 96:
! 97: /// Auto-object used for temporary changing DB_Connection::tid.
! 98: class Autosave_marked_to_cancel_cache {
! 99: VHashfile& fhashfile;
! 100: bool saved;
! 101: public:
! 102: Autosave_marked_to_cancel_cache(VHashfile& ahashfile) :
! 103: fhashfile(ahashfile), saved(ahashfile.fmarked_to_cancel_cache) {
! 104: }
! 105: ~Autosave_marked_to_cancel_cache() {
! 106: fhashfile.fmarked_to_cancel_cache=saved;
! 107: }
1.1 parser 108: };
109:
110: #endif
E-mail: