194 lines
5.6 KiB
C++
Executable File
194 lines
5.6 KiB
C++
Executable File
|
|
#include <iostream>
|
|
#include <fstream>
|
|
#include <string>
|
|
#include <vector>
|
|
#include <queue>
|
|
|
|
#include <getopt.h>
|
|
|
|
#include <boost/lexical_cast.hpp>
|
|
#include <boost/property_tree/ptree.hpp>
|
|
#include <boost/property_tree/ini_parser.hpp>
|
|
|
|
#include "../ag_gen/asset.h"
|
|
#include "../ag_gen/quality.h"
|
|
#include "../ag_gen/topology.h"
|
|
|
|
#include "../util/db_functions.h"
|
|
#include "../util/keyvalue.h"
|
|
|
|
void print_usage() {
|
|
std::cout << "Usage: fbitems [OPTIONS...]" << std::endl
|
|
<< "\t-h\tShows this help menu." << std::endl
|
|
<< "\t-i\tindex. If no index provided, all items will be found." << std::endl
|
|
<< "\t-c\tconfig section. If none is provided, default will be used." << std::endl;
|
|
}
|
|
|
|
std::string find_one_impl(std::vector<std::string> &str_vector, int index) {
|
|
std::vector<std::pair<size_t, std::string>> fbitems;
|
|
|
|
std::ostringstream output;
|
|
|
|
std::vector<EncodedQuality> cmpq_base;
|
|
auto cmpq = [](EncodedQuality &a, EncodedQuality &b) { return a.dec.asset_id < b.dec.asset_id; };
|
|
std::priority_queue<EncodedQuality, std::vector<EncodedQuality>, decltype(cmpq)> pqq(cmpq, cmpq_base);
|
|
|
|
std::vector<EncodedTopology> cmpt_base;
|
|
auto cmpt = [](EncodedTopology &a, EncodedTopology &b) { return a.dec.from_asset < b.dec.from_asset; };
|
|
std::priority_queue<EncodedTopology, std::vector<EncodedTopology>, decltype(cmpt)> pqt(cmpt, cmpt_base);
|
|
|
|
try {
|
|
fbitems = fetch_one_factbase_items(index);
|
|
} catch (CustomDBException &ex) {
|
|
std::cout << index << " not in DB" << std::endl;
|
|
exit(1);
|
|
}
|
|
|
|
for(auto &item : fbitems) {
|
|
std::string type = item.second;
|
|
if (type == "quality") {
|
|
EncodedQuality eq;
|
|
eq.enc = item.first;
|
|
pqq.emplace(eq);
|
|
} else {
|
|
EncodedTopology et;
|
|
et.enc = item.first;
|
|
pqt.emplace(et);
|
|
}
|
|
}
|
|
|
|
Keyvalue kv = fetch_kv();
|
|
std::vector<Asset> assets = fetch_all_assets(kv);
|
|
output << index << ":";
|
|
|
|
while(!pqq.empty()) {
|
|
EncodedQuality qual = pqq.top();
|
|
pqq.pop();
|
|
|
|
output << "\tquality:";
|
|
|
|
Asset asset = assets[qual.dec.asset_id];
|
|
//Asset asset = assets[0];
|
|
std::cout<< asset.get_name()<< std::endl;
|
|
output << asset.get_name() << ",";
|
|
std::string attr = str_vector[qual.dec.attr];
|
|
std::string val = str_vector[qual.dec.val];
|
|
output << attr << "=" << val;
|
|
output << " : " << qual.enc << "\n";
|
|
|
|
}
|
|
|
|
|
|
while(!pqt.empty()) {
|
|
EncodedTopology topo = pqt.top();
|
|
pqt.pop();
|
|
|
|
output << "\ttopology:";
|
|
|
|
Asset from_asset = assets[topo.dec.from_asset];
|
|
Asset to_asset = assets[topo.dec.to_asset];
|
|
|
|
output << from_asset.get_name() << "->" << to_asset.get_name() << ",";
|
|
|
|
std::string prop = str_vector[topo.dec.property];
|
|
std::string val = str_vector[topo.dec.value];
|
|
|
|
output << prop << "=" << val;
|
|
output << " : " << topo.enc << "\n";
|
|
}
|
|
|
|
output << std::endl;
|
|
|
|
return output.str();
|
|
}
|
|
|
|
void find_one(std::vector<std::string> &str_vector, int index) {
|
|
std::ofstream output("file.txt");
|
|
output << find_one_impl(str_vector, index);
|
|
}
|
|
|
|
void find_all(std::vector<std::string> &str_vector) {
|
|
int max = get_max_factbase_id();
|
|
std::ofstream output("file.txt");
|
|
|
|
for(auto i=0; i<=max; ++i) {
|
|
output << find_one_impl(str_vector, i);
|
|
}
|
|
|
|
output << std::endl;
|
|
output.close();
|
|
}
|
|
|
|
int main(int argc, char *argv[]) {
|
|
|
|
std::string opt_config;
|
|
std::string opt_index;
|
|
|
|
int opt;
|
|
while ((opt = getopt(argc, argv, "hc:i:")) != -1) {
|
|
switch (opt) {
|
|
case 'c':
|
|
opt_config = optarg;
|
|
break;
|
|
case 'i':
|
|
opt_index = optarg;
|
|
break;
|
|
case 'h':
|
|
print_usage();
|
|
return 0;
|
|
case '?':
|
|
if (optopt == 'c')
|
|
fprintf(stderr, "Option -%c requires an argument.\n", optopt);
|
|
exit(EXIT_FAILURE);
|
|
case ':':
|
|
fprintf(stderr, "wtf\n");
|
|
exit(EXIT_FAILURE);
|
|
default:
|
|
fprintf(stderr, "Unknown option -%c.\n", optopt);
|
|
print_usage();
|
|
exit(EXIT_FAILURE);
|
|
}
|
|
}
|
|
|
|
std::string config_section = (opt_config.empty()) ? "default" : opt_config;
|
|
|
|
boost::property_tree::ptree pt;
|
|
boost::property_tree::ini_parser::read_ini("config.ini", pt);
|
|
|
|
std::string dbName = pt.get<std::string>("database.name");
|
|
std::string host = pt.get<std::string>("database.host");
|
|
std::string port = pt.get<std::string>("database.port");
|
|
std::string username = pt.get<std::string>("database.username");
|
|
std::string password = pt.get<std::string>("database.password");
|
|
std::cout<<dbName<<std::endl;
|
|
std::cout<<host<<std::endl;
|
|
std::cout<<port<<std::endl;
|
|
std::cout<<username<<std::endl;
|
|
std::cout<<password<<std::endl;
|
|
|
|
init_db("dbname="+dbName+" user="+username+" host="+host+" port="+port+" password="+password);
|
|
std::cout << "Finished db connection." << std::endl;
|
|
|
|
// Keyvalue kv = fetch_facts();
|
|
// std::vector<std::string> str_vector = kv.get_str_vector();
|
|
|
|
std::vector<std::string> str_vector = fetch_keyvalues();
|
|
std::cout<<"Fetched keyvalues." << std::endl;
|
|
|
|
if (opt_index.empty()) {
|
|
find_all(str_vector);
|
|
} else {
|
|
try {
|
|
auto index = boost::lexical_cast<int>(opt_index);
|
|
} catch (boost::bad_lexical_cast &e) {
|
|
print_usage();
|
|
return 2;
|
|
}
|
|
}
|
|
|
|
// All done :)
|
|
std::cout << "Finished decoding. See output file.txt for results." << std::endl;
|
|
return 0;
|
|
}
|