bool operator() (PluginSpec const & s1, PluginSpec const & s2) const { return s1.getFullName () == s2.getFullName (); }
/** * @brief Add a plugin. * * @pre Needs to be a unique new name (use refname if you want to add the same module multiple times) * * Will automatically resolve virtual plugins to actual plugins. * * Also calls the checkconf function if provided by the plugin. The checkconf function has the * following signature: int checkconf (Key * errorKey, KeySet * config) and allows a plugin to * verify its configuration at mount time. * * @see resolveNeeds() * @param plugin */ void BackendBuilder::addPlugin (PluginSpec const & plugin) { typedef int (*checkConfPtr) (ckdb::Key *, ckdb::KeySet *); for (auto & p : toAdd) { if (p.getFullName () == plugin.getFullName ()) { throw PluginAlreadyInserted (plugin.getFullName ()); } } PluginSpec newPlugin = plugin; // if the plugin is actually a provider use it (otherwise we will get our name back): PluginSpec provides = pluginDatabase->lookupProvides (plugin.getName ()); if (provides.getName () != newPlugin.getName ()) { // keep our config and refname newPlugin.setName (provides.getName ()); newPlugin.appendConfig (provides.getConfig ()); } // call plugin's checkconf function (if provided) // this enables a plugin to verify its configuration at mount time checkConfPtr checkConfFunction = reinterpret_cast<checkConfPtr> (pluginDatabase->getSymbol (newPlugin, "checkconf")); if (checkConfFunction) { ckdb::Key * errorKey = ckdb::keyNew (0); // merge plugin config and backend config together ckdb::KeySet * pluginConfig = newPlugin.getConfig ().dup (); ckdb::ksAppend (pluginConfig, backendConf.getKeySet ()); // call the plugin's checkconf function int checkResult = checkConfFunction (errorKey, pluginConfig); if (checkResult == -1) { ckdb::ksDel (pluginConfig); throw PluginConfigInvalid (errorKey); } else if (checkResult == 1) { // separate plugin config from the backend config ckdb::Key * backendParent = ckdb::keyNew ("system/", KEY_END); ckdb::KeySet * newBackendConfig = ckdb::ksCut (pluginConfig, backendParent); // take over the new configuration KeySet modifiedPluginConfig = KeySet (pluginConfig); KeySet modifiedBackendConfig = KeySet (newBackendConfig); newPlugin.setConfig (modifiedPluginConfig); setBackendConfig (modifiedBackendConfig); ckdb::keyDel (backendParent); } else { ckdb::ksDel (pluginConfig); } ckdb::keyDel (errorKey); } toAdd.push_back (newPlugin); sort (); }