event.h 5.77 KB
Newer Older
1
/* Copyright (C) 2004-2005 MySQL AB
andrey@lmy004's avatar
andrey@lmy004 committed
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

   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 */

17 18 19
#ifndef _EVENT_H_
#define _EVENT_H_

andrey@lmy004's avatar
andrey@lmy004 committed
20 21
#include "sp.h"
#include "sp_head.h"
22

andrey@lmy004's avatar
andrey@lmy004 committed
23 24 25 26 27 28 29 30 31
#define EVEX_OK                 SP_OK
#define EVEX_KEY_NOT_FOUND      SP_KEY_NOT_FOUND
#define EVEX_OPEN_TABLE_FAILED  SP_OPEN_TABLE_FAILED
#define EVEX_WRITE_ROW_FAILED   SP_WRITE_ROW_FAILED
#define EVEX_DELETE_ROW_FAILED  SP_DELETE_ROW_FAILED
#define EVEX_GET_FIELD_FAILED   SP_GET_FIELD_FAILED
#define EVEX_PARSE_ERROR        SP_PARSE_ERROR
#define EVEX_INTERNAL_ERROR     SP_INTERNAL_ERROR
#define EVEX_NO_DB_ERROR        SP_NO_DB_ERROR
32
#define EVEX_COMPILE_ERROR     -19
andrey@lmy004's avatar
andrey@lmy004 committed
33 34 35 36 37 38 39 40 41
#define EVEX_GENERAL_ERROR     -20
#define EVEX_BAD_IDENTIFIER     SP_BAD_IDENTIFIER
#define EVEX_BODY_TOO_LONG      SP_BODY_TOO_LONG
#define EVEX_BAD_PARAMS        -21
#define EVEX_NOT_RUNNING       -22

#define EVENT_EXEC_NO_MORE      (1L << 0)
#define EVENT_NOT_USED          (1L << 1)

42

andrey@lmy004's avatar
andrey@lmy004 committed
43
extern ulong opt_event_executor;
44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61

enum enum_event_on_completion
{ 
  MYSQL_EVENT_ON_COMPLETION_DROP = 1,
  MYSQL_EVENT_ON_COMPLETION_PRESERVE
};

enum enum_event_status
{ 
  MYSQL_EVENT_ENABLED = 1,
  MYSQL_EVENT_DISABLED
};


class event_timed
{
  event_timed(const event_timed &);	/* Prevent use of these */
  void operator=(event_timed &);
andrey@lmy004's avatar
andrey@lmy004 committed
62 63
  my_bool running;
  pthread_mutex_t LOCK_running;
64

65 66 67 68
  bool status_changed;
  bool last_executed_changed;
  TIME last_executed;

69
public:
70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92
  LEX_STRING dbname;
  LEX_STRING name;
  LEX_STRING body;

  LEX_STRING definer_user;
  LEX_STRING definer_host;
  LEX_STRING definer;// combination of user and host

  LEX_STRING comment;
  TIME starts;
  TIME ends;
  TIME execute_at;

  longlong expression;
  interval_type interval;

  longlong created;
  longlong modified;
  enum enum_event_on_completion on_completion;
  enum enum_event_status status;
  sp_head *sphead;

  const uchar *body_begin;
93
  
94 95 96 97 98 99 100 101 102 103
  bool dropped;
  bool free_sphead_on_delete;
  uint flags;//all kind of purposes

  event_timed():running(0), status_changed(false), last_executed_changed(false),
                expression(0), created(0), modified(0),
                on_completion(MYSQL_EVENT_ON_COMPLETION_DROP),
                status(MYSQL_EVENT_ENABLED), sphead(0), dropped(false),
                free_sphead_on_delete(true), flags(0)
                
andrey@lmy004's avatar
andrey@lmy004 committed
104
  {
andrey@lmy004's avatar
andrey@lmy004 committed
105
    pthread_mutex_init(&this->LOCK_running, MY_MUTEX_INIT_FAST);
andrey@lmy004's avatar
andrey@lmy004 committed
106 107
    init();
  }
108 109 110
 
  ~event_timed()
  {
andrey@lmy004's avatar
andrey@lmy004 committed
111
    pthread_mutex_destroy(&this->LOCK_running);
112
    if (free_sphead_on_delete)
113 114 115
	    free_sp();
  }
  
andrey@lmy004's avatar
andrey@lmy004 committed
116
  
117 118 119 120 121 122 123 124 125 126
  void
  init();

  int 
  init_definer(THD *thd);
  
  int
  init_execute_at(THD *thd, Item *expr);

  int
127
  init_interval(THD *thd, Item *expr, interval_type new_interval);
128 129

  void
130
  init_name(THD *thd, sp_name *spn);
131 132 133 134 135 136 137 138

  int
  init_starts(THD *thd, Item *starts);

  int
  init_ends(THD *thd, Item *ends);
  
  void
139
  init_body(THD *thd);
140 141

  void
142
  init_comment(THD *thd, LEX_STRING *set_comment);
143 144 145 146 147 148 149 150 151 152

  int
  load_from_row(MEM_ROOT *mem_root, TABLE *table);
  
  bool
  compute_next_execution_time();  

  void
  mark_last_executed();
  
andrey@lmy004's avatar
andrey@lmy004 committed
153
  int
154 155 156 157 158 159 160 161 162
  drop(THD *thd);
  
  bool
  update_fields(THD *thd);

  char *
  get_show_create_event(THD *thd, uint *length);
  
  int
andrey@lmy004's avatar
andrey@lmy004 committed
163
  execute(THD *thd, MEM_ROOT *mem_root= NULL);
164 165

  int
andrey@lmy004's avatar
andrey@lmy004 committed
166
  compile(THD *thd, MEM_ROOT *mem_root= NULL);
167
  
andrey@lmy004's avatar
andrey@lmy004 committed
168 169 170 171 172 173 174 175 176 177 178 179
  my_bool
  is_running()
  {
    my_bool ret;
    
    VOID(pthread_mutex_lock(&this->LOCK_running));
    ret= running;
    VOID(pthread_mutex_unlock(&this->LOCK_running));

    return ret;  
  }
  
180 181
  void free_sp()
  {
182 183
    delete sphead;
    sphead= 0;
184 185 186 187 188
  }
};


int
andrey@lmy004's avatar
andrey@lmy004 committed
189 190
evex_create_event(THD *thd, event_timed *et, uint create_options,
                  uint *rows_affected);
191 192

int
andrey@lmy004's avatar
andrey@lmy004 committed
193 194
evex_update_event(THD *thd, event_timed *et, sp_name *new_name,
                  uint *rows_affected);
195 196

int
andrey@lmy004's avatar
andrey@lmy004 committed
197 198
evex_drop_event(THD *thd, event_timed *et, bool drop_if_exists,
                uint *rows_affected);
199 200 201 202 203 204 205 206


int
init_events();

void
shutdown_events();

andrey@lmy004's avatar
andrey@lmy004 committed
207 208 209 210

// auxiliary
int 
event_timed_compare(event_timed **a, event_timed **b);
211 212 213


/*
andrey@lmy004's avatar
andrey@lmy004 committed
214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237
CREATE TABLE event (
  db char(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL default '',
  name char(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL default '',
  body longblob NOT NULL,
  definer char(77) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL default '',
  execute_at DATETIME default NULL,
  interval_value int(11) default NULL,
  interval_field ENUM('YEAR','QUARTER','MONTH','DAY','HOUR','MINUTE','WEEK',
                       'SECOND','MICROSECOND', 'YEAR_MONTH','DAY_HOUR',
                       'DAY_MINUTE','DAY_SECOND',
                       'HOUR_MINUTE','HOUR_SECOND',
                       'MINUTE_SECOND','DAY_MICROSECOND',
                       'HOUR_MICROSECOND','MINUTE_MICROSECOND',
                       'SECOND_MICROSECOND') default NULL,
  created TIMESTAMP NOT NULL,
  modified TIMESTAMP NOT NULL,
  last_executed DATETIME default NULL,
  starts DATETIME default NULL,
  ends DATETIME default NULL,
  status ENUM('ENABLED','DISABLED') NOT NULL default 'ENABLED',
  on_completion ENUM('DROP','PRESERVE') NOT NULL default 'DROP',
  comment varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL default '',
  PRIMARY KEY  (db,name)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT 'Events';
238 239 240
*/

#endif /* _EVENT_H_ */