73
76
error = que_eval_sql(info,
74
77
"PROCEDURE CREATE_SYS_REPLICATION_LOG_PROC () IS\n"
76
"CREATE TABLE SYS_REPLICATION_LOG(ID BINARY(8), SEGID BINARY(4), MESSAGE BLOB);\n"
77
"CREATE UNIQUE CLUSTERED INDEX ID_IND ON SYS_REPLICATION_LOG (ID);\n"
79
"CREATE TABLE SYS_REPLICATION_LOG(ID INT(8), SEGID INT, COMMIT_ID INT(8), END_TIMESTAMP INT(8), MESSAGE_LEN INT, MESSAGE BLOB);\n"
80
"CREATE UNIQUE CLUSTERED INDEX PRIMARY ON SYS_REPLICATION_LOG (ID, SEGID);\n"
81
"CREATE INDEX COMMIT_IDX ON SYS_REPLICATION_LOG (COMMIT_ID, ID);\n"
112
UNIV_INTERN int read_replication_log_table_message(const char* table_name, drizzled::message::Table *table_message)
114
std::string search_string(table_name);
115
boost::algorithm::to_lower(search_string);
117
if (search_string.compare("sys_replication_log") != 0)
120
drizzled::message::Engine *engine= table_message->mutable_engine();
121
engine->set_name("InnoDB");
122
table_message->set_name("SYS_REPLICATION_LOG");
123
table_message->set_schema("DATA_DICTIONARY");
124
table_message->set_type(drizzled::message::Table::STANDARD);
125
table_message->set_creation_timestamp(0);
126
table_message->set_update_timestamp(0);
128
drizzled::message::Table::TableOptions *options= table_message->mutable_options();
129
options->set_collation_id(drizzled::my_charset_bin.number);
130
options->set_collation(drizzled::my_charset_bin.name);
132
drizzled::message::Table::Field *field= table_message->add_field();
133
field->set_name("ID");
134
field->set_type(drizzled::message::Table::Field::BIGINT);
136
field= table_message->add_field();
137
field->set_name("SEGID");
138
field->set_type(drizzled::message::Table::Field::INTEGER);
140
field= table_message->add_field();
141
field->set_name("COMMIT_ID");
142
field->set_type(drizzled::message::Table::Field::BIGINT);
144
field= table_message->add_field();
145
field->set_name("END_TIMESTAMP");
146
field->set_type(drizzled::message::Table::Field::BIGINT);
148
field= table_message->add_field();
149
field->set_name("MESSAGE_LEN");
150
field->set_type(drizzled::message::Table::Field::INTEGER);
152
field= table_message->add_field();
153
field->set_name("MESSAGE");
154
field->set_type(drizzled::message::Table::Field::BLOB);
155
drizzled::message::Table::Field::StringFieldOptions *stropt= field->mutable_string_options();
156
stropt->set_collation_id(drizzled::my_charset_bin.number);
157
stropt->set_collation(drizzled::my_charset_bin.name);
159
drizzled::message::Table::Index *index= table_message->add_indexes();
160
index->set_name("PRIMARY");
161
index->set_is_primary(true);
162
index->set_is_unique(true);
163
index->set_type(drizzled::message::Table::Index::BTREE);
164
index->set_key_length(8);
165
drizzled::message::Table::Index::IndexPart *part= index->add_index_part();
166
part->set_fieldnr(0);
167
part->set_compare_length(8);
168
part= index->add_index_part();
169
part->set_fieldnr(1);
170
part->set_compare_length(4);
172
index= table_message->add_indexes();
173
index->set_name("COMMIT_IDX");
174
index->set_is_primary(false);
175
index->set_is_unique(false);
176
index->set_type(drizzled::message::Table::Index::BTREE);
177
index->set_key_length(8);
178
part= index->add_index_part();
179
part->set_fieldnr(2);
180
part->set_compare_length(8);
181
part= index->add_index_part();
182
part->set_fieldnr(0);
183
part->set_compare_length(8);
108
188
extern dtuple_t* row_get_prebuilt_insert_row(row_prebuilt_t* prebuilt);
110
190
ulint insert_replication_message(const char *message, size_t size,
111
trx_t *trx, uint64_t trx_id, uint32_t seg_id)
191
trx_t *trx, uint64_t trx_id,
192
uint64_t end_timestamp, bool is_end_segment,
114
196
row_prebuilt_t* prebuilt; /* For reading rows */
115
197
dict_table_t *table;
118
201
table = dict_table_get("SYS_REPLICATION_LOG",TRUE);
140
223
dtuple_t* dtuple= row_get_prebuilt_insert_row(prebuilt);
141
224
dfield_t *dfield;
142
226
dfield = dtuple_get_nth_field(dtuple, 0);
144
dfield_set_data(dfield, &trx_id, 8);
227
data= static_cast<byte*>(mem_heap_alloc(prebuilt->heap, 8));
228
row_mysql_store_col_in_innobase_format(dfield, data, TRUE, (byte*)&trx_id, 8, dict_table_is_comp(prebuilt->table));
229
dfield_set_data(dfield, data, 8);
146
231
dfield = dtuple_get_nth_field(dtuple, 1);
147
dfield_set_data(dfield, &seg_id, 4);
233
data= static_cast<byte*>(mem_heap_alloc(prebuilt->heap, 4));
234
row_mysql_store_col_in_innobase_format(dfield, data, TRUE, (byte*)&seg_id, 4, dict_table_is_comp(prebuilt->table));
235
dfield_set_data(dfield, data, 4);
237
uint64_t commit_id= 0;
240
commit_id= trx_sys_commit_id.increment();
149
243
dfield = dtuple_get_nth_field(dtuple, 2);
244
data= static_cast<byte*>(mem_heap_alloc(prebuilt->heap, 8));
245
row_mysql_store_col_in_innobase_format(dfield, data, TRUE, (byte*)&commit_id, 8, dict_table_is_comp(prebuilt->table));
246
dfield_set_data(dfield, data, 8);
248
dfield = dtuple_get_nth_field(dtuple, 3);
249
data= static_cast<byte*>(mem_heap_alloc(prebuilt->heap, 8));
250
row_mysql_store_col_in_innobase_format(dfield, data, TRUE, (byte*)&end_timestamp, 8, dict_table_is_comp(prebuilt->table));
251
dfield_set_data(dfield, data, 8);
253
dfield = dtuple_get_nth_field(dtuple, 4);
254
data= static_cast<byte*>(mem_heap_alloc(prebuilt->heap, 4));
255
row_mysql_store_col_in_innobase_format(dfield, data, TRUE, (byte*)&size, 4, dict_table_is_comp(prebuilt->table));
256
dfield_set_data(dfield, data, 4);
258
dfield = dtuple_get_nth_field(dtuple, 5);
150
259
dfield_set_data(dfield, message, size);
152
261
ins_node_t* node = prebuilt->ins_node;
226
335
// Store transaction id
227
336
field = rec_get_nth_field_old(rec, 0, &len);
228
ret.id= *(uint64_t *)field;
338
convert_to_mysql_format(idbyte, field, 8);
339
ret.id= *(uint64_t *)idbyte;
230
341
// Store segment id
231
field = rec_get_nth_field_old(rec, 3, &len);
232
ret.seg_id= *(uint32_t *)field;
342
field = rec_get_nth_field_old(rec, 1, &len);
344
convert_to_mysql_format(segbyte, field, 4);
345
ret.seg_id= *(uint32_t *)segbyte;
347
field = rec_get_nth_field_old(rec, 4, &len);
349
convert_to_mysql_format(commitbyte, field, 8);
350
ret.commit_id= *(uint64_t *)commitbyte;
352
field = rec_get_nth_field_old(rec, 5, &len);
353
byte timestampbyte[8];
354
convert_to_mysql_format(timestampbyte, field, 8);
355
ret.end_timestamp= *(uint64_t *)timestampbyte;
234
357
// Handler message
235
field = rec_get_nth_field_old(rec, 4, &len);
358
field = rec_get_nth_field_old(rec, 7, &len);
236
359
ret.message= (char *)field;
237
360
ret.message_length= len;