Annotation of parser3/src/include/pa_db_connection.h, revision 1.5
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.5 ! parser 7: $Id: pa_db_connection.h,v 1.4 2001/10/24 09:03:42 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.2 parser 62: void _delete(const String& key);
1.1 parser 63:
1.3 parser 64: DB_Cursor cursor(const String *source);
65:
1.1 parser 66: private:
67:
68: DB_ENV& fdbenv;
1.3 parser 69: const String& ffile_spec; const char *file_spec_cstr;
1.1 parser 70: Pool *fservices_pool;
71: DB *db;
72: bool needs_recovery;
1.2 parser 73: DB_TXN *ftid;
1.1 parser 74: time_t time_used;
75:
1.2 parser 76: private: // transaction
77:
78: /// commits current transaction, restores previous transaction handle
79: void commit_restore(DB_TXN *atid) {
80: if(ftid)
81: check("txn_commit", &ffile_spec, txn_commit(ftid));
82:
83: ftid=atid;
84: }
85:
86: /// rolls current transaction back, restores previous transaction handle
87: void rollback_restore(DB_TXN *atid) {
88: if(ftid)
89: check("txn_abort", &ffile_spec, txn_abort(ftid));
90:
91: ftid=atid;
92: }
93:
94: /// stars new current trunsaction @returns previous transaction handle
95: DB_TXN *transaction_begin_save() {
96: DB_TXN *result=ftid;
97: check("txn_begin", &ffile_spec, ::txn_begin(fdbenv.tx_info, 0/*parent*/, &ftid));
98:
99: return result;
100: }
101:
1.1 parser 102: private:
103:
104: void check(const char *operation, const String *source, int error);
105: void *malloc(size_t size) { return fservices_pool->malloc(size); }
106: void *calloc(size_t size) { return fservices_pool->calloc(size); }
1.4 parser 107: /// pass empty dbt, would fill it from string
108: void key_string_to_dbt(const String& key_string, DBT& key_result);
1.5 ! parser 109: /// @returns new string
! 110: String& key_dbt_to_string(const DBT& key_dbt);
1.4 parser 111: /// pass empty dbt, would fill it from string
1.5 ! parser 112: void data_string_to_dbt(const String& data_string, time_t time_to_die,
! 113: DBT& data_result);
! 114: /// @returns new string if it not expired
! 115: String *data_dbt_to_string(const DBT& data_dbt);
1.2 parser 116:
117: };
118:
119: /// Auto-object used for temporary changing DB_Connection::tid.
120: class Auto_transaction {
121: DB_Connection& fconnection;
122: bool marked_to_rollback;
123: DB_TXN *saved_tid;
124: public:
125: Auto_transaction(DB_Connection& aconnection) :
126: fconnection(aconnection), marked_to_rollback(false),
127: saved_tid(aconnection.transaction_begin_save()) {
128: }
129: ~Auto_transaction() {
130: if(marked_to_rollback)
131: fconnection.rollback_restore(saved_tid);
132: else
133: fconnection.commit_restore(saved_tid);
134: }
135: void mark_to_rollback() {
136: marked_to_rollback=true;
1.3 parser 137: }
138: };
139:
140: /// DB cursor. handy wrapper around low level <db.h> calls
141: class DB_Cursor {
142: friend DB_Connection;
143: private:
144: DB_Cursor(DB_Connection& aconnection, const String *asource);
145: public:
146: ~DB_Cursor();
1.4 parser 147: /// pass empty strings to key&data, would fill them
1.5 ! parser 148: bool get(String *& key, String *& data, u_int32_t flags);
1.3 parser 149: private:
150: const String *fsource;
151: DB_Connection& fconnection;
152: DBC *cursor;
153: private:
154: void check(const char *operation, const String *source, int error) {
155: fconnection.check(operation, source, error);
156: }
1.5 ! parser 157: /// @returns new string
! 158: String& key_dbt_to_string(DBT& key_dbt) {
! 159: return fconnection.key_dbt_to_string(key_dbt);
! 160: }
! 161: /// @returns new string if it not expired
! 162: String *data_dbt_to_string(const DBT& data_dbt) {
! 163: return fconnection.data_dbt_to_string(data_dbt);
1.2 parser 164: }
1.1 parser 165: };
166:
167: #endif
E-mail: