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