45
45
#include <boost/filesystem.hpp>
47
#include "drizzled/plugin.h"
48
#include "drizzled/gettext.h"
49
#include "drizzled/configmake.h"
50
#include "drizzled/session.h"
51
#include "drizzled/internal/my_sys.h"
52
#include "drizzled/unireg.h"
53
#include "drizzled/drizzled.h"
54
#include "drizzled/errmsg_print.h"
55
#include "drizzled/data_home.h"
56
#include "drizzled/plugin/listen.h"
57
#include "drizzled/plugin/client.h"
58
#include "drizzled/pthread_globals.h"
59
#include "drizzled/tztime.h"
60
#include "drizzled/signal_handler.h"
61
#include "drizzled/replication_services.h"
62
#include "drizzled/transaction_services.h"
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>
64
72
using namespace drizzled;
65
73
using namespace std;
66
namespace fs=boost::filesystem;
68
75
static pthread_t select_thread;
69
76
static uint32_t thr_kill_signal;
78
extern bool opt_daemon;
73
82
All global error messages are sent here where the first one is stored
76
static void my_message_sql(uint32_t error, const char *str, myf MyFlags)
85
static void my_message_sql(drizzled::error_t error, const char *str, myf MyFlags)
86
95
session->is_fatal_error= 1;
89
TODO: There are two exceptions mechanism (Session and sp_rcontext),
98
@TODO There are two exceptions mechanism (Session and sp_rcontext),
90
99
this could be improved by having a common stack of handlers.
92
if (session->handle_error(error, str,
93
DRIZZLE_ERROR::WARN_LEVEL_ERROR))
101
if (session->handle_error(error, str, DRIZZLE_ERROR::WARN_LEVEL_ERROR))
97
session->lex->current_select == 0 if lex structure is not inited
105
session->getLex()->current_select == 0 if lex structure is not inited
98
106
(not query command (COM_QUERY))
100
if (! (session->lex->current_select &&
101
session->lex->current_select->no_error && !session->is_fatal_error))
108
if (! (session->getLex()->current_select &&
109
session->getLex()->current_select->no_error && !session->is_fatal_error))
103
111
if (! session->main_da.is_error()) // Return only first message
106
114
error= ER_UNKNOWN_ERROR;
109
119
session->main_da.set_error_status(error, str);
119
129
session->no_warnings_for_error= true;
120
130
push_warning(session, DRIZZLE_ERROR::WARN_LEVEL_ERROR, error, str);
121
131
session->no_warnings_for_error= false;
124
if (!session || MyFlags & ME_NOREFRESH)
125
errmsg_printf(ERRMSG_LVL_ERROR, "%s: %s",internal::my_progname,str);
135
if (not session || MyFlags & ME_NOREFRESH)
137
errmsg_printf(error::ERROR, "%s: %s",internal::my_progname,str);
128
141
static void init_signals(void)
147
160
sigaction(SIGFPE, &sa, NULL);
150
if (test_flags.test(TEST_CORE_ON_SIGNAL))
163
if (getDebug().test(debug::CORE_ON_SIGNAL))
152
165
/* Change limits so that we will get a core file */
153
166
struct rlimit rl;
154
167
rl.rlim_cur = rl.rlim_max = RLIM_INFINITY;
155
168
if (setrlimit(RLIMIT_CORE, &rl) && global_system_variables.log_warnings)
156
errmsg_printf(ERRMSG_LVL_WARN,
169
errmsg_printf(error::WARN,
157
170
_("setrlimit could not change the size of core files "
158
171
"to 'infinity'; We may not be able to generate a "
159
172
"core file on signals"));
199
static void GoogleProtoErrorThrower(google::protobuf::LogLevel level, const char* filename,
200
int line, const string& message) throw(const char *)
212
static void GoogleProtoErrorThrower(google::protobuf::LogLevel level,
214
int, const string& ) throw(const char *)
207
218
case google::protobuf::LOGLEVEL_INFO:
221
231
# if defined(HAVE_LOCALE_H)
222
232
setlocale(LC_ALL, "");
224
bindtextdomain("drizzle", LOCALEDIR);
225
textdomain("drizzle");
234
bindtextdomain("drizzle7", LOCALEDIR);
235
textdomain("drizzle7");
228
238
module::Registry &modules= module::Registry::singleton();
229
plugin::Client *client;
232
240
MY_INIT(argv[0]); // init my_sys library & pthreads
233
241
/* nothing should come before this line ^^^ */
240
248
/* Function generates error messages before abort */
241
249
error_handler_hook= my_message_sql;
242
251
/* init_common_variables must get basic settings such as data_home_dir
243
252
and plugin_load_list. */
244
if (init_common_variables(argc, argv, modules))
253
if (init_basic_variables(argc, argv))
254
unireg_abort(1); // Will do exit
258
if (signal(SIGHUP, SIG_IGN) == SIG_ERR)
260
perror("Failed to ignore SIGHUP");
264
fprintf(stderr, "failed to daemon() in order to daemonize\n");
269
if (init_remaining_variables(modules))
245
270
unireg_abort(1); // Will do exit
270
295
if (chdir("local"))
272
errmsg_printf(ERRMSG_LVL_ERROR,
297
errmsg_printf(error::ERROR,
273
298
_("Local catalog %s/local does not exist\n"),
274
299
getDataHome().file_string().c_str());
278
full_data_home= fs::system_complete(getDataHome());
279
getDataHomeCatalog()= "./";
280
getDataHome()= "../";
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());
290
if (init_server_components(modules))
317
if (init_server_components(modules))
320
catch (abort_exception& ex)
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;
294
333
* This check must be done after init_server_components for now
319
356
(void) unlink(pid_file.file_string().c_str()); // Not needed anymore
324
errmsg_printf(ERRMSG_LVL_INFO, _(ER(ER_STARTUP)), internal::my_progname,
361
errmsg_printf(error::INFO, _(ER(ER_STARTUP)), internal::my_progname,
325
362
PANDORA_RELEASE_VERSION, COMPILATION_COMMENT);
328
365
TransactionServices &transaction_services= TransactionServices::singleton();
330
367
/* Send server startup event */
331
if ((session= new Session(plugin::Listen::getNullClient())))
333
transaction_services.sendStartupEvent(session);
334
session->lockForDelete();
369
Session::shared_ptr session;
371
if ((session= Session::make_shared(plugin::Listen::getNullClient(), catalog::local())))
373
currentSession().release();
374
currentSession().reset(session.get());
377
transaction_services.sendStartupEvent(*session);
379
plugin_startup_window(modules, *(session.get()));
339
/* Listen for new connections and start new session for each connection
387
Listen for new connections and start new session for each connection
340
388
accepted. The listen.getClient() method will return NULL when the server
341
should be shutdown. */
391
plugin::Client *client;
342
392
while ((client= plugin::Listen::getClient()) != NULL)
344
if (!(session= new Session(client)))
394
Session::shared_ptr session;
395
session= Session::make_shared(client, client->catalog());
350
403
/* If we error on creation we drop the connection and delete the session. */
351
if (session->schedule())
404
if (Session::schedule(session))
352
405
Session::unlink(session);
355
408
/* Send server shutdown event */
356
if ((session= new Session(plugin::Listen::getNullClient())))
358
transaction_services.sendShutdownEvent(session);
359
session->lockForDelete();
363
LOCK_thread_count.lock();
364
select_thread_in_use=0; // For close_connections
365
LOCK_thread_count.unlock();
410
Session::shared_ptr session;
412
if ((session= Session::make_shared(plugin::Listen::getNullClient(), catalog::local())))
414
currentSession().release();
415
currentSession().reset(session.get());
416
transaction_services.sendShutdownEvent(*session.get());
421
boost::mutex::scoped_lock scopedLock(session::Cache::singleton().mutex());
422
select_thread_in_use= false; // For close_connections
366
424
COND_thread_count.notify_all();
368
426
/* Wait until cleanup is done */
370
boost::mutex::scoped_lock scopedLock(LOCK_thread_count);
371
while (!ready_to_exit)
372
COND_server_end.wait(scopedLock);
427
session::Cache::singleton().shutdownSecond();
376
430
module::Registry::shutdown();