Esempio n. 1
0
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;
}
Esempio n. 2
0
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);
}