00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044 #include <config.h>
00045
00046 #include <cstdio>
00047 #include <stdarg.h>
00048
00049 #include <drizzled/session.h>
00050 #include <drizzled/sql_base.h>
00051 #include <drizzled/item/empty_string.h>
00052 #include <drizzled/item/return_int.h>
00053 #include <drizzled/plugin/client.h>
00054 #include <drizzled/sql_lex.h>
00055
00056 using namespace std;
00057
00058 namespace drizzled
00059 {
00060
00061
00062
00063
00064
00065
00066
00067 void DRIZZLE_ERROR::set_msg(Session *session, const char *msg_arg)
00068 {
00069 msg= session->warn_root.strdup_root(msg_arg);
00070 }
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086 void drizzle_reset_errors(Session *session, bool force)
00087 {
00088 if (session->getQueryId() != session->getWarningQueryId() || force)
00089 {
00090 session->setWarningQueryId(session->getQueryId());
00091 session->warn_root.free_root(MYF(0));
00092 memset(session->warn_count, 0, sizeof(session->warn_count));
00093 if (force)
00094 session->total_warn_count= 0;
00095 session->warn_list.clear();
00096 session->row_count= 1;
00097 }
00098 return;
00099 }
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116 DRIZZLE_ERROR *push_warning(Session *session, DRIZZLE_ERROR::enum_warning_level level,
00117 drizzled::error_t code, const char *msg)
00118 {
00119 DRIZZLE_ERROR *err= 0;
00120
00121 if (level == DRIZZLE_ERROR::WARN_LEVEL_NOTE && !(session->options & OPTION_SQL_NOTES))
00122 {
00123 return NULL;
00124 }
00125
00126 if (session->getQueryId() != session->getWarningQueryId())
00127 drizzle_reset_errors(session, 0);
00128 session->got_warning= 1;
00129
00130
00131 if ((int) level >= (int) DRIZZLE_ERROR::WARN_LEVEL_WARN &&
00132 session->abortOnWarning())
00133 {
00134
00135 bool no_warnings_for_error= session->no_warnings_for_error;
00136
00137 session->no_warnings_for_error= 1;
00138
00139 session->setKilled(Session::KILL_BAD_DATA);
00140 my_message(code, msg, MYF(0));
00141
00142 session->no_warnings_for_error= no_warnings_for_error;
00143
00144 level= DRIZZLE_ERROR::WARN_LEVEL_ERROR;
00145 }
00146
00147 if (session->handle_error(code, msg, level))
00148 return NULL;
00149
00150 if (session->warn_list.size() < session->variables.max_error_count)
00151 {
00152
00153 if ((err= new (&session->warn_root) DRIZZLE_ERROR(session, code, level, msg)))
00154 {
00155 session->warn_list.push_back(err, &session->warn_root);
00156 }
00157 }
00158 session->warn_count[(uint32_t) level]++;
00159 session->total_warn_count++;
00160
00161 return err;
00162 }
00163
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174
00175 void push_warning_printf(Session *session, DRIZZLE_ERROR::enum_warning_level level,
00176 drizzled::error_t code, const char *format, ...)
00177 {
00178 va_list args;
00179 char warning[ERRMSGSIZE+20];
00180
00181 va_start(args,format);
00182 vsnprintf(warning, sizeof(warning), format, args);
00183 va_end(args);
00184 push_warning(session, level, code, warning);
00185 }
00186
00187
00188
00189
00190
00191
00192
00193
00194
00195
00196
00197
00198
00199
00200
00201
00202
00203
00204 const LEX_STRING warning_level_names[]=
00205 {
00206 { C_STRING_WITH_LEN("Note") },
00207 { C_STRING_WITH_LEN("Warning") },
00208 { C_STRING_WITH_LEN("Error") },
00209 { C_STRING_WITH_LEN("?") }
00210 };
00211
00212 bool show_warnings(Session *session,
00213 bitset<DRIZZLE_ERROR::NUM_ERRORS> &levels_to_show)
00214 {
00215 List<Item> field_list;
00216
00217 field_list.push_back(new Item_empty_string("Level", 7));
00218 field_list.push_back(new Item_return_int("Code",4, DRIZZLE_TYPE_LONG));
00219 field_list.push_back(new Item_empty_string("Message",DRIZZLE_ERRMSG_SIZE));
00220
00221 if (session->getClient()->sendFields(&field_list))
00222 return true;
00223
00224 DRIZZLE_ERROR *err;
00225 Select_Lex *sel= &session->lex().select_lex;
00226 Select_Lex_Unit *unit= &session->lex().unit;
00227 ha_rows idx= 0;
00228
00229 unit->set_limit(sel);
00230
00231 List<DRIZZLE_ERROR>::iterator it(session->warn_list.begin());
00232 while ((err= it++))
00233 {
00234
00235 if (! levels_to_show.test(err->level))
00236 continue;
00237 if (++idx <= unit->offset_limit_cnt)
00238 continue;
00239 if (idx > unit->select_limit_cnt)
00240 break;
00241 session->getClient()->store(warning_level_names[err->level].str,
00242 warning_level_names[err->level].length);
00243 session->getClient()->store((uint32_t) err->code);
00244 session->getClient()->store(err->msg, strlen(err->msg));
00245 if (session->getClient()->flush())
00246 return(true);
00247 }
00248 session->my_eof();
00249 return(false);
00250 }
00251
00252 }