ruby-binlog 0.1.0 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/README +3 -0
- data/ext/Makefile +19 -19
- data/ext/binlog.so +0 -0
- data/ext/ruby_binlog.cpp +16 -5
- data/ext/ruby_binlog.o +0 -0
- data/ext/ruby_binlog_event.h +12 -1
- data/ext/ruby_binlog_event.o +0 -0
- data/ext/ruby_binlog_format_event.o +0 -0
- data/ext/ruby_binlog_incident_event.o +0 -0
- data/ext/ruby_binlog_int_var_event.o +0 -0
- data/ext/ruby_binlog_query_event.o +0 -0
- data/ext/ruby_binlog_rotate_event.o +0 -0
- data/ext/ruby_binlog_row_event.cpp +133 -9
- data/ext/ruby_binlog_row_event.o +0 -0
- data/ext/ruby_binlog_table_map_event.o +0 -0
- data/ext/ruby_binlog_unimplemented_event.o +0 -0
- data/ext/ruby_binlog_user_var_event.o +0 -0
- data/ext/ruby_binlog_xid_event.o +0 -0
- data/ext/test.rb +18 -0
- metadata +5 -4
data/README
CHANGED
data/ext/Makefile
CHANGED
@@ -9,32 +9,32 @@ hdrdir = $(topdir)
|
|
9
9
|
VPATH = $(srcdir):$(topdir):$(hdrdir)
|
10
10
|
prefix = $(DESTDIR)/usr
|
11
11
|
exec_prefix = $(DESTDIR)/usr
|
12
|
-
|
13
|
-
vendordir = $(DESTDIR)/usr/lib/ruby
|
14
|
-
sitearchdir = $(libdir)/ruby/site_ruby/$(ruby_version)/$(sitearch)
|
12
|
+
mandir = $(DESTDIR)/usr/share/man
|
15
13
|
localedir = $(datarootdir)/locale
|
16
|
-
|
14
|
+
vendordir = $(DESTDIR)/usr/lib/ruby
|
17
15
|
datadir = $(DESTDIR)/usr/share
|
18
|
-
|
19
|
-
bindir = $(DESTDIR)/usr/bin
|
20
|
-
sharedstatedir = $(DESTDIR)/var/lib
|
16
|
+
sitearchdir = $(libdir)/ruby/site_ruby/$(ruby_version)/$(sitearch)
|
21
17
|
libexecdir = $(DESTDIR)/usr/libexec
|
22
|
-
vendorlibdir = $(vendordir)/$(ruby_version)
|
23
|
-
oldincludedir = $(DESTDIR)/usr/include
|
24
|
-
sitedir = $(DESTDIR)/usr/lib/ruby/site_ruby
|
25
|
-
mandir = $(DESTDIR)/usr/share/man
|
26
|
-
datarootdir = $(prefix)/share
|
27
|
-
htmldir = $(docdir)
|
28
|
-
pdfdir = $(docdir)
|
29
|
-
localstatedir = $(DESTDIR)/var
|
30
|
-
includedir = $(DESTDIR)/usr/include
|
31
|
-
sitelibdir = $(sitedir)/$(ruby_version)
|
32
|
-
sysconfdir = $(DESTDIR)/etc
|
33
18
|
psdir = $(docdir)
|
19
|
+
sysconfdir = $(DESTDIR)/etc
|
20
|
+
bindir = $(DESTDIR)/usr/bin
|
21
|
+
includedir = $(DESTDIR)/usr/include
|
22
|
+
vendorarchdir = $(libdir)/ruby/$(ruby_version)/$(sitearch)
|
23
|
+
sitedir = $(DESTDIR)/usr/lib/ruby/site_ruby
|
34
24
|
libdir = $(DESTDIR)/usr/lib64
|
25
|
+
sitelibdir = $(sitedir)/$(ruby_version)
|
26
|
+
rubylibdir = $(vendordir)/$(ruby_version)
|
27
|
+
localstatedir = $(DESTDIR)/var
|
28
|
+
infodir = $(DESTDIR)/usr/share/info
|
35
29
|
docdir = $(datarootdir)/doc/$(PACKAGE)
|
30
|
+
datarootdir = $(prefix)/share
|
36
31
|
archdir = $(libdir)/ruby/$(ruby_version)/$(sitearch)
|
37
|
-
|
32
|
+
oldincludedir = $(DESTDIR)/usr/include
|
33
|
+
sharedstatedir = $(DESTDIR)/var/lib
|
34
|
+
htmldir = $(docdir)
|
35
|
+
dvidir = $(docdir)
|
36
|
+
vendorlibdir = $(vendordir)/$(ruby_version)
|
37
|
+
pdfdir = $(docdir)
|
38
38
|
sbindir = $(DESTDIR)/usr/sbin
|
39
39
|
|
40
40
|
CC = gcc
|
data/ext/binlog.so
CHANGED
Binary file
|
data/ext/ruby_binlog.cpp
CHANGED
@@ -16,19 +16,29 @@ namespace binlog {
|
|
16
16
|
|
17
17
|
struct Client {
|
18
18
|
Binary_log *m_binlog;
|
19
|
+
VALUE m_table_map;
|
19
20
|
|
20
21
|
static void free(Client *p) {
|
21
22
|
if (p->m_binlog) {
|
22
23
|
delete p->m_binlog;
|
23
24
|
p->m_binlog = 0;
|
25
|
+
p->m_table_map = 0;
|
24
26
|
}
|
25
27
|
|
26
28
|
delete p;
|
27
29
|
}
|
28
30
|
|
31
|
+
static void mark(Client *p) {
|
32
|
+
if (p->m_table_map) {
|
33
|
+
rb_gc_mark(p->m_table_map);
|
34
|
+
}
|
35
|
+
}
|
36
|
+
|
29
37
|
static VALUE alloc(VALUE klass) {
|
30
38
|
Client *p = new Client();
|
31
|
-
|
39
|
+
p->m_binlog = 0;
|
40
|
+
p->m_table_map = 0;
|
41
|
+
return Data_Wrap_Struct(klass, &mark, &free, p);
|
32
42
|
}
|
33
43
|
|
34
44
|
static VALUE initialize(VALUE self, VALUE uri) {
|
@@ -92,17 +102,18 @@ struct Client {
|
|
92
102
|
case TABLE_MAP_EVENT:
|
93
103
|
retval = rb_funcall(rb_cBinlogTableMapEvent, rb_intern("new"), 0);
|
94
104
|
TableMapEvent::set_event(retval, event);
|
105
|
+
p->m_table_map = retval;
|
95
106
|
break;
|
96
107
|
|
97
108
|
// XXX: Is it right?
|
98
|
-
case PRE_GA_WRITE_ROWS_EVENT:
|
99
|
-
case PRE_GA_UPDATE_ROWS_EVENT:
|
100
|
-
case PRE_GA_DELETE_ROWS_EVENT:
|
109
|
+
//case PRE_GA_WRITE_ROWS_EVENT:
|
110
|
+
//case PRE_GA_UPDATE_ROWS_EVENT:
|
111
|
+
//case PRE_GA_DELETE_ROWS_EVENT:
|
101
112
|
case WRITE_ROWS_EVENT:
|
102
113
|
case UPDATE_ROWS_EVENT:
|
103
114
|
case DELETE_ROWS_EVENT:
|
104
115
|
retval = rb_funcall(rb_cBinlogRowEvent, rb_intern("new"), 0);
|
105
|
-
RowEvent::set_event(retval, event);
|
116
|
+
RowEvent::set_event(retval, event, p->m_table_map);
|
106
117
|
break;
|
107
118
|
|
108
119
|
case INTVAR_EVENT:
|
data/ext/ruby_binlog.o
CHANGED
Binary file
|
data/ext/ruby_binlog_event.h
CHANGED
@@ -98,19 +98,30 @@ struct TableMapEvent : public Event {
|
|
98
98
|
|
99
99
|
struct RowEvent : public Event {
|
100
100
|
mysql::Row_event *m_event;
|
101
|
+
VALUE m_table_map;
|
101
102
|
|
102
103
|
static void free(RowEvent *p);
|
104
|
+
static void mark(RowEvent *p);
|
103
105
|
static VALUE alloc(VALUE klass);
|
104
|
-
static void set_event(VALUE self, mysql::Binary_log_event *event);
|
106
|
+
static void set_event(VALUE self, mysql::Binary_log_event *event, VALUE table_map);
|
105
107
|
static void init();
|
106
108
|
|
107
109
|
static VALUE get_table_id(VALUE self);
|
110
|
+
static VALUE get_db_name(VALUE self);
|
111
|
+
static VALUE get_table_name(VALUE self);
|
108
112
|
static VALUE get_flags(VALUE self);
|
109
113
|
static VALUE get_columns_len(VALUE self);
|
110
114
|
static VALUE get_null_bits_len(VALUE self);
|
111
115
|
static VALUE get_columns_before_image(VALUE self);
|
112
116
|
static VALUE get_used_columns(VALUE self);
|
113
117
|
static VALUE get_row(VALUE self);
|
118
|
+
static VALUE get_rows(VALUE self);
|
119
|
+
|
120
|
+
private:
|
121
|
+
static void proc0(mysql::Row_of_fields &fields, VALUE rb_fields);
|
122
|
+
static VALUE proc_insert(mysql::Row_of_fields &fields);
|
123
|
+
static VALUE proc_update(mysql::Row_of_fields &old_fields, mysql::Row_of_fields &new_fields);
|
124
|
+
static VALUE proc_delete(mysql::Row_of_fields &fields);
|
114
125
|
};
|
115
126
|
|
116
127
|
struct IntVarEvent : public Event {
|
data/ext/ruby_binlog_event.o
CHANGED
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
@@ -9,27 +9,36 @@ void RowEvent::free(RowEvent *p) {
|
|
9
9
|
if (p->m_event) {
|
10
10
|
delete p->m_event;
|
11
11
|
p->m_event = 0;
|
12
|
+
p->m_table_map = 0;
|
12
13
|
p->m_event_header = 0;
|
13
14
|
}
|
14
15
|
|
15
16
|
delete p;
|
16
17
|
}
|
17
18
|
|
19
|
+
void RowEvent::mark(RowEvent *p) {
|
20
|
+
if (p->m_table_map) {
|
21
|
+
rb_gc_mark(p->m_table_map);
|
22
|
+
}
|
23
|
+
}
|
24
|
+
|
18
25
|
VALUE RowEvent::alloc(VALUE klass) {
|
19
26
|
RowEvent *p;
|
20
27
|
|
21
28
|
p = new RowEvent();
|
22
29
|
p->m_event = 0;
|
30
|
+
p->m_table_map = 0;
|
23
31
|
p->m_event_header = 0;
|
24
32
|
|
25
|
-
return Data_Wrap_Struct(klass,
|
33
|
+
return Data_Wrap_Struct(klass, &mark, &free, p);
|
26
34
|
}
|
27
35
|
|
28
|
-
void RowEvent::set_event(VALUE self, mysql::Binary_log_event *event) {
|
36
|
+
void RowEvent::set_event(VALUE self, mysql::Binary_log_event *event, VALUE table_map) {
|
29
37
|
RowEvent *p;
|
30
38
|
|
31
39
|
Data_Get_Struct(self, RowEvent, p);
|
32
40
|
p->m_event = static_cast<Row_event*>(event);
|
41
|
+
p->m_table_map = table_map;
|
33
42
|
p->m_event_header = event->header();
|
34
43
|
}
|
35
44
|
|
@@ -39,13 +48,16 @@ void RowEvent::init() {
|
|
39
48
|
|
40
49
|
Event::init(rb_cBinlogRowEvent);
|
41
50
|
|
42
|
-
rb_define_method(rb_cBinlogRowEvent, "table_id",
|
43
|
-
rb_define_method(rb_cBinlogRowEvent, "
|
44
|
-
rb_define_method(rb_cBinlogRowEvent, "
|
45
|
-
rb_define_method(rb_cBinlogRowEvent, "
|
46
|
-
rb_define_method(rb_cBinlogRowEvent, "
|
47
|
-
rb_define_method(rb_cBinlogRowEvent, "
|
48
|
-
rb_define_method(rb_cBinlogRowEvent, "
|
51
|
+
rb_define_method(rb_cBinlogRowEvent, "table_id", __F(&get_table_id), 0);
|
52
|
+
rb_define_method(rb_cBinlogRowEvent, "db_name", __F(&get_db_name), 0);
|
53
|
+
rb_define_method(rb_cBinlogRowEvent, "table_name", __F(&get_table_name), 0);
|
54
|
+
rb_define_method(rb_cBinlogRowEvent, "flags", __F(&get_flags), 0);
|
55
|
+
rb_define_method(rb_cBinlogRowEvent, "columns_len", __F(&get_columns_len), 0);
|
56
|
+
rb_define_method(rb_cBinlogRowEvent, "null_bits_len", __F(&get_null_bits_len), 0);
|
57
|
+
rb_define_method(rb_cBinlogRowEvent, "raw_columns_before_image", __F(&get_columns_before_image), 0);
|
58
|
+
rb_define_method(rb_cBinlogRowEvent, "raw_used_columns", __F(&get_used_columns), 0);
|
59
|
+
rb_define_method(rb_cBinlogRowEvent, "raw_row", __F(&get_row), 0);
|
60
|
+
rb_define_method(rb_cBinlogRowEvent, "rows", __F(&get_rows), 0);
|
49
61
|
}
|
50
62
|
|
51
63
|
VALUE RowEvent::get_table_id(VALUE self) {
|
@@ -54,6 +66,32 @@ VALUE RowEvent::get_table_id(VALUE self) {
|
|
54
66
|
return ULL2NUM(p->m_event->table_id);
|
55
67
|
}
|
56
68
|
|
69
|
+
VALUE RowEvent::get_db_name(VALUE self) {
|
70
|
+
RowEvent *p;
|
71
|
+
Data_Get_Struct(self, RowEvent, p);
|
72
|
+
|
73
|
+
if (p->m_table_map) {
|
74
|
+
TableMapEvent *tme;
|
75
|
+
Data_Get_Struct(p->m_table_map, TableMapEvent, tme);
|
76
|
+
return rb_str_new2(tme->m_event->db_name.c_str());
|
77
|
+
} else {
|
78
|
+
return Qnil;
|
79
|
+
}
|
80
|
+
}
|
81
|
+
|
82
|
+
VALUE RowEvent::get_table_name(VALUE self) {
|
83
|
+
RowEvent *p;
|
84
|
+
Data_Get_Struct(self, RowEvent, p);
|
85
|
+
|
86
|
+
if (p->m_table_map) {
|
87
|
+
TableMapEvent *tme;
|
88
|
+
Data_Get_Struct(p->m_table_map, TableMapEvent, tme);
|
89
|
+
return rb_str_new2(tme->m_event->table_name.c_str());
|
90
|
+
} else {
|
91
|
+
return Qnil;
|
92
|
+
}
|
93
|
+
}
|
94
|
+
|
57
95
|
VALUE RowEvent::get_flags(VALUE self) {
|
58
96
|
RowEvent *p;
|
59
97
|
Data_Get_Struct(self, RowEvent, p);
|
@@ -114,5 +152,91 @@ VALUE RowEvent::get_row(VALUE self) {
|
|
114
152
|
return retval;
|
115
153
|
}
|
116
154
|
|
155
|
+
VALUE RowEvent::get_rows(VALUE self) {
|
156
|
+
RowEvent *p;
|
157
|
+
TableMapEvent *tme;
|
158
|
+
VALUE retval = rb_ary_new();
|
159
|
+
|
160
|
+
Data_Get_Struct(self, RowEvent, p);
|
161
|
+
|
162
|
+
if (!p->m_table_map) {
|
163
|
+
return retval;
|
164
|
+
}
|
165
|
+
|
166
|
+
Data_Get_Struct(p->m_table_map , TableMapEvent, tme);
|
167
|
+
|
168
|
+
mysql::Row_event_set rows(p->m_event, tme->m_event);
|
169
|
+
mysql::Row_event_set::iterator itor = rows.begin();
|
170
|
+
|
171
|
+
do {
|
172
|
+
VALUE rb_row = Qnil;
|
173
|
+
mysql::Row_of_fields fields = *itor;
|
174
|
+
Log_event_type event_type = p->m_event->get_event_type();
|
175
|
+
|
176
|
+
if (event_type == mysql::WRITE_ROWS_EVENT) {
|
177
|
+
rb_row = proc_insert(fields);
|
178
|
+
} else if (event_type == mysql::UPDATE_ROWS_EVENT) {
|
179
|
+
itor++;
|
180
|
+
mysql::Row_of_fields fields2 = *itor;
|
181
|
+
rb_row = proc_update(fields, fields2);
|
182
|
+
} else if (event_type == mysql::DELETE_ROWS_EVENT) {
|
183
|
+
rb_row = proc_delete(fields);
|
184
|
+
}
|
185
|
+
|
186
|
+
/*
|
187
|
+
if (event->get_event_type() == mysql::UPDATE_ROWS_EVENT)
|
188
|
+
{
|
189
|
+
++it;
|
190
|
+
mysql::Row_of_fields fields2= *it;
|
191
|
+
table_update(os.str(),fields,fields2);
|
192
|
+
}
|
193
|
+
if (event->get_event_type() == mysql::DELETE_ROWS_EVENT)
|
194
|
+
table_delete(os.str(),fields);
|
195
|
+
*/
|
196
|
+
|
197
|
+
rb_ary_push(retval, rb_row);
|
198
|
+
} while (++itor != rows.end());
|
199
|
+
|
200
|
+
return retval;
|
201
|
+
}
|
202
|
+
|
203
|
+
void RowEvent::proc0(mysql::Row_of_fields &fields, VALUE rb_fields) {
|
204
|
+
mysql::Converter converter;
|
205
|
+
mysql::Row_of_fields::iterator itor = fields.begin();
|
206
|
+
|
207
|
+
do {
|
208
|
+
std::string str;
|
209
|
+
converter.to(str, *itor);
|
210
|
+
rb_ary_push(rb_fields, rb_str_new2(str.c_str()));
|
211
|
+
} while(++itor != fields.end());
|
212
|
+
}
|
213
|
+
|
214
|
+
VALUE RowEvent::proc_insert(mysql::Row_of_fields &fields) {
|
215
|
+
VALUE rb_new_fields = rb_ary_new();
|
216
|
+
proc0(fields, rb_new_fields);
|
217
|
+
return rb_new_fields;
|
218
|
+
}
|
219
|
+
|
220
|
+
VALUE RowEvent::proc_update(mysql::Row_of_fields &old_fields, mysql::Row_of_fields &new_fields) {
|
221
|
+
VALUE rb_row, rb_old_fields, rb_new_fields;
|
222
|
+
|
223
|
+
rb_row = rb_ary_new();
|
224
|
+
rb_old_fields = rb_ary_new();
|
225
|
+
rb_new_fields = rb_ary_new();
|
226
|
+
|
227
|
+
proc0(old_fields, rb_old_fields);
|
228
|
+
proc0(new_fields, rb_new_fields);
|
229
|
+
rb_ary_push(rb_row, rb_old_fields);
|
230
|
+
rb_ary_push(rb_row, rb_new_fields);
|
231
|
+
|
232
|
+
return rb_row;
|
233
|
+
}
|
234
|
+
|
235
|
+
VALUE RowEvent::proc_delete(mysql::Row_of_fields &fields) {
|
236
|
+
VALUE rb_old_fields = rb_ary_new();
|
237
|
+
proc0(fields, rb_old_fields);
|
238
|
+
return rb_old_fields;
|
239
|
+
}
|
240
|
+
|
117
241
|
} // namespace binlog
|
118
242
|
} // namespace ruby
|
data/ext/ruby_binlog_row_event.o
CHANGED
Binary file
|
Binary file
|
Binary file
|
Binary file
|
data/ext/ruby_binlog_xid_event.o
CHANGED
Binary file
|
data/ext/test.rb
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
require "binlog"
|
3
|
+
|
4
|
+
client = Binlog::Client.new("mysql://repl:repl@hastur")
|
5
|
+
client.connect
|
6
|
+
client.position = 4
|
7
|
+
|
8
|
+
while event = client.wait_for_next_event
|
9
|
+
case event
|
10
|
+
when Binlog::QueryEvent
|
11
|
+
puts event.query
|
12
|
+
when Binlog::RowEvent
|
13
|
+
puts event.event_type
|
14
|
+
p event.rows
|
15
|
+
else
|
16
|
+
puts "(#{event.event_type})"
|
17
|
+
end
|
18
|
+
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ruby-binlog
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 25
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 1
|
9
|
-
-
|
10
|
-
version: 0.1.
|
9
|
+
- 1
|
10
|
+
version: 0.1.1
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- winebarrel
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2012-08-
|
18
|
+
date: 2012-08-26 00:00:00 Z
|
19
19
|
dependencies: []
|
20
20
|
|
21
21
|
description: Ruby binding for MySQL Binary log API.
|
@@ -57,6 +57,7 @@ files:
|
|
57
57
|
- ext/binlog.so
|
58
58
|
- ext/ruby_binlog_incident_event.cpp
|
59
59
|
- ext/ruby_binlog_table_map_event.o
|
60
|
+
- ext/test.rb
|
60
61
|
- README
|
61
62
|
homepage: https://bitbucket.org/winebarrel/ruby-binlog
|
62
63
|
licenses: []
|