@@ -17,147 +17,111 @@ const char* const op_name = "OP";
1717const char * const name_delimiter = " :" ;
1818const 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-
3020void 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 (" \t operation: %s" , kfvOp (db_item).c_str ());
29+ SWSS_LOG_NOTICE (" \t hash: %s" , kfvKey (db_item).c_str ());
30+ SWSS_LOG_NOTICE (" \t fields: [" );
31+ for (auto fv: kfvFieldsValues (db_item))
32+ SWSS_LOG_NOTICE (" \t\t field: %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