00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include <config.h>
00022 #include <plugin/slave/sql_executor.h>
00023 #include <drizzled/plugin/listen.h>
00024 #include <drizzled/plugin/client.h>
00025 #include <drizzled/catalog/local.h>
00026 #include <drizzled/execute.h>
00027 #include <drizzled/sql/result_set.h>
00028 #include <drizzled/errmsg_print.h>
00029 #include <drizzled/plugin.h>
00030
00031 using namespace std;
00032 using namespace drizzled;
00033
00034 namespace slave
00035 {
00036
00037 SQLExecutor::SQLExecutor(const string &user, const string &schema)
00038 : _in_error_state(false)
00039 {
00040
00041 _session= Session::make_shared(plugin::Listen::getNullClient(), catalog::local());
00042 identifier::user::mptr user_id= identifier::User::make_shared();
00043 user_id->setUser(user);
00044 _session->setUser(user_id);
00045 _session->set_schema(schema);
00046 }
00047
00048
00049 bool SQLExecutor::executeSQL(vector<string> &sql)
00050 {
00051 if (not _in_error_state)
00052 _error_message.clear();
00053
00054 Execute execute(*(_session.get()), true);
00055
00056 string combined_sql;
00057 BOOST_FOREACH(string& it, sql)
00058 {
00059 combined_sql.append(it);
00060 combined_sql.append("; ");
00061 }
00062
00063 sql::ResultSet result_set(1);
00064
00065
00066 execute.run(combined_sql, result_set);
00067
00068 sql::Exception exception= result_set.getException();
00069
00070 drizzled::error_t err= exception.getErrorCode();
00071
00072 if ((err != drizzled::EE_OK) && (err != drizzled::ER_EMPTY_QUERY))
00073 {
00074
00075 if (_in_error_state)
00076 return true;
00077
00078 _in_error_state= true;
00079 _error_message= "(SQLSTATE ";
00080 _error_message.append(exception.getSQLState());
00081 _error_message.append(") ");
00082 _error_message.append(exception.getErrorMessage());
00083
00084 string bad_sql("Failure while executing:\n");
00085 for (size_t y= 0; y < sql.size(); y++)
00086 {
00087 bad_sql.append(sql[y]);
00088 bad_sql.append("\n");
00089 }
00090
00091 errmsg_printf(error::ERROR, _("%s\n%s\n"), _error_message.c_str(), bad_sql.c_str());
00092 return false;
00093 }
00094
00095 return true;
00096 }
00097
00098 }