Simplistic, experimental framework for Stored Procedures (SPs).
Implements creation and dropping of PROCEDUREs, IN, OUT, and INOUT parameters,
single-statement procedures, rudimentary multi-statement (begin-end) prodedures
(when the client can handle it), and local variables.
Missing most of the embedded SQL language, all attributes, FUNCTIONs, error handling,
reparses procedures at each call (no caching), etc, etc.
Certainly buggy too, but procedures can actually be created and called....
2002-12-08 19:59:22 +01:00
|
|
|
/* -*- C++ -*- */
|
|
|
|
/* Copyright (C) 2002 MySQL AB
|
|
|
|
|
|
|
|
This program is free software; you can redistribute it and/or modify
|
|
|
|
it under the terms of the GNU General Public License as published by
|
|
|
|
the Free Software Foundation; either version 2 of the License, or
|
|
|
|
(at your option) any later version.
|
|
|
|
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
GNU General Public License for more details.
|
|
|
|
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
|
|
along with this program; if not, write to the Free Software
|
|
|
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
|
|
|
|
|
|
|
|
#ifndef _SP_RCONTEXT_H_
|
|
|
|
#define _SP_RCONTEXT_H_
|
|
|
|
|
2003-09-16 14:26:08 +02:00
|
|
|
#ifdef __GNUC__
|
|
|
|
#pragma interface /* gcc class implementation */
|
|
|
|
#endif
|
|
|
|
|
|
|
|
struct sp_cond_type;
|
2003-10-10 16:57:21 +02:00
|
|
|
struct sp_cursor;
|
|
|
|
struct sp_pvar;
|
2003-09-16 14:26:08 +02:00
|
|
|
|
|
|
|
#define SP_HANDLER_NONE 0
|
|
|
|
#define SP_HANDLER_EXIT 1
|
|
|
|
#define SP_HANDLER_CONTINUE 2
|
|
|
|
#define SP_HANDLER_UNDO 3
|
|
|
|
|
|
|
|
typedef struct
|
|
|
|
{
|
|
|
|
struct sp_cond_type *cond;
|
|
|
|
uint handler; // Location of handler
|
|
|
|
int type;
|
|
|
|
uint foffset; // Frame offset for the handlers declare level
|
|
|
|
} sp_handler_t;
|
|
|
|
|
Simplistic, experimental framework for Stored Procedures (SPs).
Implements creation and dropping of PROCEDUREs, IN, OUT, and INOUT parameters,
single-statement procedures, rudimentary multi-statement (begin-end) prodedures
(when the client can handle it), and local variables.
Missing most of the embedded SQL language, all attributes, FUNCTIONs, error handling,
reparses procedures at each call (no caching), etc, etc.
Certainly buggy too, but procedures can actually be created and called....
2002-12-08 19:59:22 +01:00
|
|
|
class sp_rcontext : public Sql_alloc
|
|
|
|
{
|
|
|
|
sp_rcontext(const sp_rcontext &); /* Prevent use of these */
|
|
|
|
void operator=(sp_rcontext &);
|
|
|
|
|
|
|
|
public:
|
|
|
|
|
2003-10-10 16:57:21 +02:00
|
|
|
sp_rcontext(uint fsize, uint hmax, uint cmax);
|
Simplistic, experimental framework for Stored Procedures (SPs).
Implements creation and dropping of PROCEDUREs, IN, OUT, and INOUT parameters,
single-statement procedures, rudimentary multi-statement (begin-end) prodedures
(when the client can handle it), and local variables.
Missing most of the embedded SQL language, all attributes, FUNCTIONs, error handling,
reparses procedures at each call (no caching), etc, etc.
Certainly buggy too, but procedures can actually be created and called....
2002-12-08 19:59:22 +01:00
|
|
|
|
|
|
|
~sp_rcontext()
|
|
|
|
{
|
|
|
|
// Not needed?
|
|
|
|
//sql_element_free(m_frame);
|
2003-09-16 14:26:08 +02:00
|
|
|
//m_saved.empty();
|
Simplistic, experimental framework for Stored Procedures (SPs).
Implements creation and dropping of PROCEDUREs, IN, OUT, and INOUT parameters,
single-statement procedures, rudimentary multi-statement (begin-end) prodedures
(when the client can handle it), and local variables.
Missing most of the embedded SQL language, all attributes, FUNCTIONs, error handling,
reparses procedures at each call (no caching), etc, etc.
Certainly buggy too, but procedures can actually be created and called....
2002-12-08 19:59:22 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
inline void
|
|
|
|
push_item(Item *i)
|
|
|
|
{
|
2003-09-16 14:26:08 +02:00
|
|
|
if (m_count < m_fsize)
|
Simplistic, experimental framework for Stored Procedures (SPs).
Implements creation and dropping of PROCEDUREs, IN, OUT, and INOUT parameters,
single-statement procedures, rudimentary multi-statement (begin-end) prodedures
(when the client can handle it), and local variables.
Missing most of the embedded SQL language, all attributes, FUNCTIONs, error handling,
reparses procedures at each call (no caching), etc, etc.
Certainly buggy too, but procedures can actually be created and called....
2002-12-08 19:59:22 +01:00
|
|
|
m_frame[m_count++] = i;
|
|
|
|
}
|
|
|
|
|
|
|
|
inline void
|
|
|
|
set_item(uint idx, Item *i)
|
|
|
|
{
|
|
|
|
if (idx < m_count)
|
|
|
|
m_frame[idx] = i;
|
|
|
|
}
|
|
|
|
|
2003-10-14 12:59:28 +02:00
|
|
|
void
|
|
|
|
set_item_eval(uint idx, Item *i, enum_field_types type);
|
|
|
|
|
Simplistic, experimental framework for Stored Procedures (SPs).
Implements creation and dropping of PROCEDUREs, IN, OUT, and INOUT parameters,
single-statement procedures, rudimentary multi-statement (begin-end) prodedures
(when the client can handle it), and local variables.
Missing most of the embedded SQL language, all attributes, FUNCTIONs, error handling,
reparses procedures at each call (no caching), etc, etc.
Certainly buggy too, but procedures can actually be created and called....
2002-12-08 19:59:22 +01:00
|
|
|
inline Item *
|
|
|
|
get_item(uint idx)
|
|
|
|
{
|
|
|
|
return m_frame[idx];
|
|
|
|
}
|
|
|
|
|
|
|
|
inline void
|
|
|
|
set_oindex(uint idx, int oidx)
|
|
|
|
{
|
|
|
|
m_outs[idx] = oidx;
|
|
|
|
}
|
|
|
|
|
|
|
|
inline int
|
|
|
|
get_oindex(uint idx)
|
|
|
|
{
|
|
|
|
return m_outs[idx];
|
|
|
|
}
|
|
|
|
|
2003-02-26 19:22:29 +01:00
|
|
|
inline void
|
|
|
|
set_result(Item *it)
|
|
|
|
{
|
|
|
|
m_result= it;
|
|
|
|
}
|
|
|
|
|
|
|
|
inline Item *
|
|
|
|
get_result()
|
|
|
|
{
|
|
|
|
return m_result;
|
|
|
|
}
|
|
|
|
|
2003-09-16 14:26:08 +02:00
|
|
|
inline void
|
|
|
|
push_handler(struct sp_cond_type *cond, uint h, int type, uint f)
|
|
|
|
{
|
|
|
|
m_handler[m_hcount].cond= cond;
|
|
|
|
m_handler[m_hcount].handler= h;
|
|
|
|
m_handler[m_hcount].type= type;
|
|
|
|
m_handler[m_hcount].foffset= f;
|
|
|
|
m_hcount+= 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
inline void
|
|
|
|
pop_handlers(uint count)
|
|
|
|
{
|
|
|
|
m_hcount-= count;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Returns 1 if a handler was found, 0 otherwise.
|
|
|
|
int
|
|
|
|
find_handler(uint sql_errno);
|
|
|
|
|
|
|
|
// Returns handler type and sets *ip to location if one was found
|
|
|
|
inline int
|
|
|
|
found_handler(uint *ip, uint *fp)
|
|
|
|
{
|
|
|
|
if (m_hfound < 0)
|
|
|
|
return SP_HANDLER_NONE;
|
|
|
|
*ip= m_handler[m_hfound].handler;
|
|
|
|
*fp= m_handler[m_hfound].foffset;
|
|
|
|
return m_handler[m_hfound].type;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Clears the handler find state
|
|
|
|
inline void
|
|
|
|
clear_handler()
|
|
|
|
{
|
|
|
|
m_hfound= -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
inline void
|
|
|
|
push_hstack(uint h)
|
|
|
|
{
|
|
|
|
m_hstack[m_hsp++]= h;
|
|
|
|
}
|
|
|
|
|
|
|
|
inline uint
|
|
|
|
pop_hstack()
|
|
|
|
{
|
|
|
|
return m_hstack[--m_hsp];
|
|
|
|
}
|
|
|
|
|
|
|
|
// Save variables starting at fp and up
|
|
|
|
void
|
|
|
|
save_variables(uint fp);
|
|
|
|
|
|
|
|
// Restore variables down to fp
|
|
|
|
void
|
|
|
|
restore_variables(uint fp);
|
|
|
|
|
2003-10-10 16:57:21 +02:00
|
|
|
void
|
|
|
|
push_cursor(LEX *lex);
|
|
|
|
|
|
|
|
void
|
|
|
|
pop_cursors(uint count);
|
|
|
|
|
|
|
|
void
|
|
|
|
pop_all_cursors()
|
|
|
|
{
|
|
|
|
pop_cursors(m_ccount);
|
|
|
|
}
|
|
|
|
|
|
|
|
inline sp_cursor *
|
|
|
|
get_cursor(uint i)
|
|
|
|
{
|
|
|
|
return m_cstack[i];
|
|
|
|
}
|
|
|
|
|
Simplistic, experimental framework for Stored Procedures (SPs).
Implements creation and dropping of PROCEDUREs, IN, OUT, and INOUT parameters,
single-statement procedures, rudimentary multi-statement (begin-end) prodedures
(when the client can handle it), and local variables.
Missing most of the embedded SQL language, all attributes, FUNCTIONs, error handling,
reparses procedures at each call (no caching), etc, etc.
Certainly buggy too, but procedures can actually be created and called....
2002-12-08 19:59:22 +01:00
|
|
|
private:
|
|
|
|
|
|
|
|
uint m_count;
|
2003-09-16 14:26:08 +02:00
|
|
|
uint m_fsize;
|
Simplistic, experimental framework for Stored Procedures (SPs).
Implements creation and dropping of PROCEDUREs, IN, OUT, and INOUT parameters,
single-statement procedures, rudimentary multi-statement (begin-end) prodedures
(when the client can handle it), and local variables.
Missing most of the embedded SQL language, all attributes, FUNCTIONs, error handling,
reparses procedures at each call (no caching), etc, etc.
Certainly buggy too, but procedures can actually be created and called....
2002-12-08 19:59:22 +01:00
|
|
|
Item **m_frame;
|
|
|
|
int *m_outs;
|
2003-10-10 16:57:21 +02:00
|
|
|
|
2003-02-26 19:22:29 +01:00
|
|
|
Item *m_result; // For FUNCTIONs
|
2003-10-10 16:57:21 +02:00
|
|
|
|
2003-09-16 14:26:08 +02:00
|
|
|
sp_handler_t *m_handler;
|
|
|
|
uint m_hcount;
|
|
|
|
uint *m_hstack;
|
|
|
|
uint m_hsp;
|
|
|
|
int m_hfound; // Set by find_handler; -1 if not found
|
|
|
|
List<Item> m_saved; // Saved variables
|
Simplistic, experimental framework for Stored Procedures (SPs).
Implements creation and dropping of PROCEDUREs, IN, OUT, and INOUT parameters,
single-statement procedures, rudimentary multi-statement (begin-end) prodedures
(when the client can handle it), and local variables.
Missing most of the embedded SQL language, all attributes, FUNCTIONs, error handling,
reparses procedures at each call (no caching), etc, etc.
Certainly buggy too, but procedures can actually be created and called....
2002-12-08 19:59:22 +01:00
|
|
|
|
2003-10-10 16:57:21 +02:00
|
|
|
sp_cursor **m_cstack;
|
|
|
|
uint m_ccount;
|
|
|
|
|
Simplistic, experimental framework for Stored Procedures (SPs).
Implements creation and dropping of PROCEDUREs, IN, OUT, and INOUT parameters,
single-statement procedures, rudimentary multi-statement (begin-end) prodedures
(when the client can handle it), and local variables.
Missing most of the embedded SQL language, all attributes, FUNCTIONs, error handling,
reparses procedures at each call (no caching), etc, etc.
Certainly buggy too, but procedures can actually be created and called....
2002-12-08 19:59:22 +01:00
|
|
|
}; // class sp_rcontext : public Sql_alloc
|
|
|
|
|
2003-10-10 16:57:21 +02:00
|
|
|
|
|
|
|
class sp_cursor : public Sql_alloc
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
|
|
|
|
sp_cursor(LEX *lex)
|
|
|
|
: m_lex(lex), m_isopen(0), m_current_row(NULL)
|
|
|
|
{
|
|
|
|
/* Empty */
|
|
|
|
}
|
|
|
|
|
|
|
|
virtual ~sp_cursor()
|
|
|
|
{
|
|
|
|
destroy();
|
|
|
|
}
|
|
|
|
|
|
|
|
// We have split this in two to make it easy for sp_instr_copen
|
|
|
|
// to reuse the sp_instr::exec_stmt() code.
|
|
|
|
LEX *
|
|
|
|
pre_open(THD *thd);
|
|
|
|
void
|
|
|
|
post_open(THD *thd, my_bool isopen);
|
|
|
|
|
|
|
|
int
|
|
|
|
close(THD *thd);
|
|
|
|
|
|
|
|
inline my_bool
|
|
|
|
is_open()
|
|
|
|
{
|
|
|
|
return m_isopen;
|
|
|
|
}
|
|
|
|
|
|
|
|
int
|
|
|
|
fetch(THD *, List<struct sp_pvar> *vars);
|
|
|
|
|
|
|
|
private:
|
|
|
|
|
|
|
|
MEM_ROOT m_mem_root; // My own mem_root
|
|
|
|
LEX *m_lex;
|
|
|
|
Protocol_cursor *m_prot;
|
|
|
|
my_bool m_isopen;
|
2003-11-27 16:48:21 +01:00
|
|
|
my_bool m_nseof; // Original no_send_eof
|
2003-10-10 16:57:21 +02:00
|
|
|
Protocol *m_oprot; // Original protcol
|
|
|
|
MYSQL_ROWS *m_current_row;
|
|
|
|
|
|
|
|
void
|
|
|
|
destroy();
|
|
|
|
|
|
|
|
}; // class sp_cursor : public Sql_alloc
|
|
|
|
|
Simplistic, experimental framework for Stored Procedures (SPs).
Implements creation and dropping of PROCEDUREs, IN, OUT, and INOUT parameters,
single-statement procedures, rudimentary multi-statement (begin-end) prodedures
(when the client can handle it), and local variables.
Missing most of the embedded SQL language, all attributes, FUNCTIONs, error handling,
reparses procedures at each call (no caching), etc, etc.
Certainly buggy too, but procedures can actually be created and called....
2002-12-08 19:59:22 +01:00
|
|
|
#endif /* _SP_RCONTEXT_H_ */
|