-
Jan Reher authored4b7743fd
#include <fstream>
#include <iostream>
#include <iomanip>
#include <string>
#include <vector>
#include <productiondatabaseclient.h>
#include <boost/program_options.hpp>
#include "toolbox.cpp"
using namespace std;
using namespace ProductionDatabase;
namespace po = boost::program_options;
static bool irradiatedAPDs = false;
static string fileName = "serials.dat";
static uint batchNo = 0;
static string username = "";
static string password = "";
static ProductionDatabaseClient *dbClient;
void processArgumentsAndQueryMissing(int m_argc, char* m_argv[]);
po::options_description setupDescription();
po::variables_map setupVariableMap(int argc, char* argv[], po::options_description desc);
void processVariablesAndQueryMissing(po::variables_map vm, po::options_description desc);
bool checkDatabaseConnectivityAndCredentials();
void getCredentials();
bool isResponseGood(DatabaseClientResponse response);
void getIrradiationStatus(string type);
void queryBatchNumber();
int main(int argc, char* argv[]) {
dbClient = new ProductionDatabaseClient();
processArgumentsAndQueryMissing(argc, argv);
vector<string> apdSerials = loadSerialsFromFileName(fileName);
if (!checkDatabaseConnectivityAndCredentials()) return 1;
dbClient->assignBatchNumberToAPDs(apdSerials,batchNo,irradiatedAPDs);
cout << "\nSuccessfully assigned Batch " << batchNo << " to APDs from serial file " << fileName << "." << endl << endl;
return (-apdSerials.empty());
}
bool checkDatabaseConnectivityAndCredentials(){
getCredentials();
DatabaseClientResponse response = dbClient->checkConnectivityAndCredentials();
return isResponseGood(response);
}
void getCredentials() {
if (username == "" || password == "") dbClient->queryCredentials();
else dbClient->setCredentials(username, password);
}
bool isResponseGood(DatabaseClientResponse response) {
if (response != Successful ) {
cerr << "Connection to database failed because of error: " << response << endl;
return false;
}
return true;
}
void processArgumentsAndQueryMissing(int m_argc, char* m_argv[]) {
po::options_description desc = setupDescription();
po::variables_map vm = setupVariableMap(m_argc, m_argv, desc);
processVariablesAndQueryMissing(vm, desc);
}
po::options_description setupDescription() {
po::options_description desc("Available options");
desc.add_options()
("help", "produce help message")
("type", po::value<string>(), "(required) type of APDs [new, irr]")
("batch", po::value<int>(), "(required) batch number to be set")
("fileName", po::value<string>(), "file name or serial numbers [serials.dat]")
("user", po::value<string>(), "User name to connect to DB. Only used when combined with pass!")
("pass", po::value<string>(), "Password to connect to DB. Only used when combined with user!")
;
return desc;
}
po::variables_map setupVariableMap(int argc, char* argv[], po::options_description desc) {
po::variables_map vm;
po::store(po::parse_command_line(argc, argv, desc), vm);
po::notify(vm);
return vm;
}
void processVariablesAndQueryMissing(po::variables_map vm, po::options_description desc) {
if (vm.count("help")) {
cout << desc << "\n";
exit(0);
}
if (vm.count("batch")) {
batchNo = uint(vm["batch"].as<int>());
} else {
queryBatchNumber();
}
if (vm.count("fileName")) {
fileName = vm["fileName"].as<string>();
cout << "Reading serials from " << fileName << endl;
}
if (vm.count("user")) {
username = vm["user"].as<string>();
}
if (vm.count("pass")) {
password = vm["pass"].as<string>();
}
if (vm.count("type")) {
getIrradiationStatus(vm["type"].as<string>());
} else {
irradiatedAPDs = (batchNo >= 10000);
}
}
void queryBatchNumber() {
cout << "Which Batch do these APDs belong to?" << endl;
try {
cin >> batchNo;
cout << endl;
} catch (...) {
batchNo = 0;
}
if (batchNo <= 0) {
cerr << "Invalid batch number!" << endl;
exit(-1);
}
}
void getIrradiationStatus(string type) {
if (type == "new") {
irradiatedAPDs = false;
}
else if (type == "irr") {
irradiatedAPDs = true;
} else {
cerr << "Invalid type: " << type << "! Possible APD types: 'new' or 'irr'" << endl;
exit(0);
}
}