Repository navigation
Expand file tree
/
Copy pathDBMakerExtend.java
More file actions
131 lines (104 loc) · 3.82 KB
/
Copy pathDBMakerExtend.java
File metadata and controls
131 lines (104 loc) · 3.82 KB
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
package examples;
import org.mapdb.*;
import java.io.File;
import java.util.Queue;
import java.util.concurrent.ConcurrentLinkedQueue;
/**
* DBMaker behavior can be extended or modified by extending class and overriding `extendXXX()` methods.
* Those methods are not yet documented, so you have to study `DBMaker.java` source code.
*
* This example shows how-to add extra logging into DBMaker
* It also add extra option to optionally disable logging
*/
public class DBMakerExtend {
//this class extends `DBMaker` and add our own options
//generics are used so each option returns `ExtendedDBMaker` instead of old `DBMaker`
static class ExtendedDBMaker extends DBMaker<ExtendedDBMaker>{
//override one of protected extension methods
@Override
protected Engine extendWrapStore(Engine engine) {
//do not wrap if this option was disabled
if(!loggingEnabled)
return engine;
//modify engine behaviour by wrapping it
return new DebugEngine(engine);
}
//logging is enabled by default in our DBMaker
protected boolean loggingEnabled = true;
//there is also new option to disable it
ExtendedDBMaker loggingDisable(){
loggingEnabled = false;
return getThis();
}
}
public static void main(String[] args) {
File dbFile = new File("db");
DB db = new ExtendedDBMaker() //static constructors can not be used on extended class
._newFileDB(dbFile) //so use constructor and call method with underscore
.compressionEnable()
.loggingDisable() //this option does not exist in original DBMaker
.make();
BTreeMap map = db.getTreeMap("map");
//and now with DB as usual
}
}
class DebugEngine extends EngineWrapper{
final Queue<Record> records = new ConcurrentLinkedQueue<Record>();
protected static final class Record{
final long recid;
final String desc;
public Record(long recid, String desc) {
this.recid = recid;
this.desc = desc;
}
}
public DebugEngine(Engine engine) {
super(engine);
}
@Override
public long preallocate() {
long recid = super.preallocate();
records.add(new Record(recid,"PREALLOC"));
return recid;
}
@Override
public void preallocate(long[] recids) {
super.preallocate(recids);
for(long recid:recids)
records.add(new Record(recid,"PREALLOC"));
}
@Override
public <A> long put(A value, Serializer<A> serializer) {
long recid = super.put(value, serializer);
records.add(new Record(recid,
"INSERT \n val:"+value+"\n ser:"+serializer
));
return recid;
}
@Override
public <A> A get(long recid, Serializer<A> serializer) {
A ret = super.get(recid, serializer);
records.add(new Record(recid,
"GET \n val:"+ret+"\n ser:"+serializer
));
return ret;
}
@Override
public <A> void update(long recid, A value, Serializer<A> serializer) {
super.update(recid, value, serializer);
records.add(new Record(recid,
"UPDATE \n val:"+value+"\n ser:"+serializer
));
}
@Override
public <A> boolean compareAndSwap(long recid, A expectedOldValue, A newValue, Serializer<A> serializer) {
final boolean ret = super.compareAndSwap(recid, expectedOldValue, newValue, serializer);
records.add(new Record(recid,"CAS "+ret+"\n newVal:"+newValue+"\n ser:"+serializer));
return ret;
}
@Override
public <A> void delete(long recid, Serializer<A> serializer){
super.delete(recid,serializer);
records.add(new Record(recid,"DEL"));
}
}