diff options
author | Karen Arutyunov <karen@codesynthesis.com> | 2018-09-08 17:46:57 +0300 |
---|---|---|
committer | Karen Arutyunov <karen@codesynthesis.com> | 2018-09-08 21:00:05 +0300 |
commit | d63e34a7e8612dc69ae25f3d3903ba04cc808bf7 (patch) | |
tree | a70540d6d7ec2b9ce72eae52d83ff35bcf150c1c /mod/mod-package-search.cxx | |
parent | 70c1cdfd8f34472761fe5ec97f0713990c1b4f5b (diff) |
Add support for root global and tenant views
Diffstat (limited to 'mod/mod-package-search.cxx')
-rw-r--r-- | mod/mod-package-search.cxx | 187 |
1 files changed, 0 insertions, 187 deletions
diff --git a/mod/mod-package-search.cxx b/mod/mod-package-search.cxx deleted file mode 100644 index 347abf1..0000000 --- a/mod/mod-package-search.cxx +++ /dev/null @@ -1,187 +0,0 @@ -// file : mod/mod-package-search.cxx -*- C++ -*- -// copyright : Copyright (c) 2014-2018 Code Synthesis Ltd -// license : MIT; see accompanying LICENSE file - -#include <mod/mod-package-search.hxx> - -#include <libstudxml/serializer.hxx> - -#include <odb/session.hxx> -#include <odb/database.hxx> -#include <odb/transaction.hxx> -#include <odb/schema-catalog.hxx> - -#include <web/xhtml.hxx> -#include <web/module.hxx> -#include <web/mime-url-encoding.hxx> - -#include <libbrep/package.hxx> -#include <libbrep/package-odb.hxx> - -#include <mod/page.hxx> -#include <mod/options.hxx> - -using namespace odb::core; -using namespace brep::cli; - -// While currently the user-defined copy constructor is not required (we don't -// need to deep copy nullptr's), it is a good idea to keep the placeholder -// ready for less trivial cases. -// -brep::package_search:: -package_search (const package_search& r) - : database_module (r), - options_ (r.initialized_ ? r.options_ : nullptr) -{ -} - -void brep::package_search:: -init (scanner& s) -{ - HANDLER_DIAG; - - options_ = make_shared<options::package_search> ( - s, unknown_mode::fail, unknown_mode::fail); - - database_module::init (*options_, options_->package_db_retry ()); - - if (options_->root ().empty ()) - options_->root (dir_path ("/")); - - // Check that the database 'package' schema matches the current one. It's - // enough to perform the check in just a single module implementation (and we - // don't do in the dispatcher because it doesn't use the database). - // - // Note that the failure can be reported by each web server worker process. - // While it could be tempting to move the check to the - // repository_root::version() function, it would be wrong. The function can - // be called by a different process (usually the web server root one) not - // having the proper permissions to access the database. - // - const string ds ("package"); - if (schema_catalog::current_version (*package_db_, ds) != - package_db_->schema_version (ds)) - fail << "database 'package' schema differs from the current one (module " - << BREP_VERSION_ID << ")"; -} - -template <typename T> -static inline query<T> -search_param (const brep::string& q, const brep::string& t) -{ - using query = query<T>; - return "(" + - (q.empty () - ? query ("NULL") - : "plainto_tsquery (" + query::_val (q) + ")") + - "," + - query::_val (t) + - ")"; -} - -bool brep::package_search:: -handle (request& rq, response& rs) -{ - using namespace web::xhtml; - - HANDLER_DIAG; - - const size_t res_page (options_->search_results ()); - const dir_path& root (options_->root ()); - const string& title (options_->search_title ()); - - params::package_search params; - - try - { - name_value_scanner s (rq.parameters (8 * 1024)); - params = params::package_search ( - s, unknown_mode::fail, unknown_mode::fail); - } - catch (const cli::exception& e) - { - throw invalid_request (400, e.what ()); - } - - size_t page (params.page ()); - const string& squery (params.query ()); - string squery_param (squery.empty () - ? "" - : "?q=" + web::mime_url_encode (squery)); - - xml::serializer s (rs.content (), title); - - s << HTML - << HEAD - << TITLE - << title; - - if (!squery.empty ()) - s << " " << squery; - - s << ~TITLE - << CSS_LINKS (path ("package-search.css"), root) - // - // This hack is required to avoid the "flash of unstyled content", which - // happens due to the presence of the autofocus attribute in the input - // element of the search form. The problem appears in Firefox and has a - // (4-year old, at the time of this writing) bug report: - // - // https://bugzilla.mozilla.org/show_bug.cgi?id=712130 - // - // @@ An update: claimed to be fixed in Firefox 60 that is released in - // May 2018. Is it time to cleanup? Remember to cleanup in all places. - // - << SCRIPT << " " << ~SCRIPT - << ~HEAD - << BODY - << DIV_HEADER (options_->logo (), options_->menu (), root, tenant) - << DIV(ID="content"); - - session sn; - transaction t (package_db_->begin ()); - - auto pkg_count ( - package_db_->query_value<latest_package_count> ( - search_param<latest_package_count> (squery, tenant))); - - s << FORM_SEARCH (squery) - << DIV_COUNTER (pkg_count, "Package", "Packages"); - - // Enclose the subsequent tables to be able to use nth-child CSS selector. - // - // @@ TENANT: use tenant for sorting when add support for global view. - // - s << DIV; - for (const auto& pr: - package_db_->query<latest_package_search_rank> ( - search_param<latest_package_search_rank> (squery, tenant) + - "ORDER BY rank DESC, name" + - "OFFSET" + to_string (page * res_page) + - "LIMIT" + to_string (res_page))) - { - shared_ptr<package> p (package_db_->load<package> (pr.id)); - - s << TABLE(CLASS="proplist package") - << TBODY - << TR_NAME (p->name, squery_param, root, tenant) - << TR_SUMMARY (p->summary) - << TR_LICENSE (p->license_alternatives) - << TR_TAGS (p->project, p->tags, root, tenant) - << TR_DEPENDS (p->dependencies, root, tenant) - << TR_REQUIRES (p->requirements) - << ~TBODY - << ~TABLE; - } - s << ~DIV; - - t.commit (); - - s << DIV_PAGER (page, pkg_count, res_page, options_->search_pages (), - tenant_dir (root, tenant).string () + squery_param) - << ~DIV - << ~BODY - << ~HTML; - - return true; -} |