+ m_p->release_frontend(package);
+}
+
+void mp::filter::VirtualDB::configure(const xmlNode * ptr, bool test_only)
+{
+ for (ptr = ptr->children; ptr; ptr = ptr->next)
+ {
+ if (ptr->type != XML_ELEMENT_NODE)
+ continue;
+ if (!strcmp((const char *) ptr->name, "pass-vhosts"))
+ {
+ m_p->pass_vhosts = mp::xml::get_bool(ptr->children, false);
+ }
+ else if (!strcmp((const char *) ptr->name, "virtual"))
+ {
+ std::string query_encoding;
+ std::string database;
+ std::list<std::string> targets;
+ xmlNode *v_node = ptr->children;
+ for (; v_node; v_node = v_node->next)
+ {
+ if (v_node->type != XML_ELEMENT_NODE)
+ continue;
+
+ if (mp::xml::is_element_mp(v_node, "database"))
+ database = mp::xml::get_text(v_node);
+ else if (mp::xml::is_element_mp(v_node, "target"))
+ targets.push_back(mp::xml::get_text(v_node));
+ else if (mp::xml::is_element_mp(v_node, "query-encoding"))
+ targets.push_back(mp::xml::get_text(v_node));
+ else
+ throw mp::filter::FilterException
+ ("Bad element "
+ + std::string((const char *) v_node->name)
+ + " in virtual section"
+ );
+ }
+ std::string route = mp::xml::get_route(ptr);
+
+ VirtualDB::Map vmap(mp::util::database_name_normalize(database),
+ targets, route);
+ vmap.query_encoding = query_encoding;
+ m_p->m_maps.push_back(vmap);
+ }
+ else if (!strcmp((const char *) ptr->name, "torus"))
+ {
+ std::string url;
+ const struct _xmlAttr *attr;
+ for (attr = ptr->properties; attr; attr = attr->next)
+ {
+ if (!strcmp((const char *) attr->name, "url"))
+ url = mp::xml::get_text(attr->children);
+ else
+ throw mp::filter::FilterException(
+ "Bad attribute " + std::string((const char *)
+ attr->name));
+ }
+ m_p->torus.read_searchables(url);
+ m_p->refresh_torus();
+ }
+ else
+ {
+ throw mp::filter::FilterException
+ ("Bad element "
+ + std::string((const char *) ptr->name)
+ + " in virt_db filter");
+ }
+ }
+}
+
+static mp::filter::Base* filter_creator()
+{
+ return new mp::filter::VirtualDB;
+}
+
+extern "C" {
+ struct metaproxy_1_filter_struct metaproxy_1_filter_virt_db = {
+ 0,
+ "virt_db",
+ filter_creator
+ };