Skip to content
Snippets Groups Projects
aql.cpp 3.09 KiB
Newer Older
  • Learn to ignore specific revisions
  • Jan Trávníček's avatar
    Jan Trávníček committed
    /*
     * aql.cpp
     *
    
     *  Created on: 1. 7. 2017
    
    Jan Trávníček's avatar
    Jan Trávníček committed
     *	  Author: Jan Travnicek
     */
    
    
    #include <istream>
    #include <iostream>
    
    template < class T, class U >
    std::istream& operator>> ( std::istream & in, std::pair < T, U > & value ) {
    	std::string tmp;
    	in >> tmp;
    	size_t posEqual = tmp.find ( "=" );
    
    	if ( posEqual == std::string::npos )
    		in.setstate(std::ios_base::failbit);
    
    	value.first = tmp.substr ( 0, posEqual );
    	value.second = tmp.substr ( posEqual + 1, tmp.size ( ) );
    
    	if ( value.first.empty ( ) || value.second.empty ( ) )
    		in.setstate(std::ios_base::failbit);
    
    	return in;
    }
    
    Jan Trávníček's avatar
    Jan Trávníček committed
    
    
    #include <string>
    
    #include <measure>
    
    Jan Trávníček's avatar
    Jan Trávníček committed
    #include <tclap/CmdLine.h>
    #include <global/GlobalData.h>
    
    
    #include "prompt/Prompt.h"
    
    Jan Trávníček's avatar
    Jan Trávníček committed
    
    
    #include <factory/XmlDataFactory.hpp>
    
    
    namespace TCLAP {
    
    Jan Trávníček's avatar
    Jan Trávníček committed
    
    
    template < class T, class U >
    struct ArgTraits < std::pair < T, U > > {
    	typedef ValueLike ValueCategory;
    };
    
    } /* namespace TCLAP */
    
    int main ( int argc, char * argv[] ) {
    
    Jan Trávníček's avatar
    Jan Trávníček committed
    
    	try {
    		common::GlobalData::argc = argc;
    		common::GlobalData::argv = argv;
    
    		TCLAP::CmdLine cmd ( "Algorithms query language binary", ' ', "0.01" );
    
    
    		TCLAP::MultiArg < std::string > queries ( "q", "query", "Query string", false, "string" );
    		cmd.add ( queries );
    
    Jan Trávníček's avatar
    Jan Trávníček committed
    
    		TCLAP::SwitchArg measure ( "m", "measure", "Measure times", false );
    		cmd.add ( measure );
    
    		TCLAP::SwitchArg verbose ( "v", "verbose", "Be verbose", false );
    		cmd.add ( verbose );
    
    
    		TCLAP::MultiArg < std::pair < std::string, std::string > > params ( "p", "params", "Query index", false, "pair < string, string >" );
    		cmd.add ( params );
    
    
    Jan Trávníček's avatar
    Jan Trávníček committed
    		cmd.parse ( argc, argv );
    
    		if(verbose.isSet())
    			common::GlobalData::verbose = true;
    		if(measure.isSet())
    			common::GlobalData::measure = true;
    
    		measurements::start ( "Overal", measurements::Type::OVERALL );
    
    
    		cli::Environment environment;
    
    		environment.setBinding ( "stdin", "-" );
    		environment.setBinding ( "stdout", "-" );
    
    
    		for ( const std::pair < std::string, std::string > & param : params.getValue ( ) ) {
    
    			environment.setBinding ( param.first, param.second );
    
    		Prompt p ( std::move ( environment ) );
    
    
    		cli::Command::Result result = cli::Command::Result::OK;
    
    		if ( queries.getValue ( ).empty ( ) ) {
    
    			result = p.run ( );
    
    			for ( const std::string & query : queries.getValue ( ) ) {
    				result = p.execute_line ( query );
    				if ( result != cli::Command::Result::OK )
    					break;
    			}
    
    			if ( result == cli::Command::Result::OK )
    				result = cli::Command::Result::QUIT;
    
    Jan Trávníček's avatar
    Jan Trávníček committed
    
    		measurements::end ( );
    
    		if ( measure.getValue ( ) )
    
    Jan Trávníček's avatar
    Jan Trávníček committed
    			common::Streams::measure << measurements::results ( ) << std::endl;
    
    Jan Trávníček's avatar
    Jan Trávníček committed
    
    
    		if ( result == cli::Command::Result::QUIT )
    			return 0;
    		else
    			return 4;
    
    Jan Trávníček's avatar
    Jan Trávníček committed
    	} catch ( const exception::CommonException & exception ) {
    		alib::XmlDataFactory::toStdout ( exception );
    		return 1;
    	} catch ( const TCLAP::ArgException & exception ) {
    		std::cout << exception.error ( ) << std::endl;
    		return 2;
    	} catch ( const std::exception & exception ) {
    
    		common::Streams::err << "Exception caught: " << exception.what ( ) << std::endl;
    
    Jan Trávníček's avatar
    Jan Trávníček committed
    		return 3;
    	} catch ( ... ) {
    
    		common::Streams::err << "Unknown exception caught." << std::endl;
    
    Jan Trávníček's avatar
    Jan Trávníček committed
    		return 127;
    	}
    }