-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathsegment.h
97 lines (80 loc) · 2.06 KB
/
segment.h
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
#ifndef _WAL_SEGMENT_H_
#define _WAL_SEGMENT_H_
#include <string>
#include "fio.h"
#include "memfile.h"
namespace wal{
const int FIRST_HALF = 0;
const int SECOND_HALF = 1;
class segment{
int index; //start index
std::string path;
memfile pmem;
public:
segment(int idx, const char *fpath):
index(idx),
path(fpath){
if(fio::fexist(fpath)){
pmem.load(fpath);
} else {
pmem.create(fpath);
}
}
segment(int idx, const char *fpath, const char *data, int len):
index(idx),
path(fpath){
pmem.create(fpath);
pmem.restore(data, len);
}
int write(int idx, const char *data, int len){
/*
if(idx!=pmem.lastindex()+1){
fprintf(stderr, "error! idx:%d is not equal to (lastindex:%d)+1\n", idx, pmem.lastindex());
return -1;
}
*/
return pmem.write(idx, data, len);
}
int read(int idx, char **data, int *len){
return pmem.read(idx, data, len);
}
int restore(const char *data, int len){
return pmem.restore(data, len);
}
int size(){
return pmem.size();
}
int leftsize(){
return (MEM_FILE_LIMIT - sizeof(int)*2 - pmem.size());
}
int release(){
::remove(path.c_str());
return 0;
}
segment *clonehalf(const int CLONE_HALF, int idx, const char *newpath){
segment *seg = nullptr;
char *data = nullptr;
int len =0;
if(CLONE_HALF==FIRST_HALF){ //first half
pmem.firsthalf(idx, &data, &len);
seg = new segment(index, newpath, data, len);
}else{ //second half
pmem.secondhalf(idx, &data, &len);
seg = new segment(idx, newpath, data, len);
}
return seg;
}
int repath(const char *newpath){
::rename(path.c_str(), newpath);
path = newpath;
return 0;
}
int startindex(){
return index;
}
int endindex(){
return pmem.lastindex();
}
};
} //end of namepsace wal
#endif