~drizzle-trunk/drizzle/development

« back to all changes in this revision

Viewing changes to drizzled/drizzled.cc

  • Committer: Brian Aker
  • Date: 2010-11-04 20:51:35 UTC
  • mto: This revision was merged to the branch mainline in revision 1906.
  • Revision ID: brian@tangent.org-20101104205135-vci0i54v1d0loai8
Merge of partial set of patches for locks.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
/* -*- mode: c++; c-basic-offset: 2; indent-tabs-mode: nil; -*-
2
2
 *  vim:expandtab:shiftwidth=2:tabstop=2:smarttab:
3
3
 *
4
 
 *  Copyright (C) 2008 Sun Microsystems, Inc.
 
4
 *  Copyright (C) 2008 Sun Microsystems
5
5
 *
6
6
 *  This program is free software; you can redistribute it and/or modify
7
7
 *  it under the terms of the GNU General Public License as published by
17
17
 *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
18
18
 */
19
19
 
20
 
#include <config.h>
21
 
 
22
 
#include <drizzled/configmake.h>
23
 
#include <drizzled/atomics.h>
24
 
#include <drizzled/data_home.h>
 
20
#include "config.h"
 
21
#include "drizzled/configmake.h"
 
22
#include "drizzled/atomics.h"
 
23
#include "drizzled/data_home.h"
25
24
 
26
25
#include <netdb.h>
27
26
#include <sys/types.h>
32
31
#include <stdexcept>
33
32
 
34
33
#include <boost/program_options.hpp>
35
 
#include <drizzled/program_options/config_file.h>
 
34
#include "drizzled/program_options/config_file.h"
36
35
#include <boost/thread/recursive_mutex.hpp>
37
36
#include <boost/thread/mutex.hpp>
38
37
#include <boost/thread/shared_mutex.hpp>
39
38
#include <boost/thread/condition_variable.hpp>
40
39
#include <boost/filesystem.hpp>
41
 
#include <boost/detail/atomic_count.hpp>
42
40
 
43
 
#include <drizzled/cached_directory.h>
44
 
#include <drizzled/charset.h>
45
 
#include <drizzled/data_home.h>
46
 
#include <drizzled/debug.h>
47
 
#include <drizzled/definition/cache.h>
48
 
#include <drizzled/drizzled.h>
 
41
#include "drizzled/internal/my_sys.h"
 
42
#include "drizzled/internal/my_bit.h"
 
43
#include <drizzled/my_hash.h>
 
44
#include <drizzled/error.h>
49
45
#include <drizzled/errmsg_print.h>
50
 
#include <drizzled/error.h>
51
 
#include <drizzled/global_buffer.h>
52
 
#include <drizzled/internal/my_bit.h>
53
 
#include <drizzled/internal/my_sys.h>
 
46
#include <drizzled/tztime.h>
 
47
#include <drizzled/sql_base.h>
 
48
#include <drizzled/show.h>
 
49
#include <drizzled/sql_parse.h>
54
50
#include <drizzled/item/cmpfunc.h>
 
51
#include <drizzled/session.h>
55
52
#include <drizzled/item/create.h>
56
 
#include <drizzled/message/cache.h>
57
 
#include <drizzled/module/load_list.h>
58
 
#include <drizzled/module/registry.h>
59
 
#include <drizzled/my_hash.h>
60
 
#include <drizzled/plugin/client.h>
61
 
#include <drizzled/plugin/error_message.h>
62
 
#include <drizzled/plugin/event_observer.h>
63
 
#include <drizzled/plugin/listen.h>
64
 
#include <drizzled/plugin/monitored_in_transaction.h>
65
 
#include <drizzled/plugin/scheduler.h>
66
 
#include <drizzled/plugin/storage_engine.h>
67
 
#include <drizzled/plugin/xa_resource_manager.h>
68
 
#include <drizzled/probes.h>
69
 
#include <drizzled/replication_services.h> /* For ReplicationServices::evaluateRegisteredPlugins() */
70
 
#include <drizzled/session.h>
71
 
#include <drizzled/session/cache.h>
72
 
#include <drizzled/show.h>
73
 
#include <drizzled/sql_base.h>
74
 
#include <drizzled/sql_parse.h>
75
 
#include <drizzled/temporal_format.h> /* For init_temporal_formats() */
76
 
#include <drizzled/tztime.h>
77
53
#include <drizzled/unireg.h>
78
 
#include <plugin/myisam/myisam.h>
79
 
#include <drizzled/typelib.h>
80
 
#include <drizzled/visibility.h>
 
54
#include "drizzled/temporal_format.h" /* For init_temporal_formats() */
 
55
#include "drizzled/plugin/listen.h"
 
56
#include "drizzled/plugin/error_message.h"
 
57
#include "drizzled/plugin/client.h"
 
58
#include "drizzled/plugin/scheduler.h"
 
59
#include "drizzled/plugin/xa_resource_manager.h"
 
60
#include "drizzled/plugin/monitored_in_transaction.h"
 
61
#include "drizzled/replication_services.h" /* For ReplicationServices::evaluateRegisteredPlugins() */
 
62
#include "drizzled/probes.h"
 
63
#include "drizzled/session_list.h"
 
64
#include "drizzled/charset.h"
 
65
#include "plugin/myisam/myisam.h"
 
66
#include "drizzled/drizzled.h"
 
67
#include "drizzled/module/registry.h"
 
68
#include "drizzled/module/load_list.h"
 
69
 
 
70
#include "drizzled/plugin/event_observer.h"
81
71
 
82
72
#include <google/protobuf/stubs/common.h>
83
73
 
84
 
#include <drizzled/refresh_version.h>
85
 
 
86
74
#if TIME_WITH_SYS_TIME
87
75
# include <sys/time.h>
88
76
# include <time.h>
102
90
 
103
91
#include <errno.h>
104
92
#include <sys/stat.h>
105
 
#include <drizzled/option.h>
 
93
#include "drizzled/option.h"
106
94
#ifdef HAVE_SYSENT_H
107
95
#include <sysent.h>
108
96
#endif
136
124
#include <sys/fpu.h>
137
125
#endif
138
126
 
139
 
#include <drizzled/internal/my_pthread.h>                       // For thr_setconcurency()
140
 
#include <drizzled/constrained_value.h>
 
127
#include "drizzled/internal/my_pthread.h"                       // For thr_setconcurency()
 
128
#include "drizzled/constrained_value.h"
141
129
 
142
130
#include <drizzled/gettext.h>
143
131
 
158
146
namespace po=boost::program_options;
159
147
namespace dpo=drizzled::program_options;
160
148
 
161
 
bool opt_daemon= false;
162
149
 
163
150
namespace drizzled
164
151
{
165
152
 
 
153
#define mysqld_charset &my_charset_utf8_general_ci
166
154
inline void setup_fpu()
167
155
{
168
156
#if defined(__FreeBSD__) && defined(HAVE_IEEEFP_H)
234
222
 
235
223
/* Global variables */
236
224
 
 
225
bool volatile ready_to_exit;
237
226
char *drizzled_user;
238
227
bool volatile select_thread_in_use;
239
228
bool volatile abort_loop;
240
 
DRIZZLED_API bool volatile shutdown_in_progress;
 
229
bool volatile shutdown_in_progress;
241
230
char *opt_scheduler_default;
242
231
const char *opt_scheduler= NULL;
243
232
 
244
 
DRIZZLED_API size_t my_thread_stack_size= 0;
 
233
size_t my_thread_stack_size= 0;
245
234
 
246
235
/*
247
236
  Legacy global plugin::StorageEngine. These will be removed (please do not add more).
252
241
bool calling_initgroups= false; /**< Used in SIGSEGV handler. */
253
242
 
254
243
uint32_t drizzled_bind_timeout;
 
244
std::bitset<12> test_flags;
255
245
uint32_t dropping_tables, ha_open_options;
256
246
uint32_t tc_heuristic_recover= 0;
257
247
uint64_t session_startup_options;
258
248
back_log_constraints back_log(50);
259
 
DRIZZLED_API uint32_t server_id;
 
249
uint32_t server_id;
260
250
uint64_t table_cache_size;
261
251
size_t table_def_size;
 
252
uint64_t max_connect_errors;
262
253
uint32_t global_thread_id= 1UL;
263
254
pid_t current_pid;
264
255
 
308
299
fs::path system_config_dir(SYSCONFDIR);
309
300
 
310
301
 
 
302
char system_time_zone[30];
 
303
char *default_tz_name;
 
304
char glob_hostname[FN_REFLEN];
 
305
 
311
306
char *opt_tc_log_file;
312
307
const key_map key_map_empty(0);
313
308
key_map key_map_full(0);                        // Will be initialized later
321
316
const char *in_additional_cond= "<IN COND>";
322
317
const char *in_having_cond= "<IN HAVING>";
323
318
 
 
319
my_decimal decimal_zero;
324
320
/* classes for comparation parsing/processing */
325
321
 
326
322
FILE *stderror_file=0;
327
323
 
328
 
drizzle_system_variables global_system_variables;
329
 
drizzle_system_variables max_system_variables;
330
 
global_counters current_global_counters;
 
324
struct drizzle_system_variables global_system_variables;
 
325
struct drizzle_system_variables max_system_variables;
 
326
struct global_counters current_global_counters;
331
327
 
332
 
DRIZZLED_API const CHARSET_INFO *system_charset_info;
333
 
const CHARSET_INFO *files_charset_info;
 
328
const CHARSET_INFO *system_charset_info, *files_charset_info ;
334
329
const CHARSET_INFO *table_alias_charset;
335
330
const CHARSET_INFO *character_set_filesystem;
336
331
 
338
333
 
339
334
SHOW_COMP_OPTION have_symlink;
340
335
 
 
336
/* Thread specific variables */
 
337
 
 
338
boost::mutex LOCK_open;
 
339
boost::mutex LOCK_global_system_variables;
 
340
boost::mutex LOCK_thread_count;
 
341
 
341
342
boost::condition_variable_any COND_refresh;
342
343
boost::condition_variable COND_thread_count;
343
344
pthread_t signal_thread;
 
345
boost::condition_variable COND_server_end;
344
346
 
345
347
/* Static variables */
346
348
 
348
350
 
349
351
passwd *user_info;
350
352
 
351
 
boost::detail::atomic_count connection_count(0);
352
 
 
353
 
global_buffer_constraint<uint64_t> global_sort_buffer(0);
354
 
global_buffer_constraint<uint64_t> global_join_buffer(0);
355
 
global_buffer_constraint<uint64_t> global_read_rnd_buffer(0);
356
 
global_buffer_constraint<uint64_t> global_read_buffer(0);
357
 
 
358
 
DRIZZLED_API size_t transaction_message_threshold;
 
353
atomic<uint32_t> connection_count;
 
354
 
 
355
/** 
 
356
  Refresh value. We use to test this to find out if a refresh even has happened recently.
 
357
*/
 
358
uint64_t refresh_version;  /* Increments on each reload */
 
359
 
 
360
/* Function declarations */
 
361
bool drizzle_rm_tmp_tables();
359
362
 
360
363
static void drizzle_init_variables(void);
361
364
static void get_options();
366
369
 
367
370
fs::path base_plugin_dir(PKGPLUGINDIR);
368
371
 
369
 
po::options_description config_options(_("Config File Options"));
370
 
po::options_description long_options(_("Kernel Options"));
371
 
po::options_description plugin_load_options(_("Plugin Loading Options"));
372
 
po::options_description plugin_options(_("Plugin Options"));
373
 
po::options_description initial_options(_("Config and Plugin Loading"));
374
 
po::options_description full_options(_("Kernel and Plugin Loading and Plugin"));
 
372
po::options_description config_options("Config File Options");
 
373
po::options_description long_options("Kernel Options");
 
374
po::options_description plugin_load_options("Plugin Loading Options");
 
375
po::options_description plugin_options("Plugin Options");
 
376
po::options_description initial_options("Config and Plugin Loading");
 
377
po::options_description full_options("Kernel and Plugin Loading and Plugin");
375
378
vector<string> unknown_options;
376
379
vector<string> defaults_file_list;
377
380
po::variables_map vm;
378
381
 
 
382
fs::path data_home(LOCALSTATEDIR);
 
383
fs::path full_data_home(LOCALSTATEDIR);
 
384
 
379
385
po::variables_map &getVariablesMap()
380
386
{
381
387
  return vm;
382
388
}
383
389
 
384
 
namespace
385
 
{
386
 
 
387
 
std::string &getGlobHostname()
388
 
{
389
 
  static std::string glob_hostname("localhost");
390
 
  return glob_hostname;
391
 
}
392
 
 
393
 
void setServerHostname(const std::string &hostname)
394
 
{
395
 
  getGlobHostname()= hostname;
396
 
}
397
 
}
398
 
 
399
 
const std::string &getServerHostname()
400
 
{
401
 
  return getGlobHostname();
402
 
}
403
 
 
 
390
fs::path& getDataHome()
 
391
{
 
392
  return data_home;
 
393
}
 
394
 
 
395
fs::path& getDataHomeCatalog()
 
396
{
 
397
  static fs::path data_home_catalog(getDataHome());
 
398
  return data_home_catalog;
 
399
}
 
400
 
 
401
 
404
402
/****************************************************************************
405
403
** Code to end drizzled
406
404
****************************************************************************/
412
410
 
413
411
  /* kill connection thread */
414
412
  {
415
 
    boost::mutex::scoped_lock scopedLock(session::Cache::singleton().mutex());
 
413
    boost::mutex::scoped_lock scopedLock(LOCK_thread_count);
416
414
 
417
415
    while (select_thread_in_use)
418
416
    {
436
434
    statements and inform their clients that the server is about to die.
437
435
  */
438
436
 
 
437
  Session *tmp;
 
438
 
439
439
  {
440
 
    boost::mutex::scoped_lock scopedLock(session::Cache::singleton().mutex());
441
 
    session::Cache::list list= session::Cache::singleton().getCache();
442
 
 
443
 
    for (session::Cache::list::iterator it= list.begin(); it != list.end(); ++it )
 
440
    boost::mutex::scoped_lock scoped(LOCK_thread_count);
 
441
    for( SessionList::iterator it= getSessionList().begin(); it != getSessionList().end(); ++it )
444
442
    {
445
 
      Session::shared_ptr tmp(*it);
446
 
 
447
 
      tmp->setKilled(Session::KILL_CONNECTION);
448
 
      tmp->scheduler->killSession(tmp.get());
 
443
      tmp= *it;
 
444
      tmp->killed= Session::KILL_CONNECTION;
 
445
      tmp->scheduler->killSession(tmp);
449
446
      DRIZZLE_CONNECTION_DONE(tmp->thread_id);
450
 
 
451
447
      tmp->lockOnSys();
452
448
    }
453
449
  }
454
450
 
455
 
  if (session::Cache::singleton().count())
 
451
  if (connection_count)
456
452
    sleep(2);                                   // Give threads time to die
457
453
 
458
454
  /*
462
458
  */
463
459
  for (;;)
464
460
  {
465
 
    boost::mutex::scoped_lock scopedLock(session::Cache::singleton().mutex());
466
 
    session::Cache::list list= session::Cache::singleton().getCache();
467
 
 
468
 
    if (list.empty())
 
461
    boost::mutex::scoped_lock scoped(LOCK_thread_count);
 
462
    if (getSessionList().empty())
469
463
    {
470
464
      break;
471
465
    }
 
466
    tmp= getSessionList().front();
472
467
    /* Close before unlock, avoiding crash. See LP bug#436685 */
473
 
    list.front()->getClient()->close();
 
468
    tmp->client->close();
474
469
  }
475
470
}
476
471
 
479
474
{
480
475
 
481
476
  if (exit_code)
482
 
  {
483
 
    errmsg_printf(error::ERROR, _("Aborting"));
484
 
  }
 
477
    errmsg_printf(ERRMSG_LVL_ERROR, _("Aborting\n"));
485
478
  else if (opt_help)
486
 
  {
487
479
    usage();
488
 
  }
489
 
 
490
480
  clean_up(!opt_help && (exit_code));
491
481
  internal::my_end();
492
482
  exit(exit_code);
513
503
  (void) unlink(pid_file.file_string().c_str());        // This may not always exist
514
504
 
515
505
  if (print_message && server_start_time)
516
 
    errmsg_printf(drizzled::error::INFO, _(ER(ER_SHUTDOWN_COMPLETE)),internal::my_progname);
517
 
 
518
 
  session::Cache::singleton().shutdownFirst();
 
506
    errmsg_printf(ERRMSG_LVL_INFO, _(ER(ER_SHUTDOWN_COMPLETE)),internal::my_progname);
 
507
  LOCK_thread_count.lock();
 
508
  ready_to_exit=1;
 
509
  /* do the broadcast inside the lock to ensure that my_end() is not called */
 
510
  COND_server_end.notify_all();
 
511
  LOCK_thread_count.unlock();
519
512
 
520
513
  /*
521
514
    The following lines may never be executed as the main thread may have
540
533
      tmp_user_info= getpwnam(user);
541
534
      if ((!tmp_user_info || user_id != tmp_user_info->pw_uid) &&
542
535
          global_system_variables.log_warnings)
543
 
            errmsg_printf(error::WARN, _("One can only use the --user switch "
 
536
            errmsg_printf(ERRMSG_LVL_WARN, _("One can only use the --user switch "
544
537
                            "if running as root\n"));
545
538
    }
546
539
    return NULL;
547
540
  }
548
 
  if (not user)
 
541
  if (!user)
549
542
  {
550
 
      errmsg_printf(error::ERROR, _("Fatal error: Please read \"Security\" section of "
551
 
                                    "the manual to find out how to run drizzled as root"));
 
543
      errmsg_printf(ERRMSG_LVL_ERROR, _("Fatal error: Please read \"Security\" section of "
 
544
                      "the manual to find out how to run drizzled as root!\n"));
552
545
    unireg_abort(1);
553
546
  }
554
 
 
555
 
  if (not strcmp(user, "root"))
 
547
  if (!strcmp(user,"root"))
556
548
    return NULL;                        // Avoid problem with dynamic libraries
557
549
 
558
550
  if (!(tmp_user_info= getpwnam(user)))
559
551
  {
560
552
    // Allow a numeric uid to be used
561
553
    const char *pos;
562
 
    for (pos= user; my_isdigit(&my_charset_utf8_general_ci,*pos); pos++) ;
 
554
    for (pos= user; my_isdigit(mysqld_charset,*pos); pos++) ;
563
555
    if (*pos)                                   // Not numeric id
564
556
      goto err;
565
557
    if (!(tmp_user_info= getpwuid(atoi(user))))
568
560
  return tmp_user_info;
569
561
 
570
562
err:
571
 
  errmsg_printf(error::ERROR, _("Fatal error: Can't change to run as user '%s' ;  "
 
563
  errmsg_printf(ERRMSG_LVL_ERROR, _("Fatal error: Can't change to run as user '%s' ;  "
572
564
                    "Please check that the user exists!\n"),user);
573
565
  unireg_abort(1);
574
566
 
575
567
#ifdef PR_SET_DUMPABLE
576
 
  if (getDebug().test(debug::CORE_ON_SIGNAL))
 
568
  if (test_flags.test(TEST_CORE_ON_SIGNAL))
577
569
  {
578
570
    /* inform kernel that process is dumpable */
579
571
    (void) prctl(PR_SET_DUMPABLE, 1);
593
585
  initgroups((char*) user, user_info_arg->pw_gid);
594
586
  if (setgid(user_info_arg->pw_gid) == -1)
595
587
  {
596
 
    sql_perror(_("Set process group ID failed"));
 
588
    sql_perror(N_("Set process group ID failed"));
597
589
    unireg_abort(1);
598
590
  }
599
591
  if (setuid(user_info_arg->pw_uid) == -1)
600
592
  {
601
 
    sql_perror(_("Set process user ID failed"));
 
593
    sql_perror(N_("Set process user ID failed"));
602
594
    unireg_abort(1);
603
595
  }
604
596
}
610
602
{
611
603
  if ((chroot(path) == -1) || !chdir("/"))
612
604
  {
613
 
    sql_perror(_("Process chroot failed"));
 
605
    sql_perror(N_("Process chroot failed"));
614
606
    unireg_abort(1);
615
607
  }
616
608
}
622
614
  SYNOPSIS
623
615
    Session::unlink()
624
616
    session              Thread handler
 
617
 
 
618
  NOTES
 
619
    LOCK_thread_count is locked and left locked
625
620
*/
626
621
 
627
 
void drizzled::Session::unlink(session_id_t &session_id)
628
 
{
629
 
  Session::shared_ptr session= session::Cache::singleton().find(session_id);
630
 
 
631
 
  if (session)
632
 
    unlink(session);
633
 
}
634
 
 
635
 
void drizzled::Session::unlink(Session::shared_ptr &session)
636
 
{
637
 
  --connection_count;
 
622
void Session::unlink(Session *session)
 
623
{
 
624
  connection_count.decrement();
638
625
 
639
626
  session->cleanup();
640
627
 
641
 
  boost::mutex::scoped_lock scopedLock(session::Cache::singleton().mutex());
 
628
  boost::mutex::scoped_lock scoped(LOCK_thread_count);
 
629
  session->lockForDelete();
642
630
 
 
631
  getSessionList().erase(remove(getSessionList().begin(),
 
632
                         getSessionList().end(),
 
633
                         session));
643
634
  if (unlikely(plugin::EventObserver::disconnectSession(*session)))
644
635
  {
645
636
    // We should do something about an error...
646
637
  }
647
 
  session::Cache::singleton().erase(session);
 
638
 
 
639
  delete session;
648
640
}
649
641
 
650
642
 
665
657
 
666
658
static void find_plugin_dir(string progname)
667
659
{
668
 
  fs::path full_progname(fs::system_complete(progname));
669
 
 
670
 
  fs::path progdir(full_progname.parent_path());
671
 
  if (progdir.filename() == ".libs")
672
 
  {
673
 
    progdir= progdir.parent_path();
674
 
  }
675
 
 
676
 
  if (fs::exists(progdir / "drizzled.lo") || fs::exists(progdir / "drizzled.o"))
 
660
  if (progname[0] != FN_LIBCHAR)
 
661
  {
 
662
    /* We have a relative path and need to find the absolute */
 
663
    char working_dir[FN_REFLEN];
 
664
    char *working_dir_ptr= working_dir;
 
665
    working_dir_ptr= getcwd(working_dir_ptr, FN_REFLEN);
 
666
    string new_path(working_dir);
 
667
    if (*(new_path.end()-1) != '/')
 
668
      new_path.push_back('/');
 
669
    if (progname[0] == '.' && progname[1] == '/')
 
670
      new_path.append(progname.substr(2));
 
671
    else
 
672
      new_path.append(progname);
 
673
    progname.swap(new_path);
 
674
  }
 
675
 
 
676
  /* Now, trim off the exe name */
 
677
  string progdir(progname.substr(0, progname.rfind(FN_LIBCHAR)+1));
 
678
  if (progdir.rfind(".libs/") != string::npos)
 
679
  {
 
680
    progdir.assign(progdir.substr(0, progdir.rfind(".libs/")));
 
681
  }
 
682
  string testlofile(progdir);
 
683
  testlofile.append("drizzled.lo");
 
684
  string testofile(progdir);
 
685
  testofile.append("drizzled.o");
 
686
  struct stat testfile_stat;
 
687
  if (not (stat(testlofile.c_str(), &testfile_stat) && stat(testofile.c_str(), &testfile_stat)))
677
688
  {
678
689
    /* We are in a source dir! Plugin dir is ../plugin/.libs */
679
 
    base_plugin_dir= progdir.parent_path();
 
690
    size_t last_libchar_pos= progdir.rfind(FN_LIBCHAR,progdir.size()-2)+1;
 
691
    base_plugin_dir= progdir.substr(0,last_libchar_pos);
680
692
    base_plugin_dir /= "plugin";
681
693
    base_plugin_dir /= ".libs";
682
694
  }
710
722
  global_system_variables.auto_increment_increment= 1;
711
723
  if (in_auto_increment_increment < 1 || in_auto_increment_increment > UINT64_MAX)
712
724
  {
713
 
    cout << _("Error: Invalid Value for auto_increment_increment");
 
725
    cout << N_("Error: Invalid Value for auto_increment_increment");
714
726
    exit(-1);
715
727
  }
716
728
  global_system_variables.auto_increment_increment= in_auto_increment_increment;
721
733
  global_system_variables.auto_increment_offset= 1;
722
734
  if (in_auto_increment_offset < 1 || in_auto_increment_offset > UINT64_MAX)
723
735
  {
724
 
    cout << _("Error: Invalid Value for auto_increment_offset");
 
736
    cout << N_("Error: Invalid Value for auto_increment_offset");
725
737
    exit(-1);
726
738
  }
727
739
  global_system_variables.auto_increment_offset= in_auto_increment_offset;
732
744
  global_system_variables.completion_type= 0;
733
745
  if (in_completion_type > 2)
734
746
  {
735
 
    cout << _("Error: Invalid Value for completion_type");
 
747
    cout << N_("Error: Invalid Value for completion_type");
736
748
    exit(-1);
737
749
  }
738
750
  global_system_variables.completion_type= in_completion_type;
744
756
  global_system_variables.div_precincrement= 4;
745
757
  if (in_div_precincrement > DECIMAL_MAX_SCALE)
746
758
  {
747
 
    cout << _("Error: Invalid Value for div-precision-increment");
 
759
    cout << N_("Error: Invalid Value for div-precision-increment");
748
760
    exit(-1);
749
761
  }
750
762
  global_system_variables.div_precincrement= in_div_precincrement;
755
767
  global_system_variables.group_concat_max_len= 1024;
756
768
  if (in_group_concat_max_len > ULONG_MAX || in_group_concat_max_len < 4)
757
769
  {
758
 
    cout << _("Error: Invalid Value for group_concat_max_len");
 
770
    cout << N_("Error: Invalid Value for group_concat_max_len");
759
771
    exit(-1);
760
772
  }
761
773
  global_system_variables.group_concat_max_len= in_group_concat_max_len;
766
778
  global_system_variables.join_buff_size= (128*1024L);
767
779
  if (in_join_buffer_size < IO_SIZE*2 || in_join_buffer_size > ULONG_MAX)
768
780
  {
769
 
    cout << _("Error: Invalid Value for join_buffer_size");
 
781
    cout << N_("Error: Invalid Value for join_buffer_size");
770
782
    exit(-1);
771
783
  }
772
784
  in_join_buffer_size-= in_join_buffer_size % IO_SIZE;
778
790
  global_system_variables.max_allowed_packet= (64*1024*1024L);
779
791
  if (in_max_allowed_packet < 1024 || in_max_allowed_packet > 1024*1024L*1024L)
780
792
  {
781
 
    cout << _("Error: Invalid Value for max_allowed_packet");
 
793
    cout << N_("Error: Invalid Value for max_allowed_packet");
782
794
    exit(-1);
783
795
  }
784
796
  in_max_allowed_packet-= in_max_allowed_packet % 1024;
785
797
  global_system_variables.max_allowed_packet= in_max_allowed_packet;
786
798
}
787
799
 
 
800
static void check_limits_mce(uint64_t in_max_connect_errors)
 
801
{
 
802
  max_connect_errors= MAX_CONNECT_ERRORS;
 
803
  if (in_max_connect_errors < 1 || in_max_connect_errors > ULONG_MAX)
 
804
  {
 
805
    cout << N_("Error: Invalid Value for max_connect_errors");
 
806
    exit(-1);
 
807
  }
 
808
  max_connect_errors= in_max_connect_errors;
 
809
}
 
810
 
788
811
static void check_limits_max_err_cnt(uint64_t in_max_error_count)
789
812
{
790
813
  global_system_variables.max_error_count= DEFAULT_ERROR_COUNT;
791
814
  if (in_max_error_count > 65535)
792
815
  {
793
 
    cout << _("Error: Invalid Value for max_error_count");
 
816
    cout << N_("Error: Invalid Value for max_error_count");
794
817
    exit(-1);
795
818
  }
796
819
  global_system_variables.max_error_count= in_max_error_count;
801
824
  global_system_variables.max_heap_table_size= (16*1024*1024L);
802
825
  if (in_max_heap_table_size < 16384 || in_max_heap_table_size > MAX_MEM_TABLE_SIZE)
803
826
  {
804
 
    cout << _("Error: Invalid Value for max_heap_table_size");
 
827
    cout << N_("Error: Invalid Value for max_heap_table_size");
805
828
    exit(-1);
806
829
  }
807
830
  in_max_heap_table_size-= in_max_heap_table_size % 1024;
813
836
  global_system_variables.min_examined_row_limit= 0;
814
837
  if (in_min_examined_row_limit > ULONG_MAX)
815
838
  {
816
 
    cout << _("Error: Invalid Value for min_examined_row_limit");
 
839
    cout << N_("Error: Invalid Value for min_examined_row_limit");
817
840
    exit(-1);
818
841
  }
819
842
  global_system_variables.min_examined_row_limit= in_min_examined_row_limit;
824
847
  global_system_variables.max_join_size= INT32_MAX;
825
848
  if ((uint64_t)in_max_join_size < 1 || (uint64_t)in_max_join_size > INT32_MAX)
826
849
  {
827
 
    cout << _("Error: Invalid Value for max_join_size");
 
850
    cout << N_("Error: Invalid Value for max_join_size");
828
851
    exit(-1);
829
852
  }
830
853
  global_system_variables.max_join_size= in_max_join_size;
835
858
  global_system_variables.max_length_for_sort_data= 1024;
836
859
  if (in_max_length_for_sort_data < 4 || in_max_length_for_sort_data > 8192*1024L)
837
860
  {
838
 
    cout << _("Error: Invalid Value for max_length_for_sort_data");
 
861
    cout << N_("Error: Invalid Value for max_length_for_sort_data");
839
862
    exit(-1);
840
863
  }
841
864
  global_system_variables.max_length_for_sort_data= in_max_length_for_sort_data;
846
869
  global_system_variables.max_seeks_for_key= ULONG_MAX;
847
870
  if (in_max_seeks_for_key < 1 || in_max_seeks_for_key > ULONG_MAX)
848
871
  {
849
 
    cout << _("Error: Invalid Value for max_seeks_for_key");
 
872
    cout << N_("Error: Invalid Value for max_seeks_for_key");
850
873
    exit(-1);
851
874
  }
852
875
  global_system_variables.max_seeks_for_key= in_max_seeks_for_key;
857
880
  global_system_variables.max_sort_length= 1024;
858
881
  if ((int64_t)in_max_sort_length < 4 || (int64_t)in_max_sort_length > 8192*1024L)
859
882
  {
860
 
    cout << _("Error: Invalid Value for max_sort_length");
 
883
    cout << N_("Error: Invalid Value for max_sort_length");
861
884
    exit(-1);
862
885
  }
863
886
  global_system_variables.max_sort_length= in_max_sort_length;
868
891
  global_system_variables.optimizer_search_depth= 0;
869
892
  if (in_optimizer_search_depth > MAX_TABLES + 2)
870
893
  {
871
 
    cout << _("Error: Invalid Value for optimizer_search_depth");
 
894
    cout << N_("Error: Invalid Value for optimizer_search_depth");
872
895
    exit(-1);
873
896
  }
874
897
  global_system_variables.optimizer_search_depth= in_optimizer_search_depth;
879
902
  global_system_variables.preload_buff_size= (32*1024L);
880
903
  if (in_preload_buff_size < 1024 || in_preload_buff_size > 1024*1024*1024L)
881
904
  {
882
 
    cout << _("Error: Invalid Value for preload_buff_size");
 
905
    cout << N_("Error: Invalid Value for preload_buff_size");
883
906
    exit(-1);
884
907
  }
885
908
  global_system_variables.preload_buff_size= in_preload_buff_size;
890
913
  global_system_variables.query_alloc_block_size= QUERY_ALLOC_BLOCK_SIZE;
891
914
  if (in_query_alloc_block_size < 1024)
892
915
  {
893
 
    cout << _("Error: Invalid Value for query_alloc_block_size");
 
916
    cout << N_("Error: Invalid Value for query_alloc_block_size");
894
917
    exit(-1);
895
918
  }
896
919
  in_query_alloc_block_size-= in_query_alloc_block_size % 1024;
902
925
  global_system_variables.query_prealloc_size= QUERY_ALLOC_PREALLOC_SIZE;
903
926
  if (in_query_prealloc_size < QUERY_ALLOC_PREALLOC_SIZE)
904
927
  {
905
 
    cout << _("Error: Invalid Value for query_prealloc_size");
 
928
    cout << N_("Error: Invalid Value for query_prealloc_size");
906
929
    exit(-1);
907
930
  }
908
931
  in_query_prealloc_size-= in_query_prealloc_size % 1024;
914
937
  global_system_variables.range_alloc_block_size= RANGE_ALLOC_BLOCK_SIZE;
915
938
  if (in_range_alloc_block_size < RANGE_ALLOC_BLOCK_SIZE)
916
939
  {
917
 
    cout << _("Error: Invalid Value for range_alloc_block_size");
 
940
    cout << N_("Error: Invalid Value for range_alloc_block_size");
918
941
    exit(-1);
919
942
  }
920
943
  in_range_alloc_block_size-= in_range_alloc_block_size % 1024;
926
949
  global_system_variables.read_buff_size= (128*1024L);
927
950
  if (in_read_buff_size < IO_SIZE*2 || in_read_buff_size > INT32_MAX)
928
951
  {
929
 
    cout << _("Error: Invalid Value for read_buff_size");
 
952
    cout << N_("Error: Invalid Value for read_buff_size");
930
953
    exit(-1);
931
954
  }
932
955
  in_read_buff_size-= in_read_buff_size % IO_SIZE;
938
961
  global_system_variables.read_rnd_buff_size= (256*1024L);
939
962
  if (in_read_rnd_buff_size < 64 || in_read_rnd_buff_size > UINT32_MAX)
940
963
  {
941
 
    cout << _("Error: Invalid Value for read_rnd_buff_size");
 
964
    cout << N_("Error: Invalid Value for read_rnd_buff_size");
942
965
    exit(-1);
943
966
  }
944
967
  global_system_variables.read_rnd_buff_size= in_read_rnd_buff_size;
949
972
  global_system_variables.sortbuff_size= MAX_SORT_MEMORY;
950
973
  if ((uint32_t)in_sortbuff_size < MIN_SORT_MEMORY)
951
974
  {
952
 
    cout << _("Error: Invalid Value for sort_buff_size");
 
975
    cout << N_("Error: Invalid Value for sort_buff_size");
953
976
    exit(-1);
954
977
  }
955
978
  global_system_variables.sortbuff_size= in_sortbuff_size;
960
983
  table_def_size= 128;
961
984
  if (in_table_def_size < 1 || in_table_def_size > 512*1024L)
962
985
  {
963
 
    cout << _("Error: Invalid Value for table_def_size");
 
986
    cout << N_("Error: Invalid Value for table_def_size");
964
987
    exit(-1);
965
988
  }
966
989
  table_def_size= in_table_def_size;
971
994
  table_cache_size= TABLE_OPEN_CACHE_DEFAULT;
972
995
  if (in_table_cache_size < TABLE_OPEN_CACHE_MIN || in_table_cache_size > 512*1024L)
973
996
  {
974
 
    cout << _("Error: Invalid Value for table_cache_size");
 
997
    cout << N_("Error: Invalid Value for table_cache_size");
975
998
    exit(-1);
976
999
  }
977
1000
  table_cache_size= in_table_cache_size;
982
1005
  table_lock_wait_timeout= 50;
983
1006
  if (in_table_lock_wait_timeout < 1 || in_table_lock_wait_timeout > 1024*1024*1024)
984
1007
  {
985
 
    cout << _("Error: Invalid Value for table_lock_wait_timeout");
 
1008
    cout << N_("Error: Invalid Value for table_lock_wait_timeout");
986
1009
    exit(-1);
987
1010
  }
988
1011
  table_lock_wait_timeout= in_table_lock_wait_timeout;
998
1021
  global_system_variables.tmp_table_size= 16*1024*1024L;
999
1022
  if (in_tmp_table_size < 1024 || in_tmp_table_size > MAX_MEM_TABLE_SIZE)
1000
1023
  {
1001
 
    cout << _("Error: Invalid Value for table_lock_wait_timeout");
 
1024
    cout << N_("Error: Invalid Value for table_lock_wait_timeout");
1002
1025
    exit(-1);
1003
1026
  }
1004
1027
  global_system_variables.tmp_table_size= in_tmp_table_size;
1006
1029
 
1007
1030
static void check_limits_transaction_message_threshold(size_t in_transaction_message_threshold)
1008
1031
{
1009
 
  transaction_message_threshold= 1024*1024;
 
1032
  global_system_variables.transaction_message_threshold= 1024*1024;
1010
1033
  if ((int64_t) in_transaction_message_threshold < 128*1024 || (int64_t)in_transaction_message_threshold > 1024*1024)
1011
1034
  {
1012
 
    cout << _("Error: Invalid Value for transaction_message_threshold valid values are between 131072 - 1048576 bytes");
 
1035
    cout << N_("Error: Invalid Value for transaction_message_threshold valid values are between 131072 - 1048576 bytes");
1013
1036
    exit(-1);
1014
1037
  }
1015
 
  transaction_message_threshold= in_transaction_message_threshold;
 
1038
  global_system_variables.transaction_message_threshold= in_transaction_message_threshold;
 
1039
}
 
1040
 
 
1041
static pair<string, string> parse_size_suffixes(string s)
 
1042
{
 
1043
  size_t equal_pos= s.find("=");
 
1044
  if (equal_pos != string::npos)
 
1045
  {
 
1046
    string arg_key(s.substr(0, equal_pos));
 
1047
    string arg_val(s.substr(equal_pos+1));
 
1048
 
 
1049
    try
 
1050
    {
 
1051
      size_t size_suffix_pos= arg_val.find_last_of("kmgKMG");
 
1052
      if (size_suffix_pos == arg_val.size()-1)
 
1053
      {
 
1054
        char suffix= arg_val[size_suffix_pos];
 
1055
        string size_val(arg_val.substr(0, size_suffix_pos));
 
1056
 
 
1057
        uint64_t base_size= boost::lexical_cast<uint64_t>(size_val);
 
1058
        uint64_t new_size= 0;
 
1059
 
 
1060
        switch (suffix)
 
1061
        {
 
1062
        case 'K':
 
1063
        case 'k':
 
1064
          new_size= base_size * 1024;
 
1065
          break;
 
1066
        case 'M':
 
1067
        case 'm':
 
1068
          new_size= base_size * 1024 * 1024;
 
1069
          break;
 
1070
        case 'G':
 
1071
        case 'g':
 
1072
          new_size= base_size * 1024 * 1024 * 1024;
 
1073
          break;
 
1074
        }
 
1075
        return make_pair(arg_key,
 
1076
                         boost::lexical_cast<string>(new_size));
 
1077
      }
 
1078
    }
 
1079
    catch (...)
 
1080
    {
 
1081
      /* Screw it, let the normal parser take over */
 
1082
    }
 
1083
  }
 
1084
 
 
1085
  return make_pair(string(""), string(""));
 
1086
}
 
1087
 
 
1088
static pair<string, string> parse_size_arg(string s)
 
1089
{
 
1090
  if (s.find("--") == 0)
 
1091
  {
 
1092
    return parse_size_suffixes(s.substr(2));
 
1093
  }
 
1094
  return make_pair(string(""), string(""));
1016
1095
}
1017
1096
 
1018
1097
static void process_defaults_files()
1066
1145
      defaults_file_list.push_back(*it);
1067
1146
    else
1068
1147
    {
1069
 
      errmsg_printf(error::ERROR,
 
1148
      errmsg_printf(ERRMSG_LVL_ERROR,
1070
1149
                  _("Defaults file '%s' not found\n"), (*it).c_str());
1071
1150
      unireg_abort(1);
1072
1151
    }
1074
1153
  }
1075
1154
}
1076
1155
 
1077
 
int init_basic_variables(int argc, char **argv)
 
1156
int init_common_variables(int argc, char **argv, module::Registry &plugins)
1078
1157
{
1079
1158
  time_t curr_time;
1080
1159
  umask(((~internal::my_umask) & 0666));
1081
 
  decimal_zero.set_zero(); // set decimal_zero constant;
 
1160
  my_decimal_set_zero(&decimal_zero); // set decimal_zero constant;
1082
1161
  tzset();                      // Set tzname
1083
1162
 
1084
1163
  curr_time= time(NULL);
1091
1170
  drizzle_init_variables();
1092
1171
 
1093
1172
  find_plugin_dir(argv[0]);
 
1173
  {
 
1174
    struct tm tm_tmp;
 
1175
    localtime_r(&server_start_time,&tm_tmp);
 
1176
    strncpy(system_time_zone, tzname[tm_tmp.tm_isdst != 0 ? 1 : 0],
 
1177
            sizeof(system_time_zone)-1);
1094
1178
 
 
1179
  }
1095
1180
  /*
1096
1181
    We set SYSTEM time zone as reasonable default and
1097
1182
    also for failure of my_tz_init() and bootstrap mode.
1100
1185
  */
1101
1186
  global_system_variables.time_zone= my_tz_SYSTEM;
1102
1187
 
1103
 
  char ret_hostname[FN_REFLEN];
1104
 
  if (gethostname(ret_hostname,sizeof(ret_hostname)) < 0)
 
1188
  if (gethostname(glob_hostname,sizeof(glob_hostname)) < 0)
1105
1189
  {
1106
 
    errmsg_printf(error::WARN,
1107
 
                  _("gethostname failed, using '%s' as hostname"),
1108
 
                  getServerHostname().c_str());
 
1190
    strncpy(glob_hostname, STRING_WITH_LEN("localhost"));
 
1191
    errmsg_printf(ERRMSG_LVL_WARN, _("gethostname failed, using '%s' as hostname"),
 
1192
                  glob_hostname);
1109
1193
    pid_file= "drizzle";
1110
1194
  }
1111
1195
  else
1112
1196
  {
1113
 
    setServerHostname(ret_hostname);
1114
 
    pid_file= getServerHostname();
 
1197
    pid_file= glob_hostname;
1115
1198
  }
1116
1199
  pid_file.replace_extension(".pid");
1117
1200
 
1118
1201
  system_config_dir /= "drizzle";
 
1202
  std::string system_config_file_drizzle("drizzled.cnf");
1119
1203
 
1120
1204
  config_options.add_options()
1121
1205
  ("help,?", po::value<bool>(&opt_help)->default_value(false)->zero_tokens(),
1122
 
  _("Display this help and exit."))
1123
 
  ("daemon,d", po::value<bool>(&opt_daemon)->default_value(false)->zero_tokens(),
1124
 
  _("Run as a daemon."))
 
1206
  N_("Display this help and exit."))
1125
1207
  ("no-defaults", po::value<bool>()->default_value(false)->zero_tokens(),
1126
 
  _("Configuration file defaults are not used if no-defaults is set"))
 
1208
  N_("Configuration file defaults are not used if no-defaults is set"))
1127
1209
  ("defaults-file", po::value<vector<string> >()->composing()->notifier(&compose_defaults_file_list),
1128
 
  _("Configuration file to use"))
 
1210
   N_("Configuration file to use"))
1129
1211
  ("config-dir", po::value<fs::path>(&system_config_dir),
1130
 
  _("Base location for config files"))
 
1212
   N_("Base location for config files"))
1131
1213
  ("plugin-dir", po::value<fs::path>(&plugin_dir)->notifier(&notify_plugin_dir),
1132
 
  _("Directory for plugins."))
 
1214
  N_("Directory for plugins."))
1133
1215
  ;
1134
1216
 
1135
1217
  plugin_load_options.add_options()
1136
1218
  ("plugin-add", po::value<vector<string> >()->composing()->notifier(&compose_plugin_add),
1137
 
  _("Optional comma separated list of plugins to load at startup in addition "
 
1219
  N_("Optional comma separated list of plugins to load at startup in addition "
1138
1220
     "to the default list of plugins. "
1139
1221
     "[for example: --plugin_add=crc32,logger_gearman]"))    
1140
1222
  ("plugin-remove", po::value<vector<string> >()->composing()->notifier(&compose_plugin_remove),
1141
 
  _("Optional comma separated list of plugins to not load at startup. Effectively "
 
1223
  N_("Optional comma separated list of plugins to not load at startup. Effectively "
1142
1224
     "removes a plugin from the list of plugins to be loaded. "
1143
1225
     "[for example: --plugin_remove=crc32,logger_gearman]"))
1144
1226
  ("plugin-load", po::value<string>()->notifier(&notify_plugin_load)->default_value(PANDORA_PLUGIN_LIST),
1145
 
  _("Optional comma separated list of plugins to load at starup instead of "
 
1227
  N_("Optional comma separated list of plugins to load at starup instead of "
1146
1228
     "the default plugin load list. "
1147
1229
     "[for example: --plugin_load=crc32,logger_gearman]"))
1148
1230
  ;
1149
1231
 
1150
1232
  long_options.add_options()
1151
1233
  ("auto-increment-increment", po::value<uint64_t>(&global_system_variables.auto_increment_increment)->default_value(1)->notifier(&check_limits_aii),
1152
 
  _("Auto-increment columns are incremented by this"))
 
1234
  N_("Auto-increment columns are incremented by this"))
1153
1235
  ("auto-increment-offset", po::value<uint64_t>(&global_system_variables.auto_increment_offset)->default_value(1)->notifier(&check_limits_aio),
1154
 
  _("Offset added to Auto-increment columns. Used when auto-increment-increment != 1"))
 
1236
  N_("Offset added to Auto-increment columns. Used when auto-increment-increment != 1"))
1155
1237
  ("basedir,b", po::value<fs::path>(&basedir),
1156
 
  _("Path to installation directory. All paths are usually resolved "
 
1238
  N_("Path to installation directory. All paths are usually resolved "
1157
1239
     "relative to this."))
1158
1240
  ("chroot,r", po::value<string>(),
1159
 
  _("Chroot drizzled daemon during startup."))
 
1241
  N_("Chroot drizzled daemon during startup."))
1160
1242
  ("collation-server", po::value<string>(),
1161
 
  _("Set the default collation."))      
 
1243
  N_("Set the default collation."))      
1162
1244
  ("completion-type", po::value<uint32_t>(&global_system_variables.completion_type)->default_value(0)->notifier(&check_limits_completion_type),
1163
 
  _("Default completion type."))
1164
 
  ("core-file",  _("Write core on errors."))
1165
 
  ("datadir", po::value<fs::path>(&getDataHome()),
1166
 
  _("Path to the database root."))
 
1245
  N_("Default completion type."))
 
1246
  ("core-file",  N_("Write core on errors."))
 
1247
  ("datadir", po::value<fs::path>(&data_home),
 
1248
  N_("Path to the database root."))
1167
1249
  ("default-storage-engine", po::value<string>(),
1168
 
  _("Set the default storage engine for tables."))
 
1250
  N_("Set the default storage engine for tables."))
1169
1251
  ("default-time-zone", po::value<string>(),
1170
 
  _("Set the default time zone."))
 
1252
  N_("Set the default time zone."))
1171
1253
  ("exit-info,T", po::value<long>(),
1172
 
  _("Used for debugging;  Use at your own risk!"))
 
1254
  N_("Used for debugging;  Use at your own risk!"))
1173
1255
  ("gdb", po::value<bool>(&opt_debugging)->default_value(false)->zero_tokens(),
1174
 
  _("Set up signals usable for debugging"))
 
1256
  N_("Set up signals usable for debugging"))
1175
1257
  ("lc-time-name", po::value<string>(),
1176
 
  _("Set the language used for the month names and the days of the week."))
 
1258
  N_("Set the language used for the month names and the days of the week."))
1177
1259
  ("log-warnings,W", po::value<bool>(&global_system_variables.log_warnings)->default_value(false)->zero_tokens(),
1178
 
  _("Log some not critical warnings to the log file."))  
 
1260
  N_("Log some not critical warnings to the log file."))  
1179
1261
  ("pid-file", po::value<fs::path>(&pid_file),
1180
 
  _("Pid file used by drizzled."))
 
1262
  N_("Pid file used by drizzled."))
1181
1263
  ("port-open-timeout", po::value<uint32_t>(&drizzled_bind_timeout)->default_value(0),
1182
 
  _("Maximum time in seconds to wait for the port to become free. "))
1183
 
  ("replicate-query", po::value<bool>(&global_system_variables.replicate_query)->default_value(false)->zero_tokens(),
1184
 
  _("Include the SQL query in replicated protobuf messages."))
 
1264
  N_("Maximum time in seconds to wait for the port to become free. "))
1185
1265
  ("secure-file-priv", po::value<fs::path>(&secure_file_priv)->notifier(expand_secure_file_priv),
1186
 
  _("Limit LOAD DATA, SELECT ... OUTFILE, and LOAD_FILE() to files "
 
1266
  N_("Limit LOAD DATA, SELECT ... OUTFILE, and LOAD_FILE() to files "
1187
1267
     "within specified directory"))
1188
1268
  ("server-id", po::value<uint32_t>(&server_id)->default_value(0),
1189
 
  _("Uniquely identifies the server instance in the community of "
 
1269
  N_("Uniquely identifies the server instance in the community of "
1190
1270
     "replication partners."))
1191
1271
  ("skip-stack-trace",  
1192
 
  _("Don't print a stack trace on failure."))
 
1272
  N_("Don't print a stack trace on failure."))
1193
1273
  ("symbolic-links,s", po::value<bool>(&internal::my_use_symdir)->default_value(IF_PURIFY(false,true))->zero_tokens(),
1194
 
  _("Enable symbolic link support."))
 
1274
  N_("Enable symbolic link support."))
1195
1275
  ("timed-mutexes", po::value<bool>(&internal::timed_mutexes)->default_value(false)->zero_tokens(),
1196
 
  _("Specify whether to time mutexes (only InnoDB mutexes are currently "
 
1276
  N_("Specify whether to time mutexes (only InnoDB mutexes are currently "
1197
1277
     "supported)")) 
1198
1278
  ("tmpdir,t", po::value<string>(),
1199
 
  _("Path for temporary files."))
 
1279
  N_("Path for temporary files."))
1200
1280
  ("transaction-isolation", po::value<string>(),
1201
 
  _("Default transaction isolation level."))
1202
 
  ("transaction-message-threshold", po::value<size_t>(&transaction_message_threshold)->default_value(1024*1024)->notifier(&check_limits_transaction_message_threshold),
1203
 
  _("Max message size written to transaction log, valid values 131072 - 1048576 bytes."))
 
1281
  N_("Default transaction isolation level."))
 
1282
  ("transaction-message-threshold", po::value<size_t>(&global_system_variables.transaction_message_threshold)->default_value(1024*1024)->notifier(&check_limits_transaction_message_threshold),
 
1283
  N_("Max message size written to transaction log, valid values 131072 - 1048576 bytes."))
1204
1284
  ("user,u", po::value<string>(),
1205
 
  _("Run drizzled daemon as user."))  
 
1285
  N_("Run drizzled daemon as user."))  
1206
1286
  ("version,V", 
1207
 
  _("Output version information and exit."))
 
1287
  N_("Output version information and exit."))
1208
1288
  ("back-log", po::value<back_log_constraints>(&back_log),
1209
 
  _("The number of outstanding connection requests Drizzle can have. This "
 
1289
  N_("The number of outstanding connection requests Drizzle can have. This "
1210
1290
     "comes into play when the main Drizzle thread gets very many connection "
1211
1291
     "requests in a very short time."))
1212
1292
  ("bulk-insert-buffer-size", 
1213
1293
  po::value<uint64_t>(&global_system_variables.bulk_insert_buff_size)->default_value(8192*1024),
1214
 
  _("Size of tree cache used in bulk insert optimization. Note that this is "
 
1294
  N_("Size of tree cache used in bulk insert optimization. Note that this is "
1215
1295
     "a limit per thread!"))
1216
1296
  ("div-precision-increment",  po::value<uint32_t>(&global_system_variables.div_precincrement)->default_value(4)->notifier(&check_limits_dpi),
1217
 
  _("Precision of the result of '/' operator will be increased on that "
 
1297
  N_("Precision of the result of '/' operator will be increased on that "
1218
1298
     "value."))
1219
1299
  ("group-concat-max-len", po::value<uint64_t>(&global_system_variables.group_concat_max_len)->default_value(1024)->notifier(&check_limits_gcml),
1220
 
  _("The maximum length of the result of function  group_concat."))
 
1300
  N_("The maximum length of the result of function  group_concat."))
1221
1301
  ("join-buffer-size", po::value<uint64_t>(&global_system_variables.join_buff_size)->default_value(128*1024L)->notifier(&check_limits_join_buffer_size),
1222
 
  _("The size of the buffer that is used for full joins."))
1223
 
  ("join-heap-threshold",
1224
 
  po::value<uint64_t>()->default_value(0),
1225
 
  _("A global cap on the amount of memory that can be allocated by session join buffers (0 means unlimited)"))
 
1302
  N_("The size of the buffer that is used for full joins."))
1226
1303
  ("max-allowed-packet", po::value<uint32_t>(&global_system_variables.max_allowed_packet)->default_value(64*1024*1024L)->notifier(&check_limits_map),
1227
 
  _("Max packetlength to send/receive from to server."))
 
1304
  N_("Max packetlength to send/receive from to server."))
 
1305
  ("max-connect-errors", po::value<uint64_t>(&max_connect_errors)->default_value(MAX_CONNECT_ERRORS)->notifier(&check_limits_mce),
 
1306
  N_("If there is more than this number of interrupted connections from a "
 
1307
     "host this host will be blocked from further connections."))
1228
1308
  ("max-error-count", po::value<uint64_t>(&global_system_variables.max_error_count)->default_value(DEFAULT_ERROR_COUNT)->notifier(&check_limits_max_err_cnt),
1229
 
  _("Max number of errors/warnings to store for a statement."))
 
1309
  N_("Max number of errors/warnings to store for a statement."))
1230
1310
  ("max-heap-table-size", po::value<uint64_t>(&global_system_variables.max_heap_table_size)->default_value(16*1024*1024L)->notifier(&check_limits_mhts),
1231
 
  _("Don't allow creation of heap tables bigger than this."))
 
1311
  N_("Don't allow creation of heap tables bigger than this."))
1232
1312
  ("max-join-size", po::value<drizzled::ha_rows>(&global_system_variables.max_join_size)->default_value(INT32_MAX)->notifier(&check_limits_max_join_size),
1233
 
  _("Joins that are probably going to read more than max_join_size records "
 
1313
  N_("Joins that are probably going to read more than max_join_size records "
1234
1314
     "return an error."))
1235
1315
  ("max-length-for-sort-data", po::value<uint64_t>(&global_system_variables.max_length_for_sort_data)->default_value(1024)->notifier(&check_limits_mlfsd),
1236
 
  _("Max number of bytes in sorted records."))
 
1316
  N_("Max number of bytes in sorted records."))
1237
1317
  ("max-seeks-for-key", po::value<uint64_t>(&global_system_variables.max_seeks_for_key)->default_value(ULONG_MAX)->notifier(&check_limits_msfk),
1238
 
  _("Limit assumed max number of seeks when looking up rows based on a key"))
 
1318
  N_("Limit assumed max number of seeks when looking up rows based on a key"))
1239
1319
  ("max-sort-length", po::value<size_t>(&global_system_variables.max_sort_length)->default_value(1024)->notifier(&check_limits_max_sort_length),  
1240
 
  _("The number of bytes to use when sorting BLOB or TEXT values "
 
1320
  N_("The number of bytes to use when sorting BLOB or TEXT values "
1241
1321
     "(only the first max_sort_length bytes of each value are used; the "
1242
1322
     "rest are ignored)."))
1243
1323
  ("max-write-lock-count", po::value<uint64_t>(&max_write_lock_count)->default_value(UINT64_MAX),
1244
 
  _("After this many write locks, allow some read locks to run in between."))
 
1324
  N_("After this many write locks, allow some read locks to run in between."))
1245
1325
  ("min-examined-row-limit", po::value<uint64_t>(&global_system_variables.min_examined_row_limit)->default_value(0)->notifier(&check_limits_merl),
1246
 
  _("Don't log queries which examine less than min_examined_row_limit "
 
1326
  N_("Don't log queries which examine less than min_examined_row_limit "
1247
1327
     "rows to file."))
1248
1328
  ("disable-optimizer-prune",
1249
 
  _("Do not apply any heuristic(s) during query optimization to prune, "
 
1329
  N_("Do not apply any heuristic(s) during query optimization to prune, "
1250
1330
     "thus perform an exhaustive search from the optimizer search space."))
1251
1331
  ("optimizer-search-depth", po::value<uint32_t>(&global_system_variables.optimizer_search_depth)->default_value(0)->notifier(&check_limits_osd),
1252
 
  _("Maximum depth of search performed by the query optimizer. Values "
 
1332
  N_("Maximum depth of search performed by the query optimizer. Values "
1253
1333
     "larger than the number of relations in a query result in better query "
1254
1334
     "plans, but take longer to compile a query. Smaller values than the "
1255
1335
     "number of tables in a relation result in faster optimization, but may "
1258
1338
     "optimizer will switch to the original find_best (used for "
1259
1339
     "testing/comparison)."))
1260
1340
  ("preload-buffer-size", po::value<uint64_t>(&global_system_variables.preload_buff_size)->default_value(32*1024L)->notifier(&check_limits_pbs),
1261
 
  _("The size of the buffer that is allocated when preloading indexes"))
 
1341
  N_("The size of the buffer that is allocated when preloading indexes"))
1262
1342
  ("query-alloc-block-size", 
1263
1343
  po::value<uint32_t>(&global_system_variables.query_alloc_block_size)->default_value(QUERY_ALLOC_BLOCK_SIZE)->notifier(&check_limits_qabs),
1264
 
  _("Allocation block size for query parsing and execution"))
 
1344
  N_("Allocation block size for query parsing and execution"))
1265
1345
  ("query-prealloc-size",
1266
1346
  po::value<uint32_t>(&global_system_variables.query_prealloc_size)->default_value(QUERY_ALLOC_PREALLOC_SIZE)->notifier(&check_limits_qps),
1267
 
  _("Persistent buffer for query parsing and execution"))
 
1347
  N_("Persistent buffer for query parsing and execution"))
1268
1348
  ("range-alloc-block-size",
1269
1349
  po::value<size_t>(&global_system_variables.range_alloc_block_size)->default_value(RANGE_ALLOC_BLOCK_SIZE)->notifier(&check_limits_rabs),
1270
 
  _("Allocation block size for storing ranges during optimization"))
 
1350
  N_("Allocation block size for storing ranges during optimization"))
1271
1351
  ("read-buffer-size",
1272
1352
  po::value<uint32_t>(&global_system_variables.read_buff_size)->default_value(128*1024L)->notifier(&check_limits_read_buffer_size),
1273
 
  _("Each thread that does a sequential scan allocates a buffer of this "
 
1353
  N_("Each thread that does a sequential scan allocates a buffer of this "
1274
1354
      "size for each table it scans. If you do many sequential scans, you may "
1275
1355
      "want to increase this value."))
1276
 
  ("read-buffer-threshold",
1277
 
  po::value<uint64_t>()->default_value(0),
1278
 
  _("A global cap on the size of read-buffer-size (0 means unlimited)"))
1279
1356
  ("read-rnd-buffer-size",
1280
1357
  po::value<uint32_t>(&global_system_variables.read_rnd_buff_size)->default_value(256*1024L)->notifier(&check_limits_read_rnd_buffer_size),
1281
 
  _("When reading rows in sorted order after a sort, the rows are read "
 
1358
  N_("When reading rows in sorted order after a sort, the rows are read "
1282
1359
     "through this buffer to avoid a disk seeks. If not set, then it's set "
1283
1360
     "to the value of record_buffer."))
1284
 
  ("read-rnd-threshold",
1285
 
  po::value<uint64_t>()->default_value(0),
1286
 
  _("A global cap on the size of read-rnd-buffer-size (0 means unlimited)"))
1287
1361
  ("scheduler", po::value<string>(),
1288
 
  _("Select scheduler to be used (by default multi-thread)."))
 
1362
  N_("Select scheduler to be used (by default multi-thread)."))
1289
1363
  ("sort-buffer-size",
1290
1364
  po::value<size_t>(&global_system_variables.sortbuff_size)->default_value(MAX_SORT_MEMORY)->notifier(&check_limits_sort_buffer_size),
1291
 
  _("Each thread that needs to do a sort allocates a buffer of this size."))
1292
 
  ("sort-heap-threshold",
1293
 
  po::value<uint64_t>()->default_value(0),
1294
 
  _("A global cap on the amount of memory that can be allocated by session sort buffers (0 means unlimited)"))
 
1365
  N_("Each thread that needs to do a sort allocates a buffer of this size."))
1295
1366
  ("table-definition-cache", po::value<size_t>(&table_def_size)->default_value(128)->notifier(&check_limits_tdc),
1296
 
  _("The number of cached table definitions."))
 
1367
  N_("The number of cached table definitions."))
1297
1368
  ("table-open-cache", po::value<uint64_t>(&table_cache_size)->default_value(TABLE_OPEN_CACHE_DEFAULT)->notifier(&check_limits_toc),
1298
 
  _("The number of cached open tables."))
 
1369
  N_("The number of cached open tables."))
1299
1370
  ("table-lock-wait-timeout", po::value<uint64_t>(&table_lock_wait_timeout)->default_value(50)->notifier(&check_limits_tlwt),
1300
 
  _("Timeout in seconds to wait for a table level lock before returning an "
 
1371
  N_("Timeout in seconds to wait for a table level lock before returning an "
1301
1372
     "error. Used only if the connection has active cursors."))
1302
1373
  ("thread-stack", po::value<size_t>(&my_thread_stack_size)->default_value(DEFAULT_THREAD_STACK)->notifier(&check_limits_thread_stack),
1303
 
  _("The stack size for each thread."))
 
1374
  N_("The stack size for each thread."))
1304
1375
  ("tmp-table-size", 
1305
1376
  po::value<uint64_t>(&global_system_variables.tmp_table_size)->default_value(16*1024*1024L)->notifier(&check_limits_tmp_table_size),
1306
 
  _("If an internal in-memory temporary table exceeds this size, Drizzle will"
 
1377
  N_("If an internal in-memory temporary table exceeds this size, Drizzle will"
1307
1378
     " automatically convert it to an on-disk MyISAM table."))
1308
 
  ("verbose", po::value<std::string>()->default_value(error::verbose_string())->notifier(&error::check_verbosity),
1309
 
  _("The stack size for each thread."))
1310
1379
  ;
1311
1380
 
1312
1381
  full_options.add(long_options);
1326
1395
  {
1327
1396
    po::store(parsed, vm);
1328
1397
  }
1329
 
  catch (std::exception&)
 
1398
  catch (...)
1330
1399
  {
1331
 
    errmsg_printf(error::ERROR, _("Duplicate entry for command line option\n"));
 
1400
    errmsg_printf(ERRMSG_LVL_ERROR, _("Duplicate entry for command line option\n"));
1332
1401
    unireg_abort(1);
1333
1402
  }
1334
1403
 
1335
1404
  if (not vm["no-defaults"].as<bool>())
1336
1405
  {
1337
 
    fs::path system_config_file_drizzle(system_config_dir);
1338
 
    system_config_file_drizzle /= "drizzled.cnf";
1339
1406
    defaults_file_list.insert(defaults_file_list.begin(),
1340
 
                              system_config_file_drizzle.file_string());
 
1407
                              system_config_file_drizzle);
1341
1408
 
1342
1409
    fs::path config_conf_d_location(system_config_dir);
1343
1410
    config_conf_d_location /= "conf.d";
1344
1411
 
1345
 
 
1346
1412
    CachedDirectory config_conf_d(config_conf_d_location.file_string());
1347
1413
    if (not config_conf_d.fail())
1348
1414
    {
1374
1440
  }
1375
1441
  catch (po::validation_error &err)
1376
1442
  {
1377
 
    errmsg_printf(error::ERROR,  
 
1443
    errmsg_printf(ERRMSG_LVL_ERROR,  
1378
1444
                  _("%s: %s.\n"
1379
1445
                    "Use --help to get a list of available options\n"),
1380
1446
                  internal::my_progname, err.what());
1392
1458
  }
1393
1459
  catch (po::validation_error &err)
1394
1460
  {
1395
 
    errmsg_printf(error::ERROR,
 
1461
    errmsg_printf(ERRMSG_LVL_ERROR,
1396
1462
                  _("%s: %s.\n"
1397
1463
                    "Use --help to get a list of available options\n"),
1398
1464
                  internal::my_progname, err.what());
1399
1465
    unireg_abort(1);
1400
1466
  }
1401
1467
 
1402
 
  return 0;
1403
 
}
1404
 
 
1405
 
int init_remaining_variables(module::Registry &plugins)
1406
 
{
1407
 
  int style = po::command_line_style::default_style & ~po::command_line_style::allow_guessing;
1408
 
 
1409
 
  current_pid= getpid();                /* Save for later ref */
1410
 
 
1411
1468
  /* At this point, we've read all the options we need to read from files and
1412
1469
     collected most of them into unknown options - now let's load everything
1413
1470
  */
1414
1471
 
1415
1472
  if (plugin_init(plugins, plugin_options))
1416
1473
  {
1417
 
    errmsg_printf(error::ERROR, _("Failed to initialize plugins\n"));
 
1474
    errmsg_printf(ERRMSG_LVL_ERROR, _("Failed to initialize plugins\n"));
1418
1475
    unireg_abort(1);
1419
1476
  }
1420
1477
 
1425
1482
  {
1426
1483
    po::parsed_options final_parsed=
1427
1484
      po::command_line_parser(unknown_options).style(style).
1428
 
      options(full_options).extra_parser(dpo::parse_size_arg).run();
 
1485
      options(full_options).extra_parser(parse_size_arg).run();
1429
1486
 
1430
1487
    final_unknown_options=
1431
1488
      po::collect_unrecognized(final_parsed.options, po::include_positional);
1435
1492
  }
1436
1493
  catch (po::validation_error &err)
1437
1494
  {
1438
 
    errmsg_printf(error::ERROR,
 
1495
    errmsg_printf(ERRMSG_LVL_ERROR,
1439
1496
                  _("%s: %s.\n"
1440
1497
                    "Use --help to get a list of available options\n"),
1441
1498
                  internal::my_progname, err.what());
1443
1500
  }
1444
1501
  catch (po::invalid_command_line_syntax &err)
1445
1502
  {
1446
 
    errmsg_printf(error::ERROR,
 
1503
    errmsg_printf(ERRMSG_LVL_ERROR,
1447
1504
                  _("%s: %s.\n"
1448
1505
                    "Use --help to get a list of available options\n"),
1449
1506
                  internal::my_progname, err.what());
1451
1508
  }
1452
1509
  catch (po::unknown_option &err)
1453
1510
  {
1454
 
    errmsg_printf(error::ERROR,
 
1511
    errmsg_printf(ERRMSG_LVL_ERROR,
1455
1512
                  _("%s\nUse --help to get a list of available options\n"),
1456
1513
                  err.what());
1457
1514
    unireg_abort(1);
1463
1520
  }
1464
1521
  catch (po::validation_error &err)
1465
1522
  {
1466
 
    errmsg_printf(error::ERROR,  
 
1523
    errmsg_printf(ERRMSG_LVL_ERROR,  
1467
1524
                  _("%s: %s.\n"
1468
1525
                    "Use --help to get a list of available options\n"),
1469
1526
                  internal::my_progname, err.what());
1487
1544
 
1488
1545
  fix_paths();
1489
1546
 
 
1547
  current_pid= getpid();                /* Save for later ref */
1490
1548
  init_time();                          /* Init time-functions (read zone) */
1491
1549
 
1492
1550
  if (item_create_init())
1500
1558
  if (!(default_charset_info=
1501
1559
        get_charset_by_csname(default_character_set_name, MY_CS_PRIMARY)))
1502
1560
  {
1503
 
    errmsg_printf(error::ERROR, _("Error getting default charset"));
 
1561
    errmsg_printf(ERRMSG_LVL_ERROR, _("Error getting default charset"));
1504
1562
    return 1;                           // Eof of the list
1505
1563
  }
1506
1564
 
1512
1570
    const CHARSET_INFO * const default_collation= get_charset_by_name(default_collation_name);
1513
1571
    if (not default_collation)
1514
1572
    {
1515
 
      errmsg_printf(error::ERROR, _(ER(ER_UNKNOWN_COLLATION)), default_collation_name);
 
1573
      errmsg_printf(ERRMSG_LVL_ERROR, _(ER(ER_UNKNOWN_COLLATION)), default_collation_name);
1516
1574
      return 1;
1517
1575
    }
1518
1576
    if (not my_charset_same(default_charset_info, default_collation))
1519
1577
    {
1520
 
      errmsg_printf(error::ERROR, _(ER(ER_COLLATION_CHARSET_MISMATCH)),
 
1578
      errmsg_printf(ERRMSG_LVL_ERROR, _(ER(ER_COLLATION_CHARSET_MISMATCH)),
1521
1579
                    default_collation_name,
1522
1580
                    default_charset_info->csname);
1523
1581
      return 1;
1530
1588
  if (not (character_set_filesystem=
1531
1589
           get_charset_by_csname(character_set_filesystem_name, MY_CS_PRIMARY)))
1532
1590
  {
1533
 
    errmsg_printf(error::ERROR, _("Error setting collation"));
 
1591
    errmsg_printf(ERRMSG_LVL_ERROR, _("Error setting collation"));
1534
1592
    return 1;
1535
1593
  }
1536
1594
  global_system_variables.character_set_filesystem= character_set_filesystem;
1538
1596
  if (!(my_default_lc_time_names=
1539
1597
        my_locale_by_name(lc_time_names_name)))
1540
1598
  {
1541
 
    errmsg_printf(error::ERROR, _("Unknown locale: '%s'"), lc_time_names_name);
 
1599
    errmsg_printf(ERRMSG_LVL_ERROR, _("Unknown locale: '%s'"), lc_time_names_name);
1542
1600
    return 1;
1543
1601
  }
1544
1602
  global_system_variables.lc_time_names= my_default_lc_time_names;
1558
1616
  */
1559
1617
  if (table_cache_init())
1560
1618
  {
1561
 
    errmsg_printf(error::ERROR, _("Could not initialize table cache\n"));
 
1619
    errmsg_printf(ERRMSG_LVL_ERROR, _("Could not initialize table cache\n"));
1562
1620
    unireg_abort(1);
1563
1621
  }
1564
1622
 
1565
1623
  // Resize the definition Cache at startup
1566
 
  table::Cache::singleton().rehash(table_def_size);
1567
1624
  definition::Cache::singleton().rehash(table_def_size);
1568
 
  message::Cache::singleton().rehash(table_def_size);
1569
1625
 
1570
1626
  setup_fpu();
1571
1627
 
1573
1629
 
1574
1630
  if (xid_cache_init())
1575
1631
  {
1576
 
    errmsg_printf(error::ERROR, _("XA cache initialization failed: Out of memory\n"));
 
1632
    errmsg_printf(ERRMSG_LVL_ERROR, _("XA cache initialization failed: Out of memory\n"));
1577
1633
    unireg_abort(1);
1578
1634
  }
1579
1635
 
1602
1658
 
1603
1659
  if (plugin::Scheduler::setPlugin(scheduler_name))
1604
1660
  {
1605
 
      errmsg_printf(error::ERROR,
 
1661
      errmsg_printf(ERRMSG_LVL_ERROR,
1606
1662
                   _("No scheduler found, cannot continue!\n"));
1607
1663
      unireg_abort(1);
1608
1664
  }
1627
1683
    engine= plugin::StorageEngine::findByName(name);
1628
1684
    if (engine == NULL)
1629
1685
    {
1630
 
      errmsg_printf(error::ERROR, _("Unknown/unsupported storage engine: %s\n"),
 
1686
      errmsg_printf(ERRMSG_LVL_ERROR, _("Unknown/unsupported storage engine: %s\n"),
1631
1687
                    default_storage_engine_str);
1632
1688
      unireg_abort(1);
1633
1689
    }
1668
1724
  OPT_BACK_LOG,
1669
1725
  OPT_JOIN_BUFF_SIZE,
1670
1726
  OPT_MAX_ALLOWED_PACKET,
 
1727
  OPT_MAX_CONNECT_ERRORS,
1671
1728
  OPT_MAX_HEP_TABLE_SIZE,
1672
1729
  OPT_MAX_JOIN_SIZE,
1673
1730
  OPT_MAX_SORT_LENGTH,
1721
1778
  {"help", '?', N_("Display this help and exit."),
1722
1779
   (char**) &opt_help, (char**) &opt_help, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0,
1723
1780
   0, 0},
1724
 
  {"daemon", 'd', N_("Run as daemon."),
1725
 
   (char**) &opt_daemon, (char**) &opt_daemon, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0,
1726
 
   0, 0},
1727
1781
  {"auto-increment-increment", OPT_AUTO_INCREMENT,
1728
1782
   N_("Auto-increment columns are incremented by this"),
1729
1783
   (char**) &global_system_variables.auto_increment_increment,
1760
1814
  {"datadir", 'h',
1761
1815
   N_("Path to the database root."),
1762
1816
   NULL, NULL, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
 
1817
  {"default-storage-engine", OPT_STORAGE_ENGINE,
 
1818
   N_("Set the default storage engine (table type) for tables."),
 
1819
   (char**)&default_storage_engine_str, (char**)&default_storage_engine_str,
 
1820
   0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
 
1821
  {"default-time-zone", OPT_DEFAULT_TIME_ZONE,
 
1822
   N_("Set the default time zone."),
 
1823
   (char**) &default_tz_name, (char**) &default_tz_name,
 
1824
   0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0 },
1763
1825
  /* See how it's handled in get_one_option() */
1764
1826
  {"exit-info", 'T',
1765
1827
   N_("Used for debugging;  Use at your own risk!"),
1770
1832
   N_("Set up signals usable for debugging"),
1771
1833
   (char**) &opt_debugging, (char**) &opt_debugging,
1772
1834
   0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
 
1835
  {"lc-time-names", OPT_LC_TIME_NAMES,
 
1836
   N_("Set the language used for the month names and the days of the week."),
 
1837
   (char**) &lc_time_names_name,
 
1838
   (char**) &lc_time_names_name,
 
1839
   0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0 },
1773
1840
  {"log-warnings", 'W',
1774
1841
   N_("Log some not critical warnings to the log file."),
1775
1842
   (char**) &global_system_variables.log_warnings,
1812
1879
      "supported)"),
1813
1880
   (char**) &internal::timed_mutexes, (char**) &internal::timed_mutexes, 0, GET_BOOL, NO_ARG, 0,
1814
1881
    0, 0, 0, 0, 0},
 
1882
  {"tmpdir", 't',
 
1883
   N_("Path for temporary files."),
 
1884
   (char**) &opt_drizzle_tmpdir,
 
1885
   (char**) &opt_drizzle_tmpdir, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
1815
1886
  {"transaction-isolation", OPT_TX_ISOLATION,
1816
1887
   N_("Default transaction isolation level."),
1817
1888
   0, 0, 0, GET_STR, REQUIRED_ARG, 0,
1820
1891
   N_("Run drizzled daemon as user."),
1821
1892
   0, 0, 0, GET_STR, REQUIRED_ARG,
1822
1893
   0, 0, 0, 0, 0, 0},
 
1894
  {"version", 'V',
 
1895
   N_("Output version information and exit."),
 
1896
   0, 0, 0, GET_NO_ARG,
 
1897
   NO_ARG, 0, 0, 0, 0, 0, 0},
1823
1898
  {"back_log", OPT_BACK_LOG,
1824
1899
   N_("The number of outstanding connection requests Drizzle can have. This "
1825
1900
      "comes into play when the main Drizzle thread gets very many connection "
1838
1913
   (char**) &global_system_variables.div_precincrement,
1839
1914
   (char**) &max_system_variables.div_precincrement, 0, GET_UINT,
1840
1915
   REQUIRED_ARG, 4, 0, DECIMAL_MAX_SCALE, 0, 0, 0},
 
1916
  { "group_concat_max_len", OPT_GROUP_CONCAT_MAX_LEN,
 
1917
    N_("The maximum length of the result of function  group_concat."),
 
1918
    (char**) &global_system_variables.group_concat_max_len,
 
1919
    (char**) &max_system_variables.group_concat_max_len, 0, GET_UINT64,
 
1920
    REQUIRED_ARG, 1024, 4, ULONG_MAX, 0, 1, 0},
1841
1921
  { "join_buffer_size", OPT_JOIN_BUFF_SIZE,
1842
1922
    N_("The size of the buffer that is used for full joins."),
1843
1923
   (char**) &global_system_variables.join_buff_size,
1849
1929
   (char**) &global_system_variables.max_allowed_packet,
1850
1930
   (char**) &max_system_variables.max_allowed_packet, 0, GET_UINT32,
1851
1931
   REQUIRED_ARG, 64*1024*1024L, 1024, 1024L*1024L*1024L, MALLOC_OVERHEAD, 1024, 0},
 
1932
  {"max_connect_errors", OPT_MAX_CONNECT_ERRORS,
 
1933
   N_("If there is more than this number of interrupted connections from a "
 
1934
      "host this host will be blocked from further connections."),
 
1935
   (char**) &max_connect_errors, (char**) &max_connect_errors, 0, GET_UINT64,
 
1936
   REQUIRED_ARG, MAX_CONNECT_ERRORS, 1, ULONG_MAX, 0, 1, 0},
 
1937
  {"max_error_count", OPT_MAX_ERROR_COUNT,
 
1938
   N_("Max number of errors/warnings to store for a statement."),
 
1939
   (char**) &global_system_variables.max_error_count,
 
1940
   (char**) &max_system_variables.max_error_count,
 
1941
   0, GET_UINT64, REQUIRED_ARG, DEFAULT_ERROR_COUNT, 0, 65535, 0, 1, 0},
1852
1942
  {"max_heap_table_size", OPT_MAX_HEP_TABLE_SIZE,
1853
1943
   N_("Don't allow creation of heap tables bigger than this."),
1854
1944
   (char**) &global_system_variables.max_heap_table_size,
1968
2058
   (char**) &max_system_variables.read_rnd_buff_size, 0,
1969
2059
   GET_UINT, REQUIRED_ARG, 256*1024L, 64 /*IO_SIZE*2+MALLOC_OVERHEAD*/ ,
1970
2060
   UINT32_MAX, MALLOC_OVERHEAD, 1 /* Small lower limit to be able to test MRR */, 0},
 
2061
  {"scheduler", OPT_SCHEDULER,
 
2062
   N_("Select scheduler to be used (by default multi-thread)."),
 
2063
   (char**)&opt_scheduler, (char**)&opt_scheduler,
 
2064
   0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
1971
2065
  /* x8 compared to MySQL's x2. We have UTF8 to consider. */
1972
2066
  {"sort_buffer_size", OPT_SORT_BUFFER,
1973
2067
   N_("Each thread that needs to do a sort allocates a buffer of this size."),
2061
2155
  opt_tc_log_file= (char *)"tc.log";      // no hostname in tc_log file name !
2062
2156
  cleanup_done= 0;
2063
2157
  dropping_tables= ha_open_options=0;
2064
 
  getDebug().reset();
 
2158
  test_flags.reset();
2065
2159
  wake_thread=0;
2066
2160
  abort_loop= select_thread_in_use= false;
2067
 
  shutdown_in_progress= 0;
 
2161
  ready_to_exit= shutdown_in_progress= 0;
2068
2162
  drizzled_user= drizzled_chroot= 0;
2069
2163
  memset(&current_global_counters, 0, sizeof(current_global_counters));
2070
2164
  key_map_full.set();
2079
2173
  session_startup_options= (OPTION_AUTO_IS_NULL | OPTION_SQL_NOTES);
2080
2174
  refresh_version= 1L;  /* Increments on each reload */
2081
2175
  global_thread_id= 1UL;
2082
 
  session::Cache::singleton().getCache().clear();
 
2176
  getSessionList().clear();
2083
2177
 
2084
2178
  /* Variables in libraries */
2085
2179
  default_character_set_name= "utf8";
2129
2223
#else
2130
2224
  have_symlink=SHOW_OPTION_YES;
2131
2225
#endif
 
2226
 
 
2227
  connection_count= 0;
2132
2228
}
2133
2229
 
2134
2230
 
2149
2245
      drizzled_user= (char *)vm["user"].as<string>().c_str();
2150
2246
 
2151
2247
    else
2152
 
      errmsg_printf(error::WARN, _("Ignoring user change to '%s' because the user was "
 
2248
      errmsg_printf(ERRMSG_LVL_WARN, _("Ignoring user change to '%s' because the user was "
2153
2249
                                       "set to '%s' earlier on the command line\n"),
2154
2250
                    vm["user"].as<string>().c_str(), drizzled_user);
2155
2251
  }
2160
2256
    exit(0);
2161
2257
  }
2162
2258
 
2163
 
  if (vm.count("sort-heap-threshold"))
2164
 
  {
2165
 
    if ((vm["sort-heap-threshold"].as<uint64_t>() > 0) and
2166
 
      (vm["sort-heap-threshold"].as<uint64_t>() < 
2167
 
      global_system_variables.sortbuff_size))
2168
 
    {
2169
 
      cout << _("Error: sort-heap-threshold cannot be less than sort-buffer-size") << endl;
2170
 
      exit(-1);
2171
 
    }
2172
 
 
2173
 
    global_sort_buffer.setMaxSize(vm["sort-heap-threshold"].as<uint64_t>());
2174
 
  }
2175
 
 
2176
 
  if (vm.count("join-heap-threshold"))
2177
 
  {
2178
 
    if ((vm["join-heap-threshold"].as<uint64_t>() > 0) and
2179
 
      (vm["join-heap-threshold"].as<uint64_t>() <
2180
 
      global_system_variables.join_buff_size))
2181
 
    {
2182
 
      cout << _("Error: join-heap-threshold cannot be less than join-buffer-size") << endl;
2183
 
      exit(-1);
2184
 
    }
2185
 
 
2186
 
    global_join_buffer.setMaxSize(vm["join-heap-threshold"].as<uint64_t>());
2187
 
  }
2188
 
 
2189
 
  if (vm.count("read-rnd-threshold"))
2190
 
  {
2191
 
    if ((vm["read-rnd-threshold"].as<uint64_t>() > 0) and
2192
 
      (vm["read-rnd-threshold"].as<uint64_t>() <
2193
 
      global_system_variables.read_rnd_buff_size))
2194
 
    {
2195
 
      cout << _("Error: read-rnd-threshold cannot be less than read-rnd-buffer-size") << endl;
2196
 
      exit(-1);
2197
 
    }
2198
 
 
2199
 
    global_read_rnd_buffer.setMaxSize(vm["read-rnd-threshold"].as<uint64_t>());
2200
 
  }
2201
 
 
2202
 
  if (vm.count("read-buffer-threshold"))
2203
 
  {
2204
 
    if ((vm["read-buffer-threshold"].as<uint64_t>() > 0) and
2205
 
      (vm["read-buffer-threshold"].as<uint64_t>() <
2206
 
      global_system_variables.read_buff_size))
2207
 
    {
2208
 
      cout << _("Error: read-buffer-threshold cannot be less than read-buffer-size") << endl;
2209
 
      exit(-1);
2210
 
    }
2211
 
 
2212
 
    global_read_buffer.setMaxSize(vm["read-buffer-threshold"].as<uint64_t>());
2213
 
  }
2214
 
 
2215
2259
  if (vm.count("exit-info"))
2216
2260
  {
2217
2261
    if (vm["exit-info"].as<long>())
2218
2262
    {
2219
 
      getDebug().set((uint32_t) vm["exit-info"].as<long>());
 
2263
      test_flags.set((uint32_t) vm["exit-info"].as<long>());
2220
2264
    }
2221
2265
  }
2222
2266
 
2223
2267
  if (vm.count("want-core"))
2224
2268
  {
2225
 
    getDebug().set(debug::CORE_ON_SIGNAL);
 
2269
    test_flags.set(TEST_CORE_ON_SIGNAL);
2226
2270
  }
2227
2271
 
2228
2272
  if (vm.count("skip-stack-trace"))
2229
2273
  {
2230
 
    getDebug().set(debug::NO_STACKTRACE);
 
2274
    test_flags.set(TEST_NO_STACKTRACE);
2231
2275
  }
2232
2276
 
2233
2277
  if (vm.count("skip-symlinks"))
2237
2281
 
2238
2282
  if (vm.count("transaction-isolation"))
2239
2283
  {
2240
 
    int type= tx_isolation_typelib.find_type_or_exit(vm["transaction-isolation"].as<string>().c_str(), "transaction-isolation");
2241
 
    global_system_variables.tx_isolation= type - 1;
 
2284
    int type;
 
2285
    type= find_type_or_exit((char *)vm["transaction-isolation"].as<string>().c_str(), &tx_isolation_typelib, "transaction-isolation");
 
2286
    global_system_variables.tx_isolation= (type-1);
2242
2287
  }
2243
2288
 
2244
2289
  /* @TODO Make this all strings */
2265
2310
  if (opt_debugging)
2266
2311
  {
2267
2312
    /* Allow break with SIGINT, no core or stack trace */
2268
 
    getDebug().set(debug::ALLOW_SIGINT);
2269
 
    getDebug().set(debug::NO_STACKTRACE);
2270
 
    getDebug().reset(debug::CORE_ON_SIGNAL);
 
2313
    test_flags.set(TEST_SIGINT);
 
2314
    test_flags.set(TEST_NO_STACKTRACE);
 
2315
    test_flags.reset(TEST_CORE_ON_SIGNAL);
2271
2316
  }
2272
2317
 
2273
2318
  if (drizzled_chroot)
2289
2334
    pid_file_path= getDataHome();
2290
2335
    pid_file_path /= pid_file;
2291
2336
  }
2292
 
  pid_file= fs::system_complete(pid_file_path);
 
2337
  pid_file= pid_file_path;
2293
2338
 
2294
2339
  if (not opt_help)
2295
2340
  {
2319
2364
    {
2320
2365
      if (errno != EEXIST)
2321
2366
      {
2322
 
        errmsg_printf(error::ERROR, _("There was an error creating the '%s' part of the path '%s'.  Please check the path exists and is writable.\n"), fs::path(drizzle_tmpdir).leaf().c_str(), drizzle_tmpdir.c_str());
 
2367
        perror(drizzle_tmpdir.c_str());
2323
2368
        exit(1);
2324
2369
      }
2325
2370
    }
2326
2371
 
2327
2372
    if (stat(drizzle_tmpdir.c_str(), &buf) || (S_ISDIR(buf.st_mode) == false))
2328
2373
    {
2329
 
      errmsg_printf(error::ERROR, _("There was an error opening the path '%s', please check the path exists and is writable.\n"), drizzle_tmpdir.c_str());
 
2374
      perror(drizzle_tmpdir.c_str());
2330
2375
      exit(1);
2331
2376
    }
2332
2377
  }