summaryrefslogtreecommitdiff
path: root/cpp/src/Freeze/DBI.h
blob: 9211d34098140b4b38bd5945d7b6df812120c0f3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
// **********************************************************************
//
// Copyright (c) 2001
// ZeroC, Inc.
// Huntsville, AL, USA
//
// All Rights Reserved
//
// **********************************************************************

#ifndef FREEZE_DB_I_H
#define FREEZE_DB_I_H

#include <IceUtil/IceUtil.h>
#include <Ice/Ice.h>
#include <Freeze/DB.h>
#include <db.h>

namespace Freeze
{

//
// Check a Berkeley DB return result, and throw an apropriate
// exception.
//
void checkBerkeleyDBReturn(int ret, const std::string&, const std::string&);

class DBEnvironmentI;
typedef IceUtil::Handle<DBEnvironmentI> DBEnvironmentIPtr;

class DBEnvironmentI : public DBEnvironment, public IceUtil::RecMutex
{
public:

    DBEnvironmentI(const ::Ice::CommunicatorPtr&, const std::string&);
    virtual ~DBEnvironmentI();

    virtual std::string getName();
    virtual ::Ice::CommunicatorPtr getCommunicator();

    virtual DBPtr openDB(const std::string&, bool);

    virtual DBTransactionPtr startTransaction();

    virtual void close();

private:

    // DBI needs access to add, remove & eraseDB
    friend class DBI;
    void add(const std::string&, const DBPtr&);
    void remove(const std::string&);
    void eraseDB(const std::string&);

    ::Ice::CommunicatorPtr _communicator;
    int _trace;

    ::DB_ENV* _dbEnv;

    std::string _name;
    std::string _errorPrefix;
    int _id;

    std::map<std::string, DBPtr> _dbMap;
};

class DBTransactionI : public DBTransaction, public IceUtil::Mutex
{
public:

    DBTransactionI(const ::Ice::CommunicatorPtr&, ::DB_ENV*, const std::string&);
    virtual ~DBTransactionI();

    virtual void commit();
    virtual void abort();

private:

    ::Ice::CommunicatorPtr _communicator;
    int _trace;

    ::DB_TXN* _tid;

    std::string _name;
    std::string _errorPrefix;
};


class DBI : public DB, public IceUtil::Mutex
{
public:
    
    DBI(const ::Ice::CommunicatorPtr&, const DBEnvironmentIPtr&, ::DB*, const std::string&, bool);
    virtual ~DBI();

    virtual std::string getName();
    virtual ::Ice::CommunicatorPtr getCommunicator();

    virtual ::Ice::Long getNumberOfRecords();

    virtual DBCursorPtr getCursor();
    virtual DBCursorPtr getCursorAtKey(const Key&);

    virtual void put(const Key&, const Value&);
    virtual bool contains(const Key&);
    virtual Value get(const Key&);
    virtual void del(const Key&);

    virtual void clear();

    virtual void close();
    virtual void remove();

    virtual EvictorPtr createEvictor(EvictorPersistenceMode);

private:

    ::Ice::CommunicatorPtr _communicator;
    int _trace;

    DBEnvironmentIPtr _dbEnvObj;
    ::DB* _db;

    std::string _name;
    std::string _errorPrefix;
};

typedef IceUtil::Handle<DBI> DBIPtr;

class DBCursorI : public DBCursor
{
public:

    DBCursorI(const DBIPtr&, const ::Ice::CommunicatorPtr&, const std::string&, DBC*);
    ~DBCursorI();

    virtual ::Ice::CommunicatorPtr getCommunicator();

    virtual void curr(Key& key, Value& value);
    virtual void set(const Value& value);
    virtual bool next();
    virtual bool prev();
    virtual void del();
    
    virtual DBCursorPtr clone();
    virtual void close();

private:

    DBIPtr _db;
    ::Ice::CommunicatorPtr _communicator;
    int _trace;

    std::string _name;
    std::string _errorPrefix;

    DBC* _cursor;
};

}

#endif