~drizzle-trunk/drizzle/development

« back to all changes in this revision

Viewing changes to drizzled/main.cc

  • Committer: Brian Aker
  • Date: 2011-01-12 06:45:23 UTC
  • mto: (2073.1.4 catalogs)
  • mto: This revision was merged to the branch mainline in revision 2080.
  • Revision ID: brian@tangent.org-20110112064523-rqhptaqbph22qmj1
Remove custom error.

Show diffs side-by-side

added added

removed removed

Lines of Context:
17
17
 *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
18
18
 */
19
19
 
20
 
#include <config.h>
 
20
#include "config.h"
21
21
 
22
22
#include <pthread.h>
23
23
#include <signal.h>
44
44
 
45
45
#include <boost/filesystem.hpp>
46
46
 
47
 
#include <drizzled/abort_exception.h>
48
 
#include <drizzled/catalog/local.h>
49
 
#include <drizzled/configmake.h>
50
 
#include <drizzled/data_home.h>
51
 
#include <drizzled/debug.h>
52
 
#include <drizzled/drizzled.h>
53
 
#include <drizzled/errmsg_print.h>
54
 
#include <drizzled/gettext.h>
55
 
#include <drizzled/internal/my_sys.h>
56
 
#include <drizzled/plugin.h>
57
 
#include <drizzled/plugin/client.h>
58
 
#include <drizzled/plugin/listen.h>
59
 
#include <drizzled/plugin/monitored_in_transaction.h>
60
 
#include <drizzled/pthread_globals.h>
61
 
#include <drizzled/replication_services.h>
62
 
#include <drizzled/session.h>
63
 
#include <drizzled/session/cache.h>
64
 
#include <drizzled/signal_handler.h>
65
 
#include <drizzled/transaction_services.h>
66
 
#include <drizzled/tztime.h>
67
 
#include <drizzled/unireg.h>
68
 
#include <drizzled/util/backtrace.h>
69
 
#include <drizzled/current_session.h>
70
 
#include <drizzled/daemon.h>
 
47
#include "drizzled/plugin.h"
 
48
#include "drizzled/gettext.h"
 
49
#include "drizzled/configmake.h"
 
50
#include "drizzled/session.h"
 
51
#include "drizzled/session/cache.h"
 
52
#include "drizzled/internal/my_sys.h"
 
53
#include "drizzled/unireg.h"
 
54
#include "drizzled/drizzled.h"
 
55
#include "drizzled/errmsg_print.h"
 
56
#include "drizzled/data_home.h"
 
57
#include "drizzled/plugin/listen.h"
 
58
#include "drizzled/plugin/client.h"
 
59
#include "drizzled/pthread_globals.h"
 
60
#include "drizzled/tztime.h"
 
61
#include "drizzled/signal_handler.h"
 
62
#include "drizzled/replication_services.h"
 
63
#include "drizzled/transaction_services.h"
 
64
#include "drizzled/catalog/local.h"
 
65
 
 
66
#include "drizzled/util/backtrace.h"
71
67
 
72
68
using namespace drizzled;
73
69
using namespace std;
 
70
namespace fs=boost::filesystem;
74
71
 
75
72
static pthread_t select_thread;
76
73
static uint32_t thr_kill_signal;
77
74
 
78
 
extern bool opt_daemon;
79
 
 
80
75
 
81
76
/**
82
77
  All global error messages are sent here where the first one is stored
83
78
  for the client.
84
79
*/
85
 
static void my_message_sql(drizzled::error_t error, const char *str, myf MyFlags)
 
80
static void my_message_sql(uint32_t error, const char *str, myf MyFlags)
86
81
{
87
82
  Session *session;
88
83
  /*
95
90
      session->is_fatal_error= 1;
96
91
 
97
92
    /*
98
 
      @TODO There are two exceptions mechanism (Session and sp_rcontext),
 
93
      TODO: There are two exceptions mechanism (Session and sp_rcontext),
99
94
      this could be improved by having a common stack of handlers.
100
95
    */
101
 
    if (session->handle_error(error, str, DRIZZLE_ERROR::WARN_LEVEL_ERROR))
102
 
      return;
 
96
    if (session->handle_error(error, str,
 
97
                          DRIZZLE_ERROR::WARN_LEVEL_ERROR))
 
98
      return;;
103
99
 
104
100
    /*
105
 
      session->getLex()->current_select == 0 if lex structure is not inited
 
101
      session->lex->current_select == 0 if lex structure is not inited
106
102
      (not query command (COM_QUERY))
107
103
    */
108
 
    if (! (session->getLex()->current_select &&
109
 
           session->getLex()->current_select->no_error && !session->is_fatal_error))
 
104
    if (! (session->lex->current_select &&
 
105
        session->lex->current_select->no_error && !session->is_fatal_error))
110
106
    {
111
107
      if (! session->main_da.is_error())            // Return only first message
112
108
      {
113
 
        if (error == EE_OK)
 
109
        if (error == 0)
114
110
          error= ER_UNKNOWN_ERROR;
115
 
 
116
111
        if (str == NULL)
117
112
          str= ER(error);
118
 
 
119
113
        session->main_da.set_error_status(error, str);
120
114
      }
121
115
    }
129
123
      session->no_warnings_for_error= true;
130
124
      push_warning(session, DRIZZLE_ERROR::WARN_LEVEL_ERROR, error, str);
131
125
      session->no_warnings_for_error= false;
 
126
      }
132
127
    }
133
 
  }
134
 
 
135
 
  if (not session || MyFlags & ME_NOREFRESH)
136
 
  {
137
 
    errmsg_printf(error::ERROR, "%s: %s",internal::my_progname,str);
138
 
  }
 
128
    if (!session || MyFlags & ME_NOREFRESH)
 
129
        errmsg_printf(ERRMSG_LVL_ERROR, "%s: %s",internal::my_progname,str);
139
130
}
140
131
 
141
132
static void init_signals(void)
143
134
  sigset_t set;
144
135
  struct sigaction sa;
145
136
 
146
 
  if (not (getDebug().test(debug::NO_STACKTRACE) || 
147
 
        getDebug().test(debug::CORE_ON_SIGNAL)))
 
137
  if (!(test_flags.test(TEST_NO_STACKTRACE) || 
 
138
        test_flags.test(TEST_CORE_ON_SIGNAL)))
148
139
  {
149
140
    sa.sa_flags = SA_RESETHAND | SA_NODEFER;
150
141
    sigemptyset(&sa.sa_mask);
160
151
    sigaction(SIGFPE, &sa, NULL);
161
152
  }
162
153
 
163
 
  if (getDebug().test(debug::CORE_ON_SIGNAL))
 
154
  if (test_flags.test(TEST_CORE_ON_SIGNAL))
164
155
  {
165
156
    /* Change limits so that we will get a core file */
166
157
    struct rlimit rl;
167
158
    rl.rlim_cur = rl.rlim_max = RLIM_INFINITY;
168
159
    if (setrlimit(RLIMIT_CORE, &rl) && global_system_variables.log_warnings)
169
 
        errmsg_printf(error::WARN,
 
160
        errmsg_printf(ERRMSG_LVL_WARN,
170
161
                      _("setrlimit could not change the size of core files "
171
162
                        "to 'infinity';  We may not be able to generate a "
172
163
                        "core file on signals"));
191
182
#ifdef SIGTSTP
192
183
  sigaddset(&set,SIGTSTP);
193
184
#endif
194
 
  if (getDebug().test(debug::ALLOW_SIGINT))
 
185
  if (test_flags.test(TEST_SIGINT))
195
186
  {
196
187
    sa.sa_flags= 0;
197
188
    sa.sa_handler= drizzled_end_thread_signal;
247
238
 
248
239
  /* Function generates error messages before abort */
249
240
  error_handler_hook= my_message_sql;
250
 
 
251
241
  /* init_common_variables must get basic settings such as data_home_dir
252
242
     and plugin_load_list. */
253
 
  if (init_basic_variables(argc, argv))
254
 
    unireg_abort(1);                            // Will do exit
255
 
 
256
 
  if (opt_daemon)
257
 
  {
258
 
    if (signal(SIGHUP, SIG_IGN) == SIG_ERR)
259
 
    {
260
 
      perror("Failed to ignore SIGHUP");
261
 
    }
262
 
    if (daemonize())
263
 
    {
264
 
      fprintf(stderr, "failed to daemon() in order to daemonize\n");
265
 
      exit(EXIT_FAILURE);
266
 
    }
267
 
  }
268
 
 
269
 
  if (init_remaining_variables(modules))
 
243
  if (init_common_variables(argc, argv, modules))
270
244
    unireg_abort(1);                            // Will do exit
271
245
 
272
246
  /*
283
257
  {
284
258
    if (chdir(getDataHome().file_string().c_str()))
285
259
    {
286
 
      errmsg_printf(error::ERROR,
 
260
      errmsg_printf(ERRMSG_LVL_ERROR,
287
261
                    _("Data directory %s does not exist\n"),
288
262
                    getDataHome().file_string().c_str());
289
263
      unireg_abort(1);
294
268
    }
295
269
    if (chdir("local"))
296
270
    {
297
 
      errmsg_printf(error::ERROR,
 
271
      errmsg_printf(ERRMSG_LVL_ERROR,
298
272
                    _("Local catalog %s/local does not exist\n"),
299
273
                    getDataHome().file_string().c_str());
300
274
      unireg_abort(1);
301
275
    }
302
276
 
303
 
    boost::filesystem::path &full_data_home= getFullDataHome();
304
 
    full_data_home= boost::filesystem::system_complete(getDataHome());
305
 
    errmsg_printf(error::INFO, "Data Home directory is : %s", full_data_home.native_file_string().c_str());
 
277
    full_data_home= fs::system_complete(getDataHome());
 
278
    getDataHomeCatalog()= "./";
 
279
    getDataHome()= "../";
306
280
  }
307
281
 
308
282
 
312
286
    server_id= 1;
313
287
  }
314
288
 
315
 
  try
316
 
  {
317
 
    if (init_server_components(modules))
318
 
      DRIZZLE_ABORT;
319
 
  }
320
 
  catch (abort_exception& ex)
321
 
  {
322
 
#if defined(DEBUG)
323
 
    cout << _("Drizzle has receieved an abort event.") << endl;
324
 
    cout << _("In Function: ") << *::boost::get_error_info<boost::throw_function>(ex) << endl;
325
 
    cout << _("In File: ") << *::boost::get_error_info<boost::throw_file>(ex) << endl;
326
 
    cout << _("On Line: ") << *::boost::get_error_info<boost::throw_line>(ex) << endl;
327
 
#endif
 
289
  if (init_server_components(modules))
328
290
    unireg_abort(1);
329
 
  }
330
 
 
331
291
 
332
292
  /**
333
293
   * This check must be done after init_server_components for now
346
306
  if (plugin::Listen::setup())
347
307
    unireg_abort(1);
348
308
 
 
309
 
349
310
  assert(plugin::num_trx_monitored_objects > 0);
350
 
  if (drizzle_rm_tmp_tables())
 
311
  if (drizzle_rm_tmp_tables() ||
 
312
      my_tz_init((Session *)0, default_tz_name))
351
313
  {
352
314
    abort_loop= true;
353
315
    select_thread_in_use=0;
355
317
 
356
318
    (void) unlink(pid_file.file_string().c_str());      // Not needed anymore
357
319
 
358
 
    unireg_abort(1);
 
320
    exit(1);
359
321
  }
360
322
 
361
 
  errmsg_printf(error::INFO, _(ER(ER_STARTUP)), internal::my_progname,
 
323
  errmsg_printf(ERRMSG_LVL_INFO, _(ER(ER_STARTUP)), internal::my_progname,
362
324
                PANDORA_RELEASE_VERSION, COMPILATION_COMMENT);
363
325
 
364
326
 
372
334
    {
373
335
      currentSession().release();
374
336
      currentSession().reset(session.get());
375
 
 
376
 
 
377
 
      transaction_services.sendStartupEvent(*session);
378
 
 
379
 
      plugin_startup_window(modules, *(session.get()));
 
337
      transaction_services.sendStartupEvent(session.get());
380
338
    }
381
339
  }
382
340
 
383
 
  if (opt_daemon)
384
 
    daemon_is_ready();
385
341
 
386
342
  /* 
387
343
    Listen for new connections and start new session for each connection
392
348
  while ((client= plugin::Listen::getClient()) != NULL)
393
349
  {
394
350
    Session::shared_ptr session;
395
 
    session= Session::make_shared(client, client->catalog());
 
351
    session= Session::make_shared(client, catalog::local());
396
352
 
397
353
    if (not session)
398
354
    {
413
369
    {
414
370
      currentSession().release();
415
371
      currentSession().reset(session.get());
416
 
      transaction_services.sendShutdownEvent(*session.get());
 
372
      transaction_services.sendShutdownEvent(session.get());
417
373
    }
418
374
  }
419
375
 
424
380
  COND_thread_count.notify_all();
425
381
 
426
382
  /* Wait until cleanup is done */
427
 
  session::Cache::singleton().shutdownSecond();
 
383
  {
 
384
    boost::mutex::scoped_lock scopedLock(session::Cache::singleton().mutex());
 
385
    while (not ready_to_exit)
 
386
      COND_server_end.wait(scopedLock);
 
387
  }
428
388
 
429
389
  clean_up(1);
430
390
  module::Registry::shutdown();