// file : brep/search.cxx -*- C++ -*- // copyright : Copyright (c) 2014-2015 Code Synthesis Ltd // license : MIT; see accompanying LICENSE file #include #include // shared_ptr, make_shared() #include #include #include #include #include #include #include #include #include using namespace std; using namespace odb::core; namespace brep { void search:: init (cli::scanner& s) { MODULE_DIAG; options_ = make_shared (s, cli::unknown_mode::fail, cli::unknown_mode::fail); db_ = make_shared("", "", "brep", options_->db_host (), options_->db_port ()); if (options_->results_on_page () > 30) fail << "too many search results on page: " << options_->results_on_page (); else if (options_->results_on_page () > 10) warn << options_->results_on_page () << " search results on page is quite a lot but will try to cope"; } void search:: handle (request& rq, response& rs) { MODULE_DIAG; std::shared_ptr cli (make_shared ()); cli->name = "cli"; cli->summary = "CLI is ..."; cli->description = "This is CLI"; cli->tags = "compiler, C++"; licenses l; l.comment = "License\"A'"; l.push_back ("XXX"); l.push_back ("AAA"); l.push_back ("BBB"); l.push_back ("CCC"); std::shared_ptr v (make_shared ()); v->version = version ("1.1"); v->package = cli; v->license_alternatives.push_back (l); dependency_alternatives da; da.push_back ( {"icl", version_comparison{version ("1.3.3"), comparison::gt}}); da.push_back ( {"ocl", version_comparison{version ("1.5.5"), comparison::lt}}); v->dependencies.push_back (da); { requirement_alternatives ra; ra.push_back ("TAO"); ra.push_back ("ORBacus"); v->requirements.push_back (ra); } { requirement_alternatives ra; ra.push_back ("Xerces"); v->requirements.push_back (ra); } cli->versions.push_back (v); transaction t (db_->begin ()); // t.tracer (odb::stderr_full_tracer); { db_->persist (cli); db_->persist (v); } t.commit (); chrono::seconds ma (60); rs.cookie ("Oh", " Ah\n\n", &ma, "/"); rs.cookie ("Hm", ";Yes", &ma); info << "handling search request from "; // << rq.client_ip (); ostream& o (rs.content ()); o << ""; o << "Options:" << "
\ntracing verbosity: " << options_->verb () << "
\ndb endpoint: " << options_->db_host () << ":" << options_->db_port () << "
\nsearch results on page: " << options_->results_on_page (); o << "

\nParams:"; const name_values& ps (rq.parameters ()); if (ps.empty ()) throw invalid_request (422, "search parameters expected"); if (ps.size () > 100) fail << "too many parameters: " << ps.size () << info << "are you crazy to specify so many?"; level2 ([&]{trace << "search request with " << ps.size () << " params";}); for (const auto& p: ps) { o << "
\n" << p.name << "=" << p.value; } o << "

\nCookies:"; for (const auto& c: rq.cookies ()) { o << "
\n" << c.name << "=" << c.value; } o << "

View" << ""; } }