~drizzle-trunk/drizzle/development

« back to all changes in this revision

Viewing changes to drizzled/replication_services.h

Style changes.

Show diffs side-by-side

added added

removed removed

Lines of Context:
27
27
 
28
28
#include "drizzled/atomics.h"
29
29
 
30
 
#include "drizzled/message/transaction.pb.h"
31
 
 
32
30
#include <vector>
33
31
 
34
32
namespace drizzled
43
41
  class TransactionReplicator;
44
42
  class TransactionApplier;
45
43
}
 
44
namespace message
 
45
{
 
46
  class Transaction;
 
47
}
46
48
 
47
49
/**
48
50
 * This is a class which manages transforming internal 
52
54
class ReplicationServices
53
55
{
54
56
public:
55
 
  static const size_t DEFAULT_RECORD_SIZE= 100;
56
57
  typedef uint64_t GlobalTransactionId;
57
58
  /**
58
59
   * Types of messages that can go in the transaction
90
91
   * This method properly sets the is_active member variable.
91
92
   */
92
93
  void evaluateActivePlugins();
93
 
  /**
94
 
   * Helper method which returns the active Transaction message
95
 
   * for the supplied Session.  If one is not found, a new Transaction
96
 
   * message is allocated, initialized, and returned.
97
 
   *
98
 
   * @param The session processing the transaction
99
 
   */
100
 
  message::Transaction *getActiveTransaction(Session *in_session) const;
101
 
  /** 
102
 
   * Helper method which attaches a transaction context
103
 
   * the supplied transaction based on the supplied Session's
104
 
   * transaction information.  This method also ensure the
105
 
   * transaction message is attached properly to the Session object
106
 
   *
107
 
   * @param The transaction message to initialize
108
 
   * @param The Session processing this transaction
109
 
   */
110
 
  void initTransaction(message::Transaction &in_command, Session *in_session) const;
111
 
  /** 
112
 
   * Helper method which finalizes data members for the 
113
 
   * supplied transaction's context.
114
 
   *
115
 
   * @param The transaction message to finalize 
116
 
   * @param The Session processing this transaction
117
 
   */
118
 
  void finalizeTransaction(message::Transaction &in_command, Session *in_session) const;
119
 
  /**
120
 
   * Helper method which deletes transaction memory and
121
 
   * unsets Session's transaction and statement messages.
122
 
   */
123
 
  void cleanupTransaction(message::Transaction *in_transaction,
124
 
                          Session *in_session) const;
125
 
  /**
126
 
   * Returns true if the transaction contains any Statement
127
 
   * messages which are not end segments (i.e. a bulk statement has
128
 
   * previously been sent to replicators).
129
 
   *
130
 
   * @param The transaction to check
131
 
   */
132
 
  bool transactionContainsBulkSegment(const message::Transaction &transaction) const;
133
 
  /**
134
 
   * Helper method which initializes a Statement message
135
 
   *
136
 
   * @param The statement to initialize
137
 
   * @param The type of the statement
138
 
   * @param The session processing this statement
139
 
   */
140
 
  void initStatement(message::Statement &statement,
141
 
                     message::Statement::Type in_type,
142
 
                     Session *in_session) const;
143
 
  /**
144
 
   * Helper method which returns an initialized Statement
145
 
   * message for methods doing insertion of data.
146
 
   *
147
 
   * @param[in] Pointer to the Session doing the processing
148
 
   * @param[in] Pointer to the Table object being inserted into
149
 
   */
150
 
  message::Statement &getInsertStatement(Session *in_session,
151
 
                                         Table *in_table) const;
152
 
 
153
 
  /**
154
 
   * Helper method which initializes the header message for
155
 
   * insert operations.
156
 
   *
157
 
   * @param[inout] Statement message container to modify
158
 
   * @param[in] Pointer to the Session doing the processing
159
 
   * @param[in] Pointer to the Table being inserted into
160
 
   */
161
 
  void setInsertHeader(message::Statement &statement,
162
 
                       Session *in_session,
163
 
                       Table *in_table) const;
164
 
  /**
165
 
   * Helper method which returns an initialized Statement
166
 
   * message for methods doing updates of data.
167
 
   *
168
 
   * @param[in] Pointer to the Session doing the processing
169
 
   * @param[in] Pointer to the Table object being updated
170
 
   * @param[in] Pointer to the old data in the record
171
 
   * @param[in] Pointer to the new data in the record
172
 
   */
173
 
  message::Statement &getUpdateStatement(Session *in_session,
174
 
                                         Table *in_table,
175
 
                                         const unsigned char *old_record, 
176
 
                                         const unsigned char *new_record) const;
177
 
  /**
178
 
   * Helper method which initializes the header message for
179
 
   * update operations.
180
 
   *
181
 
   * @param[inout] Statement message container to modify
182
 
   * @param[in] Pointer to the Session doing the processing
183
 
   * @param[in] Pointer to the Table being updated
184
 
   * @param[in] Pointer to the old data in the record
185
 
   * @param[in] Pointer to the new data in the record
186
 
   */
187
 
  void setUpdateHeader(message::Statement &statement,
188
 
                       Session *in_session,
189
 
                       Table *in_table,
190
 
                       const unsigned char *old_record, 
191
 
                       const unsigned char *new_record) const;
192
 
  /**
193
 
   * Helper method which returns an initialized Statement
194
 
   * message for methods doing deletion of data.
195
 
   *
196
 
   * @param[in] Pointer to the Session doing the processing
197
 
   * @param[in] Pointer to the Table object being deleted from
198
 
   */
199
 
  message::Statement &getDeleteStatement(Session *in_session,
200
 
                                         Table *in_table) const;
201
 
 
202
 
  /**
203
 
   * Helper method which initializes the header message for
204
 
   * insert operations.
205
 
   *
206
 
   * @param[inout] Statement message container to modify
207
 
   * @param[in] Pointer to the Session doing the processing
208
 
   * @param[in] Pointer to the Table being deleted from
209
 
   */
210
 
  void setDeleteHeader(message::Statement &statement,
211
 
                       Session *in_session,
212
 
                       Table *in_table) const;
213
 
  /**
214
 
   * Helper method which pushes a constructed message out
215
 
   * to the registered replicator and applier plugins.
 
94
public:
 
95
  /** 
 
96
   * Helper method which pushes a constructed message out to the registered
 
97
   * replicator and applier plugins.
216
98
   *
217
99
   * @param Message to push out
218
100
   */
219
 
  void push(message::Transaction &to_push);
220
 
public:
 
101
  void pushTransactionMessage(message::Transaction &to_push);
221
102
  /**
222
103
   * Constructor
223
104
   */
267
148
   * @param Pointer to the applier to detach
268
149
   */
269
150
  void detachApplier(plugin::TransactionApplier *in_applier);
270
 
  /**
271
 
   * Commits a normal transaction (see above) and pushes the
272
 
   * transaction message out to the replicators.
273
 
   *
274
 
   * @param Pointer to the Session committing the transaction
275
 
   */
276
 
  void commitTransaction(Session *in_session);
277
 
  /**
278
 
   * Marks the current active transaction message as being rolled
279
 
   * back and pushes the transaction message out to replicators.
280
 
   *
281
 
   * @param Pointer to the Session committing the transaction
282
 
   */
283
 
  void rollbackTransaction(Session *in_session);
284
 
  /**
285
 
   * Finalizes a Statement message and sets the Session's statement
286
 
   * message to NULL.
287
 
   *
288
 
   * @param The statement to initialize
289
 
   * @param The session processing this statement
290
 
   */
291
 
  void finalizeStatement(message::Statement &statement,
292
 
                         Session *in_session) const;
293
 
  /**
294
 
   * Creates a new InsertRecord GPB message and pushes it to
295
 
   * replicators.
296
 
   *
297
 
   * @param Pointer to the Session which has inserted a record
298
 
   * @param Pointer to the Table containing insert information
299
 
   *
300
 
   * Grr, returning "true" here on error because of the cursor
301
 
   * reversed bool return crap...fix that.
302
 
   */
303
 
  bool insertRecord(Session *in_session, Table *in_table);
304
 
  /**
305
 
   * Creates a new UpdateRecord GPB message and pushes it to
306
 
   * replicators.
307
 
   *
308
 
   * @param Pointer to the Session which has updated a record
309
 
   * @param Pointer to the Table containing update information
310
 
   * @param Pointer to the raw bytes representing the old record/row
311
 
   * @param Pointer to the raw bytes representing the new record/row 
312
 
   */
313
 
  void updateRecord(Session *in_session, 
314
 
                    Table *in_table, 
315
 
                    const unsigned char *old_record, 
316
 
                    const unsigned char *new_record);
317
 
  /**
318
 
   * Creates a new DeleteRecord GPB message and pushes it to
319
 
   * replicators.
320
 
   *
321
 
   * @param Pointer to the Session which has deleted a record
322
 
   * @param Pointer to the Table containing delete information
323
 
   */
324
 
  void deleteRecord(Session *in_session, Table *in_table);
325
 
  /**
326
 
   * Creates a CreateSchema Statement GPB message and adds it
327
 
   * to the Session's active Transaction GPB message for pushing
328
 
   * out to the replicator streams.
329
 
   *
330
 
   * @param[in] Pointer to the Session which issued the statement
331
 
   * @param[in] message::Schema message describing new schema
332
 
   */
333
 
  void createSchema(Session *in_session, const message::Schema &schema);
334
 
  /**
335
 
   * Creates a DropSchema Statement GPB message and adds it
336
 
   * to the Session's active Transaction GPB message for pushing
337
 
   * out to the replicator streams.
338
 
   *
339
 
   * @param[in] Pointer to the Session which issued the statement
340
 
   * @param[in] message::Schema message describing new schema
341
 
   */
342
 
  void dropSchema(Session *in_session, const std::string &schema_name);
343
 
  /**
344
 
   * Creates a CreateTable Statement GPB message and adds it
345
 
   * to the Session's active Transaction GPB message for pushing
346
 
   * out to the replicator streams.
347
 
   *
348
 
   * @param[in] Pointer to the Session which issued the statement
349
 
   * @param[in] message::Table message describing new schema
350
 
   */
351
 
  void createTable(Session *in_session, const message::Table &table);
352
 
  /**
353
 
   * Creates a DropTable Statement GPB message and adds it
354
 
   * to the Session's active Transaction GPB message for pushing
355
 
   * out to the replicator streams.
356
 
   *
357
 
   * @param[in] Pointer to the Session which issued the statement
358
 
   * @param[in] The schema of the table being dropped
359
 
   * @param[in] The table name of the table being dropped
360
 
   * @param[in] Did the user specify an IF EXISTS clause?
361
 
   */
362
 
  void dropTable(Session *in_session,
363
 
                     const std::string &schema_name,
364
 
                     const std::string &table_name,
365
 
                     bool if_exists);
366
 
  /**
367
 
   * Creates a TruncateTable Statement GPB message and adds it
368
 
   * to the Session's active Transaction GPB message for pushing
369
 
   * out to the replicator streams.
370
 
   *
371
 
   * @param[in] Pointer to the Session which issued the statement
372
 
   * @param[in] The Table being truncated
373
 
   */
374
 
  void truncateTable(Session *in_session, Table *in_table);
375
 
  /**
376
 
   * Creates a new RawSql GPB message and pushes it to 
377
 
   * replicators.
378
 
   *
379
 
   * @TODO With a real data dictionary, this really shouldn't
380
 
   * be needed.  CREATE TABLE would map to insertRecord call
381
 
   * on the I_S, etc.  Not sure what to do with administrative
382
 
   * commands like CHECK TABLE, though..
383
 
   *
384
 
   * @param Pointer to the Session which issued the statement
385
 
   * @param Query string
386
 
   */
387
 
  void rawStatement(Session *in_session, const std::string &query);
388
 
  /**
389
 
   * Returns the timestamp of the last Transaction which was sent to 
390
 
   * an applier.
 
151
  /** Returns the timestamp of the last Transaction which was sent to an
 
152
   * applier.
391
153
   */
392
154
  uint64_t getLastAppliedTimestamp() const;
393
155
};