49 #include <drizzled/session.h>
50 #include <drizzled/sql_base.h>
51 #include <drizzled/item/empty_string.h>
52 #include <drizzled/item/return_int.h>
53 #include <drizzled/plugin/client.h>
54 #include <drizzled/sql_lex.h>
55 #include <drizzled/system_variables.h>
56 #include <drizzled/diagnostics_area.h>
68 void DRIZZLE_ERROR::set_msg(Session *session,
const char *msg_arg)
70 msg= session->warn_root.strdup(msg_arg);
87 void drizzle_reset_errors(Session& session,
bool force)
89 if (session.getQueryId() != session.getWarningQueryId() || force)
91 session.setWarningQueryId(session.getQueryId());
92 session.warn_root.free_root(MYF(0));
93 memset(session.warn_count, 0,
sizeof(session.warn_count));
95 session.total_warn_count= 0;
96 session.main_da().m_warn_list.clear();
116 DRIZZLE_ERROR *push_warning(Session *session, DRIZZLE_ERROR::enum_warning_level level,
117 drizzled::error_t code,
const char *msg)
119 if (level == DRIZZLE_ERROR::WARN_LEVEL_NOTE && !(session->options & OPTION_SQL_NOTES))
124 if (session->getQueryId() != session->getWarningQueryId())
125 drizzle_reset_errors(*session,
false);
126 session->got_warning= 1;
129 if ((
int) level >= (int) DRIZZLE_ERROR::WARN_LEVEL_WARN &&
130 session->abortOnWarning())
133 bool no_warnings_for_error= session->no_warnings_for_error;
135 session->no_warnings_for_error= 1;
137 session->setKilled(Session::KILL_BAD_DATA);
138 my_message(code, msg, MYF(0));
140 session->no_warnings_for_error= no_warnings_for_error;
142 level= DRIZZLE_ERROR::WARN_LEVEL_ERROR;
145 DRIZZLE_ERROR *err= NULL;
146 if (session->main_da().m_warn_list.size() < session->variables.max_error_count)
149 err=
new (session->warn_root) DRIZZLE_ERROR(session, code, level, msg);
150 session->main_da().m_warn_list.push_back(err);
152 session->warn_count[level]++;
153 session->total_warn_count++;
169 void push_warning_printf(Session *session, DRIZZLE_ERROR::enum_warning_level level,
170 drizzled::error_t code,
const char *format, ...)
173 char warning[ERRMSGSIZE+20];
175 va_start(args,format);
176 vsnprintf(warning,
sizeof(warning), format, args);
178 push_warning(session, level, code, warning);
198 const lex_string_t warning_level_names[]=
200 { C_STRING_WITH_LEN(
"Note") },
201 { C_STRING_WITH_LEN(
"Warning") },
202 { C_STRING_WITH_LEN(
"Error") },
203 { C_STRING_WITH_LEN(
"?") }
206 bool show_warnings(Session *session, bitset<DRIZZLE_ERROR::NUM_ERRORS> &levels_to_show)
208 List<Item> field_list;
210 field_list.push_back(
new Item_empty_string(
"Level", 7));
211 field_list.push_back(
new Item_return_int(
"Code",4, DRIZZLE_TYPE_LONG));
212 field_list.push_back(
new Item_empty_string(
"Message",DRIZZLE_ERRMSG_SIZE));
214 session->getClient()->sendFields(field_list);
216 Select_Lex *sel= &session->lex().select_lex;
217 Select_Lex_Unit *unit= &session->lex().unit;
220 unit->set_limit(sel);
222 BOOST_FOREACH(DRIZZLE_ERROR* err, session->main_da().m_warn_list)
225 if (! levels_to_show.test(err->level))
227 if (++idx <= unit->offset_limit_cnt)
229 if (idx > unit->select_limit_cnt)
231 session->getClient()->store(warning_level_names[err->level]);
232 session->getClient()->store((uint32_t) err->code);
233 session->getClient()->store(err->msg, strlen(err->msg));
234 if (session->getClient()->flush())