12
12
You should have received a copy of the GNU General Public License
13
13
along with this program; if not, write to the Free Software
14
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */
14
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
16
16
/**********************************************************************
17
17
This file contains the implementation of error and warnings related
29
29
(If we would reset after each command, we could not retrieve the number
32
- When client requests the information using SHOW command, then
33
server processes from this list and returns back in the form of
32
- When client requests the information using SHOW command, then
33
server processes from this list and returns back in the form of
36
36
Supported syntaxes:
42
42
***********************************************************************/
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>
44
#include <drizzled/server_includes.h>
61
47
Store a new message in an error object
80
66
Don't reset warnings if this has already been called for this query.
81
67
This may happen if one gets a warning during the parsing stage,
82
68
in which case push_warnings() has already called this function.
85
71
void drizzle_reset_errors(Session *session, bool force)
87
if (session->getQueryId() != session->getWarningQueryId() || force)
73
if (session->query_id != session->warn_id || force)
89
session->setWarningQueryId(session->getQueryId());
90
session->warn_root.free_root(MYF(0));
75
session->warn_id= session->query_id;
76
free_root(&session->warn_root,MYF(0));
91
77
memset(session->warn_count, 0, sizeof(session->warn_count));
93
79
session->total_warn_count= 0;
94
session->warn_list.clear();
80
session->warn_list.empty();
95
81
session->row_count= 1; // by default point to row 1
102
88
Push the warning/error to error list if there is still room in the list
107
93
level Severity of warning (note, warning, error ...)
109
95
msg Clear error message
112
98
pointer on DRIZZLE_ERROR object
115
DRIZZLE_ERROR *push_warning(Session *session, DRIZZLE_ERROR::enum_warning_level level,
116
drizzled::error_t code, const char *msg)
101
DRIZZLE_ERROR *push_warning(Session *session, DRIZZLE_ERROR::enum_warning_level level,
102
uint32_t code, const char *msg)
118
104
DRIZZLE_ERROR *err= 0;
120
if (level == DRIZZLE_ERROR::WARN_LEVEL_NOTE && !(session->options & OPTION_SQL_NOTES))
106
if (level == DRIZZLE_ERROR::WARN_LEVEL_NOTE &&
107
!(session->options & OPTION_SQL_NOTES))
125
if (session->getQueryId() != session->getWarningQueryId())
110
if (session->query_id != session->warn_id)
126
111
drizzle_reset_errors(session, 0);
127
112
session->got_warning= 1;
129
114
/* Abort if we are using strict mode and we are not using IGNORE */
130
115
if ((int) level >= (int) DRIZZLE_ERROR::WARN_LEVEL_WARN &&
131
session->abortOnWarning())
116
session->really_abort_on_warning())
133
118
/* Avoid my_message() calling push_warning */
134
119
bool no_warnings_for_error= session->no_warnings_for_error;
136
121
session->no_warnings_for_error= 1;
138
session->setKilled(Session::KILL_BAD_DATA);
123
session->killed= Session::KILL_BAD_DATA;
139
124
my_message(code, msg, MYF(0));
141
126
session->no_warnings_for_error= no_warnings_for_error;
146
131
if (session->handle_error(code, msg, level))
149
134
if (session->warn_list.elements < session->variables.max_error_count)
151
136
/* We have to use warn_root, as mem_root is freed after each query */
152
137
if ((err= new (&session->warn_root) DRIZZLE_ERROR(session, code, level, msg)))
154
138
session->warn_list.push_back(err, &session->warn_root);
157
session->warn_count[(uint32_t) level]++;
140
session->warn_count[(uint) level]++;
158
141
session->total_warn_count++;
174
156
void push_warning_printf(Session *session, DRIZZLE_ERROR::enum_warning_level level,
175
drizzled::error_t code, const char *format, ...)
157
uint32_t code, const char *format, ...)
178
160
char warning[ERRMSGSIZE+20];
180
162
va_start(args,format);
181
163
vsnprintf(warning, sizeof(warning), format, args);
183
165
push_warning(session, level, code, warning);
208
191
{ C_STRING_WITH_LEN("?") }
211
bool show_warnings(Session *session,
212
bitset<DRIZZLE_ERROR::NUM_ERRORS> &levels_to_show)
194
bool mysqld_show_warnings(Session *session, uint32_t levels_to_show)
214
196
List<Item> field_list;
216
198
field_list.push_back(new Item_empty_string("Level", 7));
217
199
field_list.push_back(new Item_return_int("Code",4, DRIZZLE_TYPE_LONG));
218
200
field_list.push_back(new Item_empty_string("Message",DRIZZLE_ERRMSG_SIZE));
220
if (session->getClient()->sendFields(&field_list))
202
if (session->protocol->send_fields(&field_list,
203
Protocol::SEND_NUM_ROWS | Protocol::SEND_EOF))
223
206
DRIZZLE_ERROR *err;
224
Select_Lex *sel= &session->getLex()->select_lex;
225
Select_Lex_Unit *unit= &session->getLex()->unit;
207
SELECT_LEX *sel= &session->lex->select_lex;
208
SELECT_LEX_UNIT *unit= &session->lex->unit;
210
Protocol *protocol=session->protocol;
228
212
unit->set_limit(sel);
230
List<DRIZZLE_ERROR>::iterator it(session->warn_list.begin());
214
List_iterator_fast<DRIZZLE_ERROR> it(session->warn_list);
231
215
while ((err= it++))
233
217
/* Skip levels that the user is not interested in */
234
if (! levels_to_show.test(err->level))
218
if (!(levels_to_show & ((ulong) 1 << err->level)))
236
220
if (++idx <= unit->offset_limit_cnt)
238
222
if (idx > unit->select_limit_cnt)
240
session->getClient()->store(warning_level_names[err->level].str,
241
warning_level_names[err->level].length);
242
session->getClient()->store((uint32_t) err->code);
243
session->getClient()->store(err->msg, strlen(err->msg));
244
if (session->getClient()->flush())
224
protocol->prepare_for_resend();
225
protocol->store(warning_level_names[err->level].str,
226
warning_level_names[err->level].length, system_charset_info);
227
protocol->store((uint32_t) err->code);
228
protocol->store(err->msg, strlen(err->msg), system_charset_info);
229
if (protocol->write())
251
} /* namespace drizzled */