Annotation of parser3/src/include/pa_db_connection.h, revision 1.8
1.1 parser 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.8 ! paf 7: $Id: pa_db_connection.h,v 1.7 2001/10/24 10:26:16 parser Exp $
1.1 parser 8: */
9:
10: #ifndef PA_DB_CONNECTION_H
11: #define PA_DB_CONNECTION_H
12:
13: #include "pa_config_includes.h"
14: #include "pa_pool.h"
15: #include "pa_db_manager.h"
16: #include "pa_globals.h"
17:
18: #ifdef HAVE_DB_H
19: # include <db.h>
20: #endif
21:
22: // defines
23:
24: #define PA_DB_ACCESS_METHOD DB_BTREE
25:
1.2 parser 26: // forwards
27:
28: class Auto_transaction;
1.3 parser 29: class DB_Cursor;
1.2 parser 30:
1.1 parser 31: // class
32:
1.3 parser 33: /// DB connection. handy wrapper around low level <db.h> calls
1.1 parser 34: class DB_Connection : public Pooled {
1.2 parser 35: friend Auto_transaction;
1.3 parser 36: friend DB_Cursor;
1.1 parser 37: public:
38:
39: DB_Connection(Pool& pool, const String& afile_spec, DB_ENV& adbenv);
40:
41: //const String& url() { return ffile_spec; }
42:
43: void set_services(Pool *aservices_pool) {
44: time_used=time(0); // they started to use at this time
45: fservices_pool=aservices_pool;
46: }
47: bool expired(time_t older_dies) {
48: return time_used<older_dies;
49: }
50:
51: void close() {
52: DB_manager->close_connection(ffile_spec, *this);
53: }
54:
55: bool connected() { return db!=0; }
56: void connect();
1.2 parser 57: void disconnect();
1.1 parser 58: bool ping() { return !needs_recovery; }
59:
1.5 parser 60: void put(const String& key, const String& data, time_t time_to_die);
1.1 parser 61: String *get(const String& key);
1.7 parser 62: void remove(const String& key);
1.1 parser 63:
64: private:
65:
66: DB_ENV& fdbenv;
1.3 parser 67: const String& ffile_spec; const char *file_spec_cstr;
1.1 parser 68: Pool *fservices_pool;
69: DB *db;
70: bool needs_recovery;
1.2 parser 71: DB_TXN *ftid;
1.1 parser 72: time_t time_used;
73:
1.2 parser 74: private: // transaction
75:
76: /// commits current transaction, restores previous transaction handle
77: void commit_restore(DB_TXN *atid) {
78: if(ftid)
79: check("txn_commit", &ffile_spec, txn_commit(ftid));
80:
81: ftid=atid;
82: }
83:
84: /// rolls current transaction back, restores previous transaction handle
85: void rollback_restore(DB_TXN *atid) {
86: if(ftid)
87: check("txn_abort", &ffile_spec, txn_abort(ftid));
88:
89: ftid=atid;
90: }
91:
92: /// stars new current trunsaction @returns previous transaction handle
93: DB_TXN *transaction_begin_save() {
1.8 ! paf 94: DB_TXN *parent=ftid;
! 95: check("txn_begin", &ffile_spec, ::txn_begin(fdbenv.tx_info, parent, &ftid));
1.2 parser 96:
1.8 ! paf 97: return parent;
1.2 parser 98: }
99:
1.1 parser 100: private:
101:
102: void check(const char *operation, const String *source, int error);
103: void *malloc(size_t size) { return fservices_pool->malloc(size); }
104: void *calloc(size_t size) { return fservices_pool->calloc(size); }
1.4 parser 105: /// pass empty dbt, would fill it from string
106: void key_string_to_dbt(const String& key_string, DBT& key_result);
1.5 parser 107: /// @returns new string
108: String& key_dbt_to_string(const DBT& key_dbt);
1.4 parser 109: /// pass empty dbt, would fill it from string
1.5 parser 110: void data_string_to_dbt(const String& data_string, time_t time_to_die,
111: DBT& data_result);
112: /// @returns new string if it not expired
113: String *data_dbt_to_string(const DBT& data_dbt);
1.2 parser 114:
115: };
116:
117: /// Auto-object used for temporary changing DB_Connection::tid.
118: class Auto_transaction {
119: DB_Connection& fconnection;
120: bool marked_to_rollback;
121: DB_TXN *saved_tid;
122: public:
123: Auto_transaction(DB_Connection& aconnection) :
124: fconnection(aconnection), marked_to_rollback(false),
125: saved_tid(aconnection.transaction_begin_save()) {
126: }
127: ~Auto_transaction() {
128: if(marked_to_rollback)
129: fconnection.rollback_restore(saved_tid);
130: else
131: fconnection.commit_restore(saved_tid);
132: }
133: void mark_to_rollback() {
134: marked_to_rollback=true;
1.3 parser 135: }
136: };
137:
138: /// DB cursor. handy wrapper around low level <db.h> calls
139: class DB_Cursor {
140: friend DB_Connection;
1.6 parser 141: public:
1.3 parser 142: DB_Cursor(DB_Connection& aconnection, const String *asource);
143: ~DB_Cursor();
1.4 parser 144: /// pass empty strings to key&data, would fill them
1.5 parser 145: bool get(String *& key, String *& data, u_int32_t flags);
1.7 parser 146: void remove(u_int32_t flags);
1.3 parser 147: private:
148: const String *fsource;
149: DB_Connection& fconnection;
150: DBC *cursor;
151: private:
152: void check(const char *operation, const String *source, int error) {
153: fconnection.check(operation, source, error);
154: }
1.5 parser 155: /// @returns new string
156: String& key_dbt_to_string(DBT& key_dbt) {
157: return fconnection.key_dbt_to_string(key_dbt);
158: }
159: /// @returns new string if it not expired
160: String *data_dbt_to_string(const DBT& data_dbt) {
161: return fconnection.data_dbt_to_string(data_dbt);
1.2 parser 162: }
1.1 parser 163: };
164:
165: #endif
E-mail: