parsed_query parser(const std::string& csql_query) { std::string sql_query(csql_query); parsed_query p; p.agg_type = db::aggregate_type::NONE; p.is_join = false; p.logic_op = db::logic_type::NONE; std::stringstream ss(sql_query); std::string token; int number = 0; bool starred = false; while(ss >> token) { if(number == 0) { // select to_lower(token); if(token != "select") { throw "UnimplementedError: Operation " + token + " Unsupported."; } p.query_type = token; } else if(number == 1) { // fields if(token == "*") { starred = true; } else { starred = false; std::stringstream tokenizer(token); std::string field; while(std::getline(tokenizer,field,',')) { sanitize_field(field, p); p.fields.push_back(field); } } } else if(number == 2) { // from to_lower(token); if(token != "from") { throw "QueryError: Malformed Query."; } } else if(number == 3) { // tables std::stringstream tokenizer(token); std::string table; while(std::getline(tokenizer,table,',')) { p.tables.push_back(table); } if(starred == true) { for(auto& table : p.tables) { std::vector<std::string> b = get_table(table).fields(); std::vector<std::string> c; for(auto& var : b) { c.push_back(table + "." + var); } p.fields.reserve(p.fields.size() + b.size()); p.fields.insert(p.fields.end(), c.begin(), c.end()); c.clear(); b.clear(); } } else { for(auto& field : p.fields) { complete_field(field,p); } } if(!p.dis_column.empty()) { complete_field(p.dis_column,p); } if(!p.agg_column.empty()) { complete_field(p.agg_column,p); } if(p.tables.size() > 1) { // if greater than one table, join. p.is_join = true; } } else if(number == 4) { // where to_lower(token); if(token != "where") { throw "QueryError: Malformed Query."; } } else { // condition try { if(std::regex_match(token,std::regex("([a-zA-Z0-9.]+)[=<>]([-+]?[0-9]+)"))) { // not join condition for(auto &c : {"=",">","<"}) { if(token.find_last_of(c) != std::string::npos) { int index = token.find_last_of(c); int value = std::stoi(token.substr(index+1)); std::string field = token.substr(0,index); complete_field(field,p); p.conditionals.push_back(std::make_tuple(field, c, value)); } } } else if (std::regex_match(token,std::regex("([a-zA-Z0-9.]+)[=<>]([a-zA-Z0-9.]+)"))) { // join condition for(auto &c : {"=",">","<"}) { if(token.find_last_of(c) != std::string::npos) { int index = token.find_last_of(c); std::string field2 = token.substr(index+1); std::string field1 = token.substr(0,index); complete_field(field1,p); complete_field(field2,p); p.string_conditionals.push_back(std::make_tuple(field1, c, field2)); } } } else { // logical op to_lower(token); if(token == "or" or token == "||") { p.logic_op = db::logic_type::OR; } else if (token == "and" or token == "&&") { p.logic_op = db::logic_type::AND; } else { throw "QueryError: Malformed Query."; } } } catch(std::regex_error& e) { throw std::string("QueryError: ") + std::string(e.what()); } } number += 1; } return p; }
static void complete_fields (const char *prefix) { GHashTable *h; h = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL); complete_field (h, NULL, nmc_fields_ip4_config); complete_field (h, NULL, nmc_fields_dhcp4_config); complete_field (h, NULL, nmc_fields_ip6_config); complete_field (h, NULL, nmc_fields_dhcp6_config); complete_field (h, NULL, nmc_fields_con_show); complete_field (h, NULL, nmc_fields_settings_names); complete_field (h, NULL, nmc_fields_con_active_details_general); complete_field (h, NULL, nmc_fields_con_active_details_vpn); complete_field (h, NULL, nmc_fields_con_active_details_groups); complete_field (h, NULL, nmc_fields_dev_status); complete_field (h, NULL, nmc_fields_dev_show_general); complete_field (h, NULL, nmc_fields_dev_show_connections); complete_field (h, NULL, nmc_fields_dev_show_cap); complete_field (h, NULL, nmc_fields_dev_show_wired_prop); complete_field (h, NULL, nmc_fields_dev_show_wifi_prop); complete_field (h, NULL, nmc_fields_dev_show_wimax_prop); complete_field (h, NULL, nmc_fields_dev_wifi_list); complete_field (h, NULL, nmc_fields_dev_wimax_list); complete_field (h, NULL, nmc_fields_dev_show_master_prop); complete_field (h, NULL, nmc_fields_dev_show_team_prop); complete_field (h, NULL, nmc_fields_dev_show_vlan_prop); complete_field (h, NULL, nmc_fields_dev_show_bluetooth); complete_field (h, NULL, nmc_fields_dev_show_sections); complete_field (h, NULL, nmc_fields_dev_lldp_list); complete_field (h, "connection", nmc_fields_setting_connection); complete_field (h, "wired", nmc_fields_setting_wired); complete_field (h, "8021X", nmc_fields_setting_8021X); complete_field (h, "wireless", nmc_fields_setting_wireless); complete_field (h, "wireless_security", nmc_fields_setting_wireless_security); complete_field (h, "ip4-config", nmc_fields_setting_ip4_config); complete_field (h, "ip6-config", nmc_fields_setting_ip6_config); complete_field (h, "serial", nmc_fields_setting_serial); complete_field (h, "ppp", nmc_fields_setting_ppp); complete_field (h, "pppoe", nmc_fields_setting_pppoe); complete_field (h, "adsl", nmc_fields_setting_adsl); complete_field (h, "gsm", nmc_fields_setting_gsm); complete_field (h, "cdma", nmc_fields_setting_cdma); complete_field (h, "bluetooth", nmc_fields_setting_bluetooth); complete_field (h, "olpc-mesh", nmc_fields_setting_olpc_mesh); complete_field (h, "vpn", nmc_fields_setting_vpn); complete_field (h, "wimax", nmc_fields_setting_wimax); complete_field (h, "infiniband", nmc_fields_setting_infiniband); complete_field (h, "bond", nmc_fields_setting_bond); complete_field (h, "vlan", nmc_fields_setting_vlan); complete_field (h, "bridge", nmc_fields_setting_bridge); complete_field (h, "bridge-port", nmc_fields_setting_bridge_port); complete_field (h, "team", nmc_fields_setting_team); complete_field (h, "team0port", nmc_fields_setting_team_port); complete_field (h, "dcb", nmc_fields_setting_dcb); complete_field (h, "tun", nmc_fields_setting_tun); complete_field (h, "ip-tunnel", nmc_fields_setting_ip_tunnel); complete_field (h, "macvlan", nmc_fields_setting_macvlan); complete_field (h, "vxlan", nmc_fields_setting_vxlan); g_hash_table_foreach (h, complete_one, (gpointer) prefix); g_hash_table_destroy (h); }