16
16
#define DRIZZLE_SERVER 1 /* for session variable max_allowed_packet */
17
17
#include <drizzled/server_includes.h>
18
#include <drizzled/gettext.h>
18
19
#include <drizzled/session.h>
19
20
#include <drizzled/error.h>
20
21
#include <drizzled/item/strfunc.h>
21
22
#include <drizzled/plugin_replicator.h>
23
static char anchor[100];
25
static bool statement(Session *, const char *query, size_t query_length)
23
#include <drizzled/serialize/serialize.h>
30
static bool isEnabled;
31
static char *log_directory= NULL;
34
static bool write_to_disk(int file, drizzle::EventList *list)
27
fprintf(stderr, "STATEMENT: %.*s\n", (uint32_t)query_length, query);
40
list->SerializePartialToString(&buffer);
42
length= buffer.length();
44
cout << "Writing record of " << length << "." << endl;
46
if ((written= write(file, &length, sizeof(uint64_t))) != sizeof(uint64_t))
48
cerr << "Only wrote " << written << " out of " << length << "." << endl;
52
if ((written= write(file, buffer.c_str(), length)) != length)
54
cerr << "Only wrote " << written << " out of " << length << "." << endl;
61
static bool statement(Session *session, const char *query, size_t)
63
using namespace drizzle;
65
drizzle::EventList list;
67
if (isEnabled == false)
69
cerr << "Got into statement" <<endl;
71
drizzle::Event *record= list.add_event();
72
record->set_type(Event::DDL);
73
record->set_autocommit(true);
74
record->set_server_id("localhost");
75
record->set_query_id(10);
76
record->set_transaction_id("junk");
77
record->set_schema(session->db);
78
record->set_sql(query);
80
return write_to_disk(log_file, &list);
32
83
static bool session_init(Session *session)
34
fprintf(stderr, "Starting Session\n");
35
session->setReplicationData(anchor);
85
using namespace drizzle;
87
if (isEnabled == false)
90
drizzle::EventList *list= new drizzle::EventList;
91
session->setReplicationData(list);
93
drizzle::Event *record= list->add_event();
95
record->set_type(Event::DDL);
96
record->set_autocommit(true);
97
record->set_server_id("localhost");
98
record->set_query_id(10);
99
record->set_transaction_id("junk");
100
record->set_schema(session->db);
101
record->set_sql("BEGIN");
40
106
static bool row_insert(Session *session, Table *)
42
fprintf(stderr, "INSERT: %.*s\n", (uint32_t)session->query_length, session->query);
108
using namespace drizzle;
110
if (isEnabled == false)
113
drizzle::EventList *list= (drizzle::EventList *)session->getReplicationData();
114
drizzle::Event *record= list->add_event();
116
record->set_type(Event::INSERT);
117
record->set_autocommit(true);
118
record->set_server_id("localhost");
119
record->set_query_id(10);
120
record->set_transaction_id("junk");
121
record->set_schema(session->db);
122
record->set_sql(session->query);
48
128
const unsigned char *,
49
129
const unsigned char *)
51
fprintf(stderr, "UPDATE: %.*s\n", (uint32_t)session->query_length, session->query);
131
using namespace drizzle;
133
if (isEnabled == false)
136
drizzle::EventList *list= (drizzle::EventList *)session->getReplicationData();
137
drizzle::Event *record= list->add_event();
139
record->set_type(Event::UPDATE);
140
record->set_autocommit(true);
141
record->set_server_id("localhost");
142
record->set_query_id(10);
143
record->set_transaction_id("junk");
144
record->set_schema(session->db);
145
record->set_sql(session->query);
56
150
static bool row_delete(Session *session, Table *)
58
fprintf(stderr, "DELETE: %.*s\n", (uint32_t)session->query_length, session->query);
152
using namespace drizzle;
154
if (isEnabled == false)
157
drizzle::EventList *list= (drizzle::EventList *)session->getReplicationData();
158
drizzle::Event *record= list->add_event();
160
record->set_type(Event::DELETE);
161
record->set_autocommit(true);
162
record->set_server_id("localhost");
163
record->set_query_id(10);
164
record->set_transaction_id("junk");
165
record->set_schema(session->db);
166
record->set_sql(session->query);
63
171
static bool end_transaction(Session *session, bool autocommit, bool commit)
174
using namespace drizzle;
176
if (isEnabled == false)
179
cerr << "Got into end" <<endl;
181
drizzle::EventList *list= (drizzle::EventList *)session->getReplicationData();
182
drizzle::Event *record= list->add_event();
184
record->set_type(Event::DELETE);
185
record->set_autocommit(true);
186
record->set_server_id("localhost");
187
record->set_query_id(10);
188
record->set_transaction_id("junk");
189
record->set_schema(session->db);
68
fprintf(stderr, "COMMIT\n");
194
record->set_sql("COMMIT");
70
fprintf(stderr, "AUTOCOMMIT\n");
196
record->set_sql("AUTOCOMMIT");
73
fprintf(stderr, "ROLLBACK\n");
199
record->set_sql("ROLLBACK");
201
error= write_to_disk(log_file, list);
75
203
session->setReplicationData(NULL);
80
209
static int init(void *p)
88
217
repl->row_update= row_update;
89
218
repl->end_transaction= end_transaction;
226
logname.append(log_directory ? log_directory : "/tmp");
227
logname.append("/replication_log");
229
if ((log_file= open(logname.c_str(), O_TRUNC|O_CREAT|O_SYNC|O_WRONLY, S_IRWXU)) == -1)
231
cerr << "Can not open file: " << logname.c_str() << endl;
239
static int deinit(void *)
247
static DRIZZLE_SYSVAR_BOOL(
251
N_("Enable Replicator"),
252
NULL, /* check func */
253
NULL, /* update func */
254
false /* default */);
256
static DRIZZLE_SYSVAR_STR(
260
N_("Directory to place replication logs."),
261
NULL, /* check func */
262
NULL, /* update func*/
265
static struct st_mysql_sys_var* system_variables[]= {
266
DRIZZLE_SYSVAR(directory),
267
DRIZZLE_SYSVAR(enabled),
94
271
mysql_declare_plugin(replicator)
100
277
"Basic replication module",
101
278
PLUGIN_LICENSE_GPL,
102
279
init, /* Plugin Init */
103
NULL, /* Plugin Deinit */
280
deinit, /* Plugin Deinit */
104
281
NULL, /* status variables */
105
NULL, /* system variables */
282
system_variables, /* system variables */
106
283
NULL /* config options */
108
285
mysql_declare_plugin_end;