sp_pcontext.h 4.45 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
/* -*- 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_PCONTEXT_H_
#define _SP_PCONTEXT_H_

#ifdef __GNUC__
#pragma interface			/* gcc class implementation */
#endif

typedef enum
{
  sp_param_in,
  sp_param_out,
  sp_param_inout
} sp_param_mode_t;

32
typedef struct sp_pvar
33
{
34
  LEX_STRING name;
35 36 37 38
  enum enum_field_types type;
  sp_param_mode_t mode;
  uint offset;			// Offset in current frame
  my_bool isset;
39
  Item *dflt;
40 41
} sp_pvar_t;

42
typedef struct sp_label
43 44 45
{
  char *name;
  uint ip;			// Instruction index
pem@mysql.comhem.se's avatar
pem@mysql.comhem.se committed
46
  my_bool isbegin;		// For ITERATE error checking
47 48
} sp_label_t;

49 50 51 52 53 54 55 56 57 58 59 60 61
typedef struct sp_cond_type
{
  enum { number, state, warning, notfound, exception } type;
  char sqlstate[6];
  uint mysqlerr;
} sp_cond_type_t;

typedef struct sp_cond
{
  LEX_STRING name;
  sp_cond_type_t *val;
} sp_cond_t;

pem@mysql.comhem.se's avatar
pem@mysql.comhem.se committed
62 63 64 65 66
typedef struct sp_scope
{
  uint vars, conds, curs;
} sp_scope_t;

67 68 69 70 71 72 73 74 75
class sp_pcontext : public Sql_alloc
{
  sp_pcontext(const sp_pcontext &); /* Prevent use of these */
  void operator=(sp_pcontext &);

 public:

  sp_pcontext();

76 77 78 79
  // Free memory
  void
  destroy();

pem@mysql.comhem.se's avatar
pem@mysql.comhem.se committed
80 81 82 83 84 85 86
  // For error checking of duplicate things
  void
  push_scope();

  void
  pop_scope();

87 88 89 90
  //
  // Parameters and variables
  //

91 92 93 94 95 96 97 98 99
  inline uint
  max_framesize()
  {
    return m_framesize;
  }

  inline uint
  current_framesize()
  {
100
    return m_pvar.elements;
101 102 103 104 105 106 107 108 109 110 111 112
  }

  inline uint
  params()
  {
    return m_params;
  }

  // Set the number of parameters to the current esize
  inline void
  set_params()
  {
113
    m_params= m_pvar.elements;
114 115 116 117 118
  }

  inline void
  set_type(uint i, enum enum_field_types type)
  {
119 120 121 122
    sp_pvar_t *p= find_pvar(i);

    if (p)
      p->type= type;
123 124 125 126 127
  }

  inline void
  set_isset(uint i, my_bool val)
  {
128 129 130 131
    sp_pvar_t *p= find_pvar(i);

    if (p)
      p->isset= val;
132 133
  }

134 135 136 137 138 139 140 141 142
  inline void
  set_default(uint i, Item *it)
  {
    sp_pvar_t *p= find_pvar(i);

    if (p)
      p->dflt= it;
  }

143
  void
144
  push_pvar(LEX_STRING *name, enum enum_field_types type, sp_param_mode_t mode);
145

146
  // Pop the last 'num' slots of the frame
147
  inline void
148
  pop_pvar(uint num = 1)
149
  {
150 151
    while (num--)
      pop_dynamic(&m_pvar);
152 153 154 155
  }

  // Find by name
  sp_pvar_t *
pem@mysql.comhem.se's avatar
pem@mysql.comhem.se committed
156
  find_pvar(LEX_STRING *name, my_bool scoped=0);
157 158 159 160 161

  // Find by index
  sp_pvar_t *
  find_pvar(uint i)
  {
162 163 164 165 166 167 168
    sp_pvar_t *p;

    if (i < m_pvar.elements)
      get_dynamic(&m_pvar, (gptr)&p, i);
    else
      p= NULL;
    return p;
169 170
  }

171 172 173 174
  //
  // Labels
  //

175
  sp_label_t *
176 177 178 179 180
  push_label(char *name, uint ip);

  sp_label_t *
  find_label(char *name);

181 182 183 184 185 186
  inline sp_label_t *
  last_label()
  {
    return m_label.head();
  }

187
  inline sp_label_t *
188 189
  pop_label()
  {
190
    return m_label.pop();
191 192
  }

193 194 195 196 197 198 199 200 201 202 203 204 205 206 207
  //
  // Conditions
  //

  void
  push_cond(LEX_STRING *name, sp_cond_type_t *val);

  inline void
  pop_cond(uint num)
  {
    while (num--)
      pop_dynamic(&m_cond);
  }

  sp_cond_type_t *
pem@mysql.comhem.se's avatar
pem@mysql.comhem.se committed
208
  find_cond(LEX_STRING *name, my_bool scoped=0);
209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225

  //
  // Handlers
  //

  inline void
  add_handler()
  {
    m_handlers+= 1;
  }

  inline uint
  handlers()
  {
    return m_handlers;
  }

226 227 228 229 230 231 232 233
  //
  // Cursors
  //

  void
  push_cursor(LEX_STRING *name);

  my_bool
pem@mysql.comhem.se's avatar
pem@mysql.comhem.se committed
234
  find_cursor(LEX_STRING *name, uint *poff, my_bool scoped=0);
235 236 237 238 239 240 241 242 243 244 245 246 247 248

  inline void
  pop_cursor(uint num)
  {
    while (num--)
      pop_dynamic(&m_cursor);
  }

  inline uint
  cursors()
  {
    return m_cursmax;
  }

249 250 251 252
private:

  uint m_params;		// The number of parameters
  uint m_framesize;		// The maximum framesize
253
  uint m_handlers;		// The total number of handlers
254
  uint m_cursmax;		// The maximum number of cursors
255

256 257
  DYNAMIC_ARRAY m_pvar;		// Parameters/variables
  DYNAMIC_ARRAY m_cond;		// Conditions
258
  DYNAMIC_ARRAY m_cursor;	// Cursors
pem@mysql.comhem.se's avatar
pem@mysql.comhem.se committed
259
  DYNAMIC_ARRAY m_scopes;	// For error checking
260

261 262
  List<sp_label_t> m_label;	// The label list

263 264 265 266
}; // class sp_pcontext : public Sql_alloc


#endif /* _SP_PCONTEXT_H_ */