Skip to content

Commit 5a0de91

Browse files
author
Shuotian Cheng
committed
swssconfig: Refactoring code
1 parent 142673a commit 5a0de91

1 file changed

Lines changed: 82 additions & 110 deletions

File tree

swssconfig/swssconfig.cpp

Lines changed: 82 additions & 110 deletions
Original file line numberDiff line numberDiff line change
@@ -17,147 +17,111 @@ const char* const op_name = "OP";
1717
const char* const name_delimiter = ":";
1818
const int el_count = 2;
1919

20-
#define _in_
21-
#define _out_
22-
#define _inout_
23-
24-
typedef struct _sonic_db_item_t {
25-
string op_val;
26-
string hash_name;
27-
std::vector<FieldValueTuple> fvVector;
28-
}sonic_db_item_t;
29-
3020
void usage(char **argv)
3121
{
32-
cout <<"Usage: " << argv[0] << " json_file_path\n";
22+
cout << "Usage: " << argv[0] << " json_file_path\n";
3323
}
3424

35-
void dump_db_item_cout(_in_ sonic_db_item_t &db_item)
25+
void dump_db_item(KeyOpFieldsValuesTuple &db_item)
3626
{
37-
cout << "db_item [\n";
38-
cout << "operation: " << db_item.op_val << "\n";
39-
cout << "hash: " << db_item.hash_name << "\n";
40-
cout << "[\n";
41-
for(auto &fv: db_item.fvVector) {
42-
cout << "field: " << fvField(fv);
43-
cout << "value: " << fvValue(fv) << "\n";
44-
}
45-
cout << "]\n";
46-
cout << "]\n";
47-
}
48-
void dump_db_item(_in_ sonic_db_item_t &db_item)
49-
{
50-
SWSS_LOG_NOTICE("db_item: [\n");
51-
SWSS_LOG_NOTICE("operation: %s", db_item.op_val.c_str());
52-
SWSS_LOG_NOTICE("hash: %s\n", db_item.hash_name.c_str());
53-
SWSS_LOG_NOTICE("fields: [\n");
54-
for(auto &fv: db_item.fvVector) {
55-
SWSS_LOG_NOTICE("field: %s", fvField(fv).c_str());
56-
SWSS_LOG_NOTICE("value: %s\n", fvValue(fv).c_str());
57-
}
58-
SWSS_LOG_NOTICE("]\n");
59-
SWSS_LOG_NOTICE("]\n");
27+
SWSS_LOG_NOTICE("db_item: [");
28+
SWSS_LOG_NOTICE("\toperation: %s", kfvOp(db_item).c_str());
29+
SWSS_LOG_NOTICE("\thash: %s", kfvKey(db_item).c_str());
30+
SWSS_LOG_NOTICE("\tfields: [");
31+
for (auto fv: kfvFieldsValues(db_item))
32+
SWSS_LOG_NOTICE("\t\tfield: %s value: %s", fvField(fv).c_str(), fvValue(fv).c_str());
33+
SWSS_LOG_NOTICE("\t]");
34+
SWSS_LOG_NOTICE("]");
6035
}
6136

62-
bool write_db_data(_in_ std::vector<sonic_db_item_t> &db_items)
37+
bool write_db_data(vector<KeyOpFieldsValuesTuple> &db_items)
6338
{
6439
DBConnector db(APPL_DB, hostname, db_port, 0);
65-
#ifdef _DUMPT_TO_COUT_
66-
for (sonic_db_item_t &db_item : db_items) {
67-
dump_db_item_cout(db_item);
68-
}
69-
#endif //_DUMPT_TO_COUT_
70-
for (sonic_db_item_t &db_item : db_items) {
40+
for (auto &db_item : db_items)
41+
{
7142
dump_db_item(db_item);
7243

73-
std::size_t pos = db_item.hash_name.find(name_delimiter);
74-
if((string::npos == pos) || ((db_item.hash_name.size() - 1) == pos)) {
75-
SWSS_LOG_ERROR("Invalid formatted hash:%s\n", db_item.hash_name.c_str());
44+
string key = kfvKey(db_item);
45+
size_t pos = key.find(name_delimiter);
46+
if ((string::npos == pos) || ((key.size() - 1) == pos))
47+
{
48+
SWSS_LOG_ERROR("Invalid formatted hash:%s\n", key.c_str());
7649
return false;
7750
}
78-
string table_name = db_item.hash_name.substr(0, pos);
79-
string key_name = db_item.hash_name.substr(pos + 1);
51+
string table_name = key.substr(0, pos);
52+
string key_name = key.substr(pos + 1);
8053
ProducerTable producer(&db, table_name);
8154

82-
if(db_item.op_val == SET_COMMAND) {
83-
producer.set(key_name, db_item.fvVector, SET_COMMAND);
84-
}
85-
if(db_item.op_val == DEL_COMMAND) {
55+
if (kfvOp(db_item) == SET_COMMAND)
56+
producer.set(key_name, kfvFieldsValues(db_item), SET_COMMAND);
57+
if (kfvOp(db_item) == DEL_COMMAND)
8658
producer.del(key_name, DEL_COMMAND);
87-
}
8859
}
8960
return true;
9061
}
9162

92-
bool load_json_db_data(
93-
_in_ std::iostream &fs,
94-
_out_ std::vector<sonic_db_item_t> &db_items)
63+
bool load_json_db_data(iostream &fs, vector<KeyOpFieldsValuesTuple> &db_items)
9564
{
9665
json json_array;
9766
fs >> json_array;
98-
if(!json_array.is_array()) {
99-
SWSS_LOG_ERROR("root element must be an array\n");
67+
68+
if (!json_array.is_array())
69+
{
70+
SWSS_LOG_ERROR("Root element must be an array.");
10071
return false;
10172
}
10273

103-
for (size_t i = 0; i < json_array.size(); i++) {
104-
74+
for (size_t i = 0; i < json_array.size(); i++)
75+
{
10576
auto &arr_item = json_array[i];
106-
107-
if(arr_item.is_object()) {
108-
if(el_count != arr_item.size()) {
109-
SWSS_LOG_ERROR("root element must be an array\n");
77+
78+
if (arr_item.is_object())
79+
{
80+
if (el_count != arr_item.size())
81+
{
82+
SWSS_LOG_ERROR("Chlid elements must have both key and op entry. %s",
83+
arr_item.dump().c_str());
11084
return false;
11185
}
112-
113-
db_items.push_back(sonic_db_item_t());
114-
sonic_db_item_t &cur_db_item = db_items[db_items.size() - 1];
115-
116-
//
117-
// iterate over array items
118-
// each item must have following structure:
119-
// {
120-
// "OP":"SET/DEL",
121-
// db_key_name {
122-
// 1*Nfield:value
123-
// }
124-
// }
125-
//
126-
//
127-
for (json::iterator child_it = arr_item.begin(); child_it != arr_item.end(); ++child_it) {
86+
87+
db_items.push_back(KeyOpFieldsValuesTuple());
88+
auto &cur_db_item = db_items[db_items.size() - 1];
89+
90+
for (json::iterator child_it = arr_item.begin(); child_it != arr_item.end(); child_it++) {
12891
auto cur_obj_key = child_it.key();
12992
auto &cur_obj = child_it.value();
13093

13194
string field_str;
132-
int val;
13395
string value_str;
134-
135-
if(cur_obj.is_object()) {
136-
cur_db_item.hash_name = cur_obj_key;
137-
for (json::iterator cur_obj_it = cur_obj.begin(); cur_obj_it != cur_obj.end(); ++cur_obj_it) {
138-
139-
field_str = cur_obj_it.key();
140-
if((*cur_obj_it).is_number()) {
141-
val = (*cur_obj_it).get<int>();
142-
value_str = std::to_string(val);
143-
}
144-
if((*cur_obj_it).is_string()) {
96+
97+
if (cur_obj.is_object()) {
98+
kfvKey(cur_db_item) = cur_obj_key;
99+
for (json::iterator cur_obj_it = cur_obj.begin(); cur_obj_it != cur_obj.end(); cur_obj_it++)
100+
{
101+
string field_str = cur_obj_it.key();
102+
string value_str;
103+
if ((*cur_obj_it).is_number())
104+
value_str = to_string((*cur_obj_it).get<int>());
105+
else if ((*cur_obj_it).is_string())
145106
value_str = (*cur_obj_it).get<string>();
146-
}
147-
cur_db_item.fvVector.push_back(FieldValueTuple(field_str, value_str));
107+
kfvFieldsValues(cur_db_item).push_back(FieldValueTuple(field_str, value_str));
148108
}
149109
}
150-
else {
151-
if(op_name != child_it.key()) {
152-
SWSS_LOG_ERROR("Invalid entry. expected item:%s\n", op_name);
110+
else
111+
{
112+
if (op_name != child_it.key())
113+
{
114+
SWSS_LOG_ERROR("Invalid entry. %s", arr_item.dump().c_str());
153115
return false;
154116
}
155-
cur_db_item.op_val = cur_obj.get<std::string>();
117+
kfvOp(cur_db_item) = cur_obj.get<string>();
156118
}
157119
}
158120
}
159-
else {
160-
SWSS_LOG_WARN("Skipping processing of an array item which is not an object\n:%s", arr_item.dump().c_str());
121+
else
122+
{
123+
SWSS_LOG_ERROR("Child elements must be objects. element:%s", arr_item.dump().c_str());
124+
return false;
161125
}
162126
}
163127
return true;
@@ -172,28 +136,36 @@ int main(int argc, char **argv)
172136
usage(argv);
173137
exit(EXIT_FAILURE);
174138
}
175-
std::vector<sonic_db_item_t> db_items;
176-
std::fstream fs;
177-
try {
178-
fs.open (argv[1], std::fstream::in | std::fstream::out | std::fstream::app);
179-
if(!load_json_db_data(fs, db_items)) {
180-
SWSS_LOG_ERROR("Failed loading data from json file\n");
139+
140+
vector<KeyOpFieldsValuesTuple> db_items;
141+
fstream fs;
142+
try
143+
{
144+
fs.open(argv[1], fstream::in);
145+
if (!load_json_db_data(fs, db_items))
146+
{
147+
SWSS_LOG_ERROR("Failed loading data from json file.");
181148
fs.close();
182149
return EXIT_FAILURE;
183150
}
184151
fs.close();
185152
}
186-
catch(...) {
153+
catch(...)
154+
{
187155
cout << "Failed loading json file: " << argv[1] << " Please refer to logs\n";
188156
return EXIT_FAILURE;
189157
}
190-
try {
191-
if(!write_db_data(db_items)) {
158+
159+
try
160+
{
161+
if (!write_db_data(db_items))
162+
{
192163
SWSS_LOG_ERROR("Failed writing data to db\n");
193164
return EXIT_FAILURE;
194-
}
165+
}
195166
}
196-
catch(...) {
167+
catch(...)
168+
{
197169
cout << "Failed applying settings from json file: " << argv[1] << " Please refer to logs\n";
198170
return EXIT_FAILURE;
199171
}

0 commit comments

Comments
 (0)