25 #include <drizzled/algorithm/crc32.h>
26 #include <drizzled/gettext.h>
27 #include <drizzled/replication_services.h>
29 #include <sys/types.h>
36 #if TIME_WITH_SYS_TIME
37 # include <sys/time.h>
41 # include <sys/time.h>
47 #include <drizzled/message/transaction.pb.h>
49 #include <google/protobuf/io/coded_stream.h>
50 #include <google/protobuf/io/zero_copy_stream_impl.h>
52 #include <drizzled/gettext.h>
62 static uint32_t server_id= 1;
63 static uint64_t transaction_id= 1;
65 static uint64_t getNanoTimestamp()
67 #ifdef HAVE_CLOCK_GETTIME
69 clock_gettime(CLOCK_REALTIME, &tp);
70 return (uint64_t) tp.tv_sec * 10000000
71 + (uint64_t) tp.tv_nsec;
74 gettimeofday(&tv,NULL);
75 return (uint64_t) tv.tv_sec * 10000000
76 + (uint64_t) tv.tv_usec * 1000;
83 ctx->set_transaction_id(transaction_id++);
84 ctx->set_start_timestamp(getNanoTimestamp());
85 ctx->set_server_id(server_id);
91 ctx->set_end_timestamp(getNanoTimestamp());
98 statement->set_type(message::Statement::RAW_SQL);
99 statement->set_sql(
"CREATE TABLE t1 (a VARCHAR(32) NOT NULL, PRIMARY KEY a) ENGINE=InnoDB");
100 statement->set_start_timestamp(getNanoTimestamp());
101 statement->set_end_timestamp(getNanoTimestamp());
108 statement->set_type(message::Statement::RAW_SQL);
109 statement->set_sql(
"CREATE TABLE t2 (a INTEGER NOT NULL, PRIMARY KEY a) ENGINE=InnoDB");
110 statement->set_start_timestamp(getNanoTimestamp());
111 statement->set_end_timestamp(getNanoTimestamp());
118 statement->set_type(message::Statement::RAW_SQL);
119 statement->set_sql(
"CREATE TABLE t3 (a INTEGER NOT NULL, b BLOB NOT NULL, PRIMARY KEY a) ENGINE=InnoDB");
120 statement->set_start_timestamp(getNanoTimestamp());
121 statement->set_end_timestamp(getNanoTimestamp());
129 statement->set_type(message::Statement::INSERT);
130 statement->set_sql(
"INSERT INTO t1 (a) VALUES (\"1\"), (\"2\")");
131 statement->set_start_timestamp(getNanoTimestamp());
138 t_meta->set_schema_name(
"test");
139 t_meta->set_table_name(
"t1");
142 f_meta->set_name(
"a");
143 f_meta->set_type(message::Table::Field::VARCHAR);
147 data->set_segment_id(1);
148 data->set_end_segment(
true);
153 record1->add_insert_value(
"1");
154 record2->add_insert_value(
"2");
156 statement->set_end_timestamp(getNanoTimestamp());
164 statement->set_type(message::Statement::INSERT);
165 statement->set_sql(
"INSERT INTO t2 (a) VALUES (1), (2)");
166 statement->set_start_timestamp(getNanoTimestamp());
173 t_meta->set_schema_name(
"test");
174 t_meta->set_table_name(
"t2");
177 f_meta->set_name(
"a");
178 f_meta->set_type(message::Table::Field::INTEGER);
182 data->set_segment_id(1);
183 data->set_end_segment(
true);
188 record1->add_insert_value(
"1");
189 record2->add_insert_value(
"2");
191 statement->set_end_timestamp(getNanoTimestamp());
199 statement->set_type(message::Statement::INSERT);
200 statement->set_sql(
"INSERT INTO t3 (a, b) VALUES (1, 'test\0me')", 43);
201 statement->set_start_timestamp(getNanoTimestamp());
208 t_meta->set_schema_name(
"test");
209 t_meta->set_table_name(
"t3");
212 f_meta->set_name(
"a");
213 f_meta->set_type(message::Table::Field::INTEGER);
215 f_meta= header->add_field_metadata();
216 f_meta->set_name(
"b");
217 f_meta->set_type(message::Table::Field::BLOB);
221 data->set_segment_id(1);
222 data->set_end_segment(
true);
226 record1->add_insert_value(
"1");
227 record1->add_insert_value(
"test\0me", 7);
229 statement->set_end_timestamp(getNanoTimestamp());
237 statement->set_type(message::Statement::DELETE);
238 statement->set_sql(
"DELETE FROM t1 WHERE a = \"1\"");
239 statement->set_start_timestamp(getNanoTimestamp());
246 t_meta->set_schema_name(
"test");
247 t_meta->set_table_name(
"t1");
250 f_meta->set_name(
"a");
251 f_meta->set_type(message::Table::Field::VARCHAR);
255 data->set_segment_id(1);
256 data->set_end_segment(
true);
260 record1->add_key_value(
"1");
262 statement->set_end_timestamp(getNanoTimestamp());
270 statement->set_type(message::Statement::UPDATE);
271 statement->set_sql(
"UPDATE t1 SET a = \"5\" WHERE a = \"1\"");
272 statement->set_start_timestamp(getNanoTimestamp());
279 t_meta->set_schema_name(
"test");
280 t_meta->set_table_name(
"t1");
283 kf_meta->set_name(
"a");
284 kf_meta->set_type(message::Table::Field::VARCHAR);
287 sf_meta->set_name(
"a");
288 sf_meta->set_type(message::Table::Field::VARCHAR);
292 data->set_segment_id(1);
293 data->set_end_segment(
true);
297 record1->add_after_value(
"5");
298 record1->add_key_value(
"1");
300 statement->set_end_timestamp(getNanoTimestamp());
308 statement->set_type(message::Statement::UPDATE);
309 statement->set_sql(
"UPDATE t1 SET a = \"5\"");
310 statement->set_start_timestamp(getNanoTimestamp());
317 t_meta->set_schema_name(
"test");
318 t_meta->set_table_name(
"t1");
321 kf_meta->set_name(
"a");
322 kf_meta->set_type(message::Table::Field::VARCHAR);
325 sf_meta->set_name(
"a");
326 sf_meta->set_type(message::Table::Field::VARCHAR);
330 data->set_segment_id(1);
331 data->set_end_segment(
true);
336 record1->add_after_value(
"5");
337 record1->add_key_value(
"1");
338 record2->add_after_value(
"5");
339 record2->add_key_value(
"2");
341 statement->set_end_timestamp(getNanoTimestamp());
344 static void writeTransaction(protobuf::io::CodedOutputStream *output,
message::Transaction &transaction)
346 std::string buffer(
"");
347 finalizeTransactionContext(transaction);
348 transaction.SerializeToString(&buffer);
350 size_t length= buffer.length();
352 output->WriteLittleEndian32(static_cast<uint32_t>(ReplicationServices::TRANSACTION));
353 output->WriteLittleEndian32(static_cast<uint32_t>(length));
354 output->WriteString(buffer);
355 output->WriteLittleEndian32(drizzled::algorithm::crc32(buffer.c_str(), length));
358 int main(
int argc,
char* argv[])
360 GOOGLE_PROTOBUF_VERIFY_VERSION;
365 fprintf(stderr, _(
"Usage: %s TRANSACTION_LOG\n"), argv[0]);
369 if ((file= open(argv[1], O_APPEND|O_CREAT|O_SYNC|O_WRONLY, S_IRWXU)) == -1)
371 fprintf(stderr, _(
"Cannot open file: %s\n"), argv[1]);
375 protobuf::io::ZeroCopyOutputStream *raw_output=
new protobuf::io::FileOutputStream(file);
376 protobuf::io::CodedOutputStream *coded_output=
new protobuf::io::CodedOutputStream(raw_output);
382 initTransactionContext(transaction);
383 doCreateTable1(transaction);
384 writeTransaction(coded_output, transaction);
387 initTransactionContext(transaction);
388 doCreateTable2(transaction);
389 writeTransaction(coded_output, transaction);
393 initTransactionContext(transaction);
394 doSimpleInsert(transaction);
395 writeTransaction(coded_output, transaction);
399 initTransactionContext(transaction);
400 doSimpleDelete(transaction);
401 doSimpleUpdate(transaction);
402 writeTransaction(coded_output, transaction);
406 initTransactionContext(transaction);
407 doNonVarcharInsert(transaction);
408 writeTransaction(coded_output, transaction);
412 initTransactionContext(transaction);
413 doMultiKeyUpdate(transaction);
414 writeTransaction(coded_output, transaction);
418 initTransactionContext(transaction);
419 doCreateTable3(transaction);
420 doBlobInsert(transaction);
421 writeTransaction(coded_output, transaction);
TODO: Rename this file - func.h is stupid.