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 }