~drizzle-trunk/drizzle/development

« back to all changes in this revision

Viewing changes to drizzled/module/loader.cc

  • Committer: Monty Taylor
  • Date: 2011-02-13 17:26:39 UTC
  • mfrom: (2157.2.2 give-in-to-pkg-config)
  • mto: This revision was merged to the branch mainline in revision 2166.
  • Revision ID: mordred@inaugust.com-20110213172639-nhy7i72sfhoq13ms
Merged in pkg-config fixes.

Show diffs side-by-side

added added

removed removed

Lines of Context:
13
13
   along with this program; if not, write to the Free Software
14
14
   Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA */
15
15
 
16
 
#include <config.h>
 
16
#include "config.h"
17
17
 
18
18
#include <dlfcn.h>
19
19
 
26
26
 
27
27
#include <boost/program_options.hpp>
28
28
 
29
 
#include <drizzled/option.h>
30
 
#include <drizzled/internal/m_string.h>
 
29
#include "drizzled/option.h"
 
30
#include "drizzled/internal/m_string.h"
31
31
 
32
 
#include <drizzled/plugin.h>
33
 
#include <drizzled/module/load_list.h>
34
 
#include <drizzled/module/library.h>
35
 
#include <drizzled/module/registry.h>
36
 
#include <drizzled/module/option_context.h>
37
 
#include <drizzled/sql_parse.h>
38
 
#include <drizzled/show.h>
39
 
#include <drizzled/cursor.h>
40
 
#include <drizzled/set_var.h>
41
 
#include <drizzled/session.h>
42
 
#include <drizzled/item/null.h>
43
 
#include <drizzled/error.h>
44
 
#include <drizzled/gettext.h>
45
 
#include <drizzled/errmsg_print.h>
46
 
#include <drizzled/pthread_globals.h>
47
 
#include <drizzled/util/tokenize.h>
48
 
#include <drizzled/system_variables.h>
 
32
#include "drizzled/plugin.h"
 
33
#include "drizzled/module/load_list.h"
 
34
#include "drizzled/module/library.h"
 
35
#include "drizzled/module/registry.h"
 
36
#include "drizzled/module/option_context.h"
 
37
#include "drizzled/sql_parse.h"
 
38
#include "drizzled/show.h"
 
39
#include "drizzled/cursor.h"
 
40
#include "drizzled/set_var.h"
 
41
#include "drizzled/session.h"
 
42
#include "drizzled/item/null.h"
 
43
#include "drizzled/error.h"
 
44
#include "drizzled/gettext.h"
 
45
#include "drizzled/errmsg_print.h"
 
46
#include "drizzled/strfunc.h"
 
47
#include "drizzled/pthread_globals.h"
 
48
#include "drizzled/util/tokenize.h"
49
49
 
50
50
#include <boost/foreach.hpp>
51
51
 
71
71
  PANDORA_BUILTIN_LOAD_SYMBOLS_LIST, NULL
72
72
};
73
73
 
74
 
namespace drizzled {
 
74
namespace drizzled
 
75
{
75
76
 
76
77
 
77
78
typedef vector<string> PluginOptions;
166
167
    return false;
167
168
  }
168
169
 
 
170
  module::Module *tmp= NULL;
169
171
  /* Find plugin by name */
170
172
  const module::Manifest *manifest= library->getManifest();
171
173
 
179
181
    return true;
180
182
  }
181
183
 
182
 
  module::Module* tmp= new module::Module(manifest, library);
 
184
  tmp= new (std::nothrow) module::Module(manifest, library);
 
185
  if (tmp == NULL)
 
186
    return true;
183
187
 
184
188
  if (!test_plugin_options(tmp_root, tmp, long_options))
185
189
  {
194
198
 
195
199
static void reap_plugins(module::Registry &registry)
196
200
{
197
 
  BOOST_FOREACH(module::Registry::ModuleMap::const_reference module, registry.getModulesMap())
198
 
    delete module.second;
 
201
  std::map<std::string, module::Module *>::const_iterator modules=
 
202
    registry.getModulesMap().begin();
 
203
 
 
204
  while (modules != registry.getModulesMap().end())
 
205
  {
 
206
    module::Module *module= (*modules).second;
 
207
    delete module;
 
208
    ++modules;
 
209
  }
199
210
}
200
211
 
201
212
 
216
227
    }
217
228
  }
218
229
  module->isInited= true;
 
230
 
 
231
 
219
232
  return false;
220
233
}
221
234
 
 
235
 
 
236
inline static void dashes_to_underscores(std::string &name_in,
 
237
                                         char from= '-', char to= '_')
 
238
{
 
239
  for (string::iterator p= name_in.begin();
 
240
       p != name_in.end();
 
241
       ++p)
 
242
  {
 
243
    if (*p == from)
 
244
    {
 
245
      *p= to;
 
246
    }
 
247
  }
 
248
}
 
249
 
 
250
inline static void underscores_to_dashes(std::string &name_in)
 
251
{
 
252
  return dashes_to_underscores(name_in, '_', '-');
 
253
}
 
254
 
222
255
static void compose_plugin_options(vector<string> &target,
223
256
                                   vector<string> options)
224
257
{
225
 
  BOOST_FOREACH(vector<string>::reference it, options)
226
 
    tokenize(it, target, ",", true);
227
 
  BOOST_FOREACH(vector<string>::reference it, target)
228
 
    std::replace(it.begin(), it.end(), '-', '_');
 
258
  for (vector<string>::iterator it= options.begin();
 
259
       it != options.end();
 
260
       ++it)
 
261
  {
 
262
    tokenize(*it, target, ",", true);
 
263
  }
 
264
  for (vector<string>::iterator it= target.begin();
 
265
       it != target.end();
 
266
       ++it)
 
267
  {
 
268
    dashes_to_underscores(*it);
 
269
  }
229
270
}
230
271
 
231
272
void compose_plugin_add(vector<string> options)
253
294
bool plugin_init(module::Registry &registry,
254
295
                 po::options_description &long_options)
255
296
{
 
297
  memory::Root tmp_root(4096);
 
298
 
256
299
  if (initialized)
257
300
    return false;
258
301
 
259
 
  initialized= true;
 
302
  initialized= 1;
260
303
 
261
304
  PluginOptions builtin_load_list;
262
305
  tokenize(builtin_load_plugins, builtin_load_list, ",", true);
290
333
    plugin_prune_list(builtin_load_list, opt_plugin_remove);
291
334
  }
292
335
 
293
 
  memory::Root tmp_root(4096);
 
336
 
294
337
  /*
295
338
    First we register builtin plugins
296
339
  */
327
370
  /*
328
371
    Now we initialize all remaining plugins
329
372
  */
330
 
  BOOST_FOREACH(module::Registry::ModuleList::const_reference module, registry.getList())
 
373
  module::Registry::ModuleList module_list= registry.getList();
 
374
  module::Registry::ModuleList::iterator modules= module_list.begin();
 
375
    
 
376
  while (modules != module_list.end())
331
377
  {
332
 
    if (not module->isInited && plugin_initialize(registry, module))
 
378
    module::Module *module= *modules;
 
379
    ++modules;
 
380
    if (module->isInited == false)
333
381
    {
334
 
      registry.remove(module);
335
 
      delete module;
336
 
      return true;
 
382
      if (plugin_initialize(registry, module))
 
383
      {
 
384
        registry.remove(module);
 
385
        delete module;
 
386
        return true;
 
387
      }
337
388
    }
338
389
  }
 
390
 
 
391
 
339
392
  BOOST_FOREACH(plugin::Plugin::map::value_type value, registry.getPluginsMap())
340
393
  {
341
394
    value.second->prime();
342
395
  }
 
396
 
343
397
  return false;
344
398
}
345
399
 
394
448
                             po::options_description &long_options,
395
449
                             bool builtin)
396
450
{
397
 
  BOOST_FOREACH(const string& plugin_name, plugin_list)
 
451
  module::Library *library= NULL;
 
452
 
 
453
  for (set<string>::const_iterator iter= plugin_list.begin();
 
454
       iter != plugin_list.end();
 
455
       ++iter)
398
456
  {
399
 
    module::Library* library= registry.addLibrary(plugin_name, builtin);
 
457
    const string plugin_name(*iter);
 
458
 
 
459
    library= registry.addLibrary(plugin_name, builtin);
400
460
    if (library == NULL)
401
461
    {
402
462
      errmsg_printf(error::ERROR,
413
473
                    _("Couldn't load plugin named '%s'.\n"),
414
474
                    plugin_name.c_str());
415
475
      return true;
 
476
 
416
477
    }
417
478
  }
418
479
  return false;