cooper_member.db文件读写

文件字节序格式:

| member_count(1 Byte) |

| member_id(8 Bytes) | node_count(1 Byte) | nodes_id(8*node_count Bytes) |
......

 

读取结构:

////  member_ip0: [node_ip0, node_ip1, ...],
//  member_ip1: [node_ip0, node_ip1, ...]
//
typedef map<string, vector<string> > CooperMemberType;

 

读写代码:

 1 // | member_count(1 B) |
 2 // | member_id(kMemberIDLenth B) | node_count(1 B) | nodes_id(kNodeIDLenth*node_count B) |
 3 // ......
 4 bool GetCooperMembers(CooperMemberType& cp_members)
 5 {
 6     cp_members.clear();
 7     BinaryFile bfile(kCooperMemberDBFile);
 8     
 9     if (ReadBinaryFile(bfile) < 0) {
10         return false;
11     }
12     
13     char* cursor = bfile.file_buf_;
14     unsigned char members_cnt = cursor[0];
15     cursor += 1;
16     // printf("There are %d members.\n", members_cnt);
17     
18     char member_id[kMemberIDLenth + 1];
19     string member_ip("");
20     
21     for (int i = 0; i != members_cnt; ++i) {
22         memset(member_id, 0, sizeof(member_id));
23         strncpy(member_id, cursor, kMemberIDLenth);
24         cursor += kMemberIDLenth;
25         
26         char node_count = cursor[0];
27         cursor += 1;
28         char node_id[kNodeIDLenth + 1];
29         vector<string> member_nodes;
30         string node_ip("");
31         
32         for (int j = 0; j != node_count; ++j) {
33             memset(node_id, 0, sizeof(node_id));
34             strncpy(node_id, cursor, kNodeIDLenth);
35             cursor += kNodeIDLenth;
36             
37             ConvertIDtoIP(string(node_id), node_ip);
38             member_nodes.push_back(node_ip);
39         }
40         
41         ConvertIDtoIP(string(member_id), member_ip);
42         cp_members.insert(make_pair(member_ip, member_nodes));
43     }
44     
45     return true;
46 }
47 
48 // member_ip0: [node_ip0, node_ip1, ...]
49 // member_ip1: [node_ip0, node_ip1, ...]
50 bool SetCooperMembers(const CooperMemberType& cp_members)
51 {
52     unsigned char member_count = cp_members.size();
53     unsigned int total_buf_size = 1 + (kMemberIDLenth + 1 + kNodeIDLenth * kMaxMemberNodesNumber) * member_count;
54     
55     BinaryFile bfile(kCooperMemberDBFile);
56     bfile.InitBuf(total_buf_size);
57     char* cursor = bfile.file_buf_;
58     
59     cursor[0] = member_count;
60     cursor += 1;
61     
62     CooperMemberType::const_iterator it = cp_members.begin();
63     string member_id("");
64     
65     while (it != cp_members.end()) {
66         ConvertIPtoID(it->first, member_id);
67         strncpy(cursor, member_id.c_str(), kMemberIDLenth);
68         cursor += kMemberIDLenth;
69         
70         unsigned char node_count = it->second.size();
71         cursor[0] = node_count;
72         cursor += 1;
73         string node_id("");
74         
75         for (int i = 0; i != node_count; ++i) {
76             ConvertIPtoID(it->second[i], node_id);
77             strncpy(cursor, node_id.c_str(), kNodeIDLenth);
78             cursor += kNodeIDLenth;
79         }
80         
81         ++it;
82     }
83     
84     if (WriteBinaryFile(bfile) < 0) {
85         return false;
86     }
87     
88     return true;
89 }

 

测试代码:

 1 void TestInitCooperMembers(CooperMemberType& cp_members, int member_count)
 2 {
 3     cp_members.clear();
 4     vector<string> nodes;
 5     
 6     for (int i = 1; i != member_count + 1; ++i) {
 7         nodes.clear();
 8         int nodes_cnt = i % 5 + 4;
 9         
10         for (int j = 0; j != nodes_cnt; ++j) {
11             char node_ip[16];
12             memset(node_ip, 0, sizeof(node_ip));
13             snprintf(node_ip, sizeof(node_ip), "%d.%d.%d.12%d", i, i, i, j);
14             nodes.push_back(string(node_ip));
15         }
16         
17         char member_ip[16];
18         memset(member_ip, 0, sizeof(member_ip));
19         snprintf(member_ip, sizeof(member_ip), "%d.%d.%d.%d", i, i, i, i);
20         cp_members.insert(make_pair(string(member_ip), nodes));
21     }
22 }
23 
24 void PrintCooperMembers(const CooperMemberType& cp_members)
25 {
26     CooperMemberType::const_iterator it = cp_members.begin();
27     
28     while (it != cp_members.end()) {
29         cout << it->first << endl;
30         cout << "[" << endl << "    ";
31         
32         for (int i = 0; i != it->second.size(); ++i) {
33             cout << it->second[i] << " ";
34         }
35         
36         cout << endl << "]" << endl << endl;
37         ++it;
38     }
39 }

 

posted @ 2017-09-20 12:33  lausaa  阅读(196)  评论(0)    收藏  举报