summaryrefslogtreecommitdiff
path: root/sql/event_queue.h
blob: 1335100be21ce85f0979cf45eb1c46e8e5fc701d (plain)
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
#ifndef _EVENT_QUEUE_H_
#define _EVENT_QUEUE_H_
/* Copyright (C) 2004-2006 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 */

class sp_name;
class Event_timed;
class Event_db_repository;
class Event_job_data;

class THD;
typedef bool * (*event_timed_identifier_comparator)(Event_timed*, Event_timed*);

class Event_scheduler_ng;

class Event_queue
{
public:
  Event_queue();

  void
  init_mutexes();
  
  void
  deinit_mutexes();
  
  bool
  init(Event_db_repository *db_repo);
  
  void
  deinit();

  /* Methods for queue management follow */

  int
  create_event(THD *thd, Event_parse_data *et, bool check_existence);

  int
  update_event(THD *thd, Event_parse_data *et, LEX_STRING *new_schema,
               LEX_STRING *new_name);

  bool
  drop_event(THD *thd, sp_name *name);

  int
  drop_schema_events(THD *thd, LEX_STRING schema);

  int
  drop_user_events(THD *thd, LEX_STRING *definer)
  { DBUG_ASSERT(0); return 0;}

  uint
  events_count();

  uint
  events_count_no_lock();

  static bool
  check_system_tables(THD *thd);

  void
  recalculate_queue(THD *thd);
  
  void
  empty_queue();

  Event_timed *
  get_top_for_execution_if_time(THD *thd, time_t now, struct timespec *abstime);
 
  Event_timed*
  get_top();
  
  void
  remove_top();
  
  void
  top_changed();

///////////////protected
  Event_timed *
  find_event(LEX_STRING db, LEX_STRING name, bool remove_from_q);

  int
  load_events_from_db(THD *thd);

  void
  drop_matching_events(THD *thd, LEX_STRING pattern,
                       bool (*)(Event_timed *,LEX_STRING *));

  /* LOCK_event_queue is the mutex which protects the access to the queue. */
  pthread_mutex_t LOCK_event_queue;

  Event_db_repository *db_repository;

  /* The sorted queue with the Event_timed objects */
  QUEUE queue;
  
  uint mutex_last_locked_at_line;
  uint mutex_last_unlocked_at_line;
  const char* mutex_last_locked_in_func;
  const char* mutex_last_unlocked_in_func;
  bool mutex_queue_data_locked;

  /* helper functions for working with mutexes & conditionals */
  void
  lock_data(const char *func, uint line);

  void
  unlock_data(const char *func, uint line);

  void
  on_queue_change();
  
  Event_scheduler_ng *scheduler;
protected:

};

#endif /* _EVENT_QUEUE_H_ */