mirror of
https://github.com/MariaDB/server.git
synced 2025-08-30 11:22:14 +03:00
Bug#7626
This commit is contained in:
@@ -70,12 +70,13 @@
|
|||||||
* mysql> use TEST_DB;
|
* mysql> use TEST_DB;
|
||||||
* mysql> create table TAB0 (COL0 int primary key, COL1 int, COL11 int) engine=ndb;
|
* mysql> create table TAB0 (COL0 int primary key, COL1 int, COL11 int) engine=ndb;
|
||||||
*
|
*
|
||||||
* In another window start ndbapi_example5, wait until properly started
|
* In another window start ndbapi_event, wait until properly started
|
||||||
*
|
*
|
||||||
* mysql> insert into TAB0 values (1,2,3);
|
insert into TAB0 values (1,2,3);
|
||||||
* mysql> insert into TAB0 values (2,2,3);
|
insert into TAB0 values (2,2,3);
|
||||||
* mysql> insert into TAB0 values (3,2,9);
|
insert into TAB0 values (3,2,9);
|
||||||
* mysql>
|
update TAB0 set COL1=10 where COL0=1;
|
||||||
|
delete from TAB0 where COL0=1;
|
||||||
*
|
*
|
||||||
* you should see the data popping up in the example window
|
* you should see the data popping up in the example window
|
||||||
*
|
*
|
||||||
|
@@ -56,6 +56,7 @@ struct TriggerActionTime {
|
|||||||
};
|
};
|
||||||
|
|
||||||
struct TriggerEvent {
|
struct TriggerEvent {
|
||||||
|
/** TableEvent must match 1 << TriggerEvent */
|
||||||
enum Value {
|
enum Value {
|
||||||
TE_INSERT = 0,
|
TE_INSERT = 0,
|
||||||
TE_DELETE = 1,
|
TE_DELETE = 1,
|
||||||
|
@@ -915,6 +915,9 @@ public:
|
|||||||
/**
|
/**
|
||||||
* Specifies the type of database operations an Event listens to
|
* Specifies the type of database operations an Event listens to
|
||||||
*/
|
*/
|
||||||
|
#ifndef DOXYGEN_SHOULD_SKIP_INTERNAL
|
||||||
|
/** TableEvent must match 1 << TriggerEvent */
|
||||||
|
#endif
|
||||||
enum TableEvent {
|
enum TableEvent {
|
||||||
TE_INSERT=1, ///< Insert event on table
|
TE_INSERT=1, ///< Insert event on table
|
||||||
TE_DELETE=2, ///< Delete event on table
|
TE_DELETE=2, ///< Delete event on table
|
||||||
|
@@ -224,8 +224,7 @@ NdbEventOperationImpl::execute()
|
|||||||
|
|
||||||
|
|
||||||
int hasSubscriber;
|
int hasSubscriber;
|
||||||
int r=
|
int r= m_bufferHandle->prepareAddSubscribeEvent(this,
|
||||||
m_bufferHandle->prepareAddSubscribeEvent(m_eventImpl->m_eventId,
|
|
||||||
hasSubscriber /*return value*/);
|
hasSubscriber /*return value*/);
|
||||||
m_error.code= 4709;
|
m_error.code= 4709;
|
||||||
|
|
||||||
@@ -697,10 +696,11 @@ NdbGlobalEventBufferHandle::drop(NdbGlobalEventBufferHandle *handle)
|
|||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
int
|
int
|
||||||
NdbGlobalEventBufferHandle::prepareAddSubscribeEvent(Uint32 eventId,
|
NdbGlobalEventBufferHandle::prepareAddSubscribeEvent
|
||||||
int& hasSubscriber)
|
(NdbEventOperationImpl *eventOp, int& hasSubscriber)
|
||||||
{
|
{
|
||||||
ADD_DROP_LOCK_GUARDR(int,real_prepareAddSubscribeEvent(this, eventId, hasSubscriber));
|
ADD_DROP_LOCK_GUARDR(int,real_prepareAddSubscribeEvent(this, eventOp,
|
||||||
|
hasSubscriber));
|
||||||
}
|
}
|
||||||
void
|
void
|
||||||
NdbGlobalEventBufferHandle::addSubscribeEvent
|
NdbGlobalEventBufferHandle::addSubscribeEvent
|
||||||
@@ -893,11 +893,13 @@ NdbGlobalEventBuffer::real_remove(NdbGlobalEventBufferHandle *h)
|
|||||||
|
|
||||||
int
|
int
|
||||||
NdbGlobalEventBuffer::real_prepareAddSubscribeEvent
|
NdbGlobalEventBuffer::real_prepareAddSubscribeEvent
|
||||||
(NdbGlobalEventBufferHandle *aHandle, Uint32 eventId, int& hasSubscriber)
|
(NdbGlobalEventBufferHandle *aHandle, NdbEventOperationImpl *eventOp,
|
||||||
|
int& hasSubscriber)
|
||||||
{
|
{
|
||||||
DBUG_ENTER("NdbGlobalEventBuffer::real_prepareAddSubscribeEvent");
|
DBUG_ENTER("NdbGlobalEventBuffer::real_prepareAddSubscribeEvent");
|
||||||
int i;
|
int i;
|
||||||
int bufferId= -1;
|
int bufferId= -1;
|
||||||
|
Uint32 eventId= eventOp->m_eventId;
|
||||||
|
|
||||||
// add_drop_lock(); // only one thread can do add or drop at a time
|
// add_drop_lock(); // only one thread can do add or drop at a time
|
||||||
|
|
||||||
@@ -939,6 +941,7 @@ found_bufferId:
|
|||||||
bufferId= NO_ID(0, bufferId);
|
bufferId= NO_ID(0, bufferId);
|
||||||
|
|
||||||
b.gId= eventId;
|
b.gId= eventId;
|
||||||
|
b.eventType= (Uint32)eventOp->m_eventImpl->mi_type;
|
||||||
|
|
||||||
if ((b.p_buf_mutex= NdbMutex_Create()) == NULL) {
|
if ((b.p_buf_mutex= NdbMutex_Create()) == NULL) {
|
||||||
ndbout_c("NdbGlobalEventBuffer: NdbMutex_Create() failed");
|
ndbout_c("NdbGlobalEventBuffer: NdbMutex_Create() failed");
|
||||||
@@ -1137,6 +1140,8 @@ NdbGlobalEventBuffer::real_insertDataL(int bufferId,
|
|||||||
#ifdef EVENT_DEBUG
|
#ifdef EVENT_DEBUG
|
||||||
int n = NO(bufferId);
|
int n = NO(bufferId);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
if ( b.eventType & (1 << (Uint32)sdata->operation) )
|
||||||
{
|
{
|
||||||
if (b.subs) {
|
if (b.subs) {
|
||||||
#ifdef EVENT_DEBUG
|
#ifdef EVENT_DEBUG
|
||||||
@@ -1175,6 +1180,13 @@ NdbGlobalEventBuffer::real_insertDataL(int bufferId,
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
#ifdef EVENT_DEBUG
|
||||||
|
ndbout_c("skipped");
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
DBUG_RETURN(0);
|
DBUG_RETURN(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -79,7 +79,7 @@ public:
|
|||||||
//static NdbGlobalEventBufferHandle *init(int MAX_NUMBER_ACTIVE_EVENTS);
|
//static NdbGlobalEventBufferHandle *init(int MAX_NUMBER_ACTIVE_EVENTS);
|
||||||
|
|
||||||
// returns bufferId 0-N if ok otherwise -1
|
// returns bufferId 0-N if ok otherwise -1
|
||||||
int prepareAddSubscribeEvent(Uint32 eventId, int& hasSubscriber);
|
int prepareAddSubscribeEvent(NdbEventOperationImpl *, int& hasSubscriber);
|
||||||
void unprepareAddSubscribeEvent(int bufferId);
|
void unprepareAddSubscribeEvent(int bufferId);
|
||||||
void addSubscribeEvent(int bufferId,
|
void addSubscribeEvent(int bufferId,
|
||||||
NdbEventOperationImpl *ndbEventOperationImpl);
|
NdbEventOperationImpl *ndbEventOperationImpl);
|
||||||
@@ -133,7 +133,8 @@ private:
|
|||||||
int MAX_NUMBER_ACTIVE_EVENTS);
|
int MAX_NUMBER_ACTIVE_EVENTS);
|
||||||
|
|
||||||
int real_prepareAddSubscribeEvent(NdbGlobalEventBufferHandle *h,
|
int real_prepareAddSubscribeEvent(NdbGlobalEventBufferHandle *h,
|
||||||
Uint32 eventId, int& hasSubscriber);
|
NdbEventOperationImpl *,
|
||||||
|
int& hasSubscriber);
|
||||||
void real_unprepareAddSubscribeEvent(int bufferId);
|
void real_unprepareAddSubscribeEvent(int bufferId);
|
||||||
void real_addSubscribeEvent(int bufferId, void *ndbEventOperation);
|
void real_addSubscribeEvent(int bufferId, void *ndbEventOperation);
|
||||||
|
|
||||||
@@ -177,6 +178,7 @@ private:
|
|||||||
// local mutex for each event/buffer
|
// local mutex for each event/buffer
|
||||||
NdbMutex *p_buf_mutex;
|
NdbMutex *p_buf_mutex;
|
||||||
Uint32 gId;
|
Uint32 gId;
|
||||||
|
Uint32 eventType;
|
||||||
struct Data {
|
struct Data {
|
||||||
SubTableData *sdata;
|
SubTableData *sdata;
|
||||||
LinearSectionPtr ptr[3];
|
LinearSectionPtr ptr[3];
|
||||||
|
Reference in New Issue
Block a user