~drizzle-trunk/drizzle/development

« back to all changes in this revision

Viewing changes to drizzled/rpl_utility.h

  • Committer: Monty Taylor
  • Date: 2008-08-02 01:03:15 UTC
  • mto: (236.1.42 codestyle)
  • mto: This revision was merged to the branch mainline in revision 261.
  • Revision ID: monty@inaugust.com-20080802010315-65h5938pymg9d99z
Moved m4 macros to top-level m4 dir, per GNU standards (and where gettext wanted it :)

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
/* -*- mode: c++; c-basic-offset: 2; indent-tabs-mode: nil; -*-
2
 
 *  vim:expandtab:shiftwidth=2:tabstop=2:smarttab:
3
 
 *
4
 
 *  Copyright (C) 2008 Sun Microsystems
5
 
 *
6
 
 *  This program is free software; you can redistribute it and/or modify
7
 
 *  it under the terms of the GNU General Public License as published by
8
 
 *  the Free Software Foundation; version 2 of the License.
9
 
 *
10
 
 *  This program is distributed in the hope that it will be useful,
11
 
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
12
 
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13
 
 *  GNU General Public License for more details.
14
 
 *
15
 
 *  You should have received a copy of the GNU General Public License
16
 
 *  along with this program; if not, write to the Free Software
17
 
 *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
18
 
 */
 
1
/* Copyright (C) 2006 MySQL AB
 
2
 
 
3
   This program is free software; you can redistribute it and/or modify
 
4
   it under the terms of the GNU General Public License as published by
 
5
   the Free Software Foundation; version 2 of the License.
 
6
 
 
7
   This program is distributed in the hope that it will be useful,
 
8
   but WITHOUT ANY WARRANTY; without even the implied warranty of
 
9
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
10
   GNU General Public License for more details.
 
11
 
 
12
   You should have received a copy of the GNU General Public License
 
13
   along with this program; if not, write to the Free Software
 
14
   Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA */
19
15
 
20
16
#ifndef RPL_UTILITY_H
21
17
#define RPL_UTILITY_H
22
18
 
23
 
#include <drizzled/server_includes.h>
24
 
#include <drizzled/table_list.h>
 
19
#ifndef __cplusplus
 
20
#error "Don't include this C++ header file from a non-C++ file!"
 
21
#endif
 
22
 
 
23
#include "mysql_priv.h"
25
24
 
26
25
class Relay_log_info;
27
26
 
59
58
    @param metadata_size Size of the field_metadata array
60
59
    @param null_bitmap The bitmap of fields that can be null
61
60
   */
62
 
  table_def(field_type *types, uint32_t size, unsigned char *field_metadata,
 
61
  table_def(field_type *types, uint32_t size, unsigned char *field_metadata, 
63
62
      int metadata_size, unsigned char *null_bitmap)
64
63
    : m_size(size), m_type(0), m_field_metadata_size(metadata_size),
65
64
      m_field_metadata(0), m_null_bits(0), m_memory(NULL)
81
80
      Extract the data from the table map into the field metadata array
82
81
      iff there is field metadata. The variable metadata_size will be
83
82
      0 if we are replicating from an older version server since no field
84
 
      metadata was written to the table map. This can also happen if
 
83
      metadata was written to the table map. This can also happen if 
85
84
      there were no fields in the master that needed extra metadata.
86
85
    */
87
86
    if (m_size && metadata_size)
88
 
    {
 
87
    { 
89
88
      int index= 0;
90
89
      for (unsigned int i= 0; i < m_size; i++)
91
90
      {
100
99
          index++;
101
100
          break;
102
101
        }
 
102
        case DRIZZLE_TYPE_SET:
103
103
        case DRIZZLE_TYPE_ENUM:
104
104
        {
105
105
          uint16_t x= field_metadata[index++] << 8U; // real_type
135
135
  }
136
136
 
137
137
  ~table_def() {
138
 
    free(m_memory);
 
138
    my_free(m_memory, MYF(0));
139
139
    m_type= 0;
140
140
    m_size= 0;
141
141
  }
169
169
    table map for a given field. If there is no metadata for that field
170
170
    or there is no extra metadata at all, the function returns 0.
171
171
 
172
 
    The function returns the value for the field metadata for column at
173
 
    position indicated by index. As mentioned, if the field was a type
174
 
    that stores field metadata, that value is returned else zero (0) is
175
 
    returned. This method is used in the unpack() methods of the
176
 
    corresponding fields to properly extract the data from the binary log
 
172
    The function returns the value for the field metadata for column at 
 
173
    position indicated by index. As mentioned, if the field was a type 
 
174
    that stores field metadata, that value is returned else zero (0) is 
 
175
    returned. This method is used in the unpack() methods of the 
 
176
    corresponding fields to properly extract the data from the binary log 
177
177
    in the event that the master's field is smaller than the slave.
178
178
  */
179
179
  uint16_t field_metadata(uint32_t index) const
189
189
    This function returns whether the field on the master can be null.
190
190
    This value is derived from field->maybe_null().
191
191
  */
192
 
  bool maybe_null(uint32_t index) const
 
192
  my_bool maybe_null(uint32_t index) const
193
193
  {
194
194
    assert(index < m_size);
195
 
    return ((m_null_bits[(index / 8)] &
 
195
    return ((m_null_bits[(index / 8)] & 
196
196
            (1 << (index % 8))) == (1 << (index %8)));
197
197
  }
198
198
 
199
199
  /*
200
200
    This function returns the field size in raw bytes based on the type
201
 
    and the encoded field data from the master's raw data. This method can
202
 
    be used for situations where the slave needs to skip a column (e.g.,
203
 
    WL#3915) or needs to advance the pointer for the fields in the raw
 
201
    and the encoded field data from the master's raw data. This method can 
 
202
    be used for situations where the slave needs to skip a column (e.g., 
 
203
    WL#3915) or needs to advance the pointer for the fields in the raw 
204
204
    data from the master to a specific column.
205
205
  */
206
206
  uint32_t calc_field_size(uint32_t col, unsigned char *master_data) const;
222
222
    @retval 1  if the table definition is not compatible with @c table
223
223
    @retval 0  if the table definition is compatible with @c table
224
224
  */
225
 
  int compatible_with(Relay_log_info const *rli, Table *table) const;
 
225
  int compatible_with(Relay_log_info const *rli, TABLE *table) const;
226
226
 
227
227
private:
228
228
  uint32_t m_size;           // Number of elements in the types array
237
237
   Extend the normal table list with a few new fields needed by the
238
238
   slave thread, but nowhere else.
239
239
 */
240
 
struct RPL_TableList
241
 
  : public TableList
 
240
struct RPL_TABLE_LIST
 
241
  : public TABLE_LIST
242
242
{
243
243
  bool m_tabledef_valid;
244
244
  table_def m_tabledef;
245
245
};
246
246
 
 
247
 
 
248
/* Anonymous namespace for template functions/classes */
 
249
namespace {
 
250
 
 
251
  /*
 
252
    Smart pointer that will automatically call my_afree (a macro) when
 
253
    the pointer goes out of scope.  This is used so that I do not have
 
254
    to remember to call my_afree() before each return.  There is no
 
255
    overhead associated with this, since all functions are inline.
 
256
 
 
257
    I (Matz) would prefer to use the free function as a template
 
258
    parameter, but that is not possible when the "function" is a
 
259
    macro.
 
260
  */
 
261
  template <class Obj>
 
262
  class auto_afree_ptr
 
263
  {
 
264
    Obj* m_ptr;
 
265
  public:
 
266
    auto_afree_ptr(Obj* ptr) : m_ptr(ptr) { }
 
267
    ~auto_afree_ptr() { if (m_ptr) my_afree(m_ptr); }
 
268
    void assign(Obj* ptr) {
 
269
      /* Only to be called if it hasn't been given a value before. */
 
270
      assert(m_ptr == NULL);
 
271
      m_ptr= ptr;
 
272
    }
 
273
    Obj* get() { return m_ptr; }
 
274
  };
 
275
 
 
276
}
 
277
 
247
278
#endif /* RPL_UTILITY_H */