// 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 #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; shared_ptr cli ( make_shared ("cli", "CLI is ...", strings ({"compiler", "c++"}), string ("This is CLI"), url (), url (), email (), email ())); shared_ptr stable ( make_shared ( repository_location ("http://pkg.cpp.org/1/stable"), "Stable", dir_path ("/var/pkg/1/stable"))); licenses l; l.comment = "License\"A'"; l.push_back ("XXX"); l.push_back ("AAA"); l.push_back ("BBB"); l.push_back ("CCC"); 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}}); requirement_alternatives ra1; ra1.push_back ("TAO"); ra1.push_back ("ORBacus"); requirement_alternatives ra2; ra2.push_back ("Xerces"); shared_ptr v ( make_shared (stable, cli, version ("1.1"), priority (), license_alternatives ({l}), "some changes 1\nsome changes 2", dependencies ({da}), requirements ({ra1, ra2}))); transaction t (db_->begin ()); // t.tracer (odb::stderr_full_tracer); { db_->persist (cli); db_->persist (stable); 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" << ""; } }