Annotation of parser3/src/include/pa_db_table.h, revision 1.9
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: