~drizzle-trunk/drizzle/development

« back to all changes in this revision

Viewing changes to drizzled/field/epoch.cc

  • Committer: Brian Aker
  • Date: 2010-12-31 02:23:39 UTC
  • mto: (2054.1.1 clean)
  • mto: This revision was merged to the branch mainline in revision 2049.
  • Revision ID: brian@tangent.org-20101231022339-g07ztt32wdwqdz46
Make it so that tables are sent not as raw but actual drop table commands to
the replication system.

Show diffs side-by-side

added added

removed removed

Lines of Context:
20
20
 
21
21
#include "config.h"
22
22
#include <boost/lexical_cast.hpp>
23
 
#include <drizzled/field/timestamp.h>
 
23
#include <drizzled/field/epoch.h>
24
24
#include <drizzled/error.h>
25
25
#include <drizzled/tztime.h>
26
26
#include <drizzled/table.h>
35
35
namespace drizzled
36
36
{
37
37
 
 
38
namespace field
 
39
{
 
40
 
38
41
/**
39
42
  TIMESTAMP type holds datetime values in range from 1970-01-01 00:00:01 UTC to
40
43
  2038-01-01 00:00:00 UTC stored as number of seconds since Unix
78
81
  course is non-standard.) In most cases user won't notice any change, only
79
82
  exception is different behavior of old/new timestamps during ALTER TABLE.
80
83
 */
81
 
Field_timestamp::Field_timestamp(unsigned char *ptr_arg,
82
 
                                 uint32_t,
83
 
                                 unsigned char *null_ptr_arg,
84
 
                                 unsigned char null_bit_arg,
85
 
                                 enum utype unireg_check_arg,
86
 
                                 const char *field_name_arg,
87
 
                                 TableShare *share,
88
 
                                 const CHARSET_INFO * const cs)
89
 
  :Field_str(ptr_arg,
90
 
             DateTime::MAX_STRING_LENGTH - 1 /* no \0 */,
91
 
             null_ptr_arg,
92
 
             null_bit_arg,
93
 
             field_name_arg,
94
 
             cs)
 
84
  Epoch::Epoch(unsigned char *ptr_arg,
 
85
               uint32_t,
 
86
               unsigned char *null_ptr_arg,
 
87
               unsigned char null_bit_arg,
 
88
               enum utype unireg_check_arg,
 
89
               const char *field_name_arg,
 
90
               drizzled::TableShare *share,
 
91
               const drizzled::CHARSET_INFO * const cs) :
 
92
  Field_str(ptr_arg,
 
93
            DateTime::MAX_STRING_LENGTH - 1 /* no \0 */,
 
94
            null_ptr_arg,
 
95
            null_bit_arg,
 
96
            field_name_arg,
 
97
            cs)
95
98
{
96
 
  /* For 4.0 MYD and 4.0 InnoDB compatibility */
97
 
  flags|= UNSIGNED_FLAG;
98
99
  unireg_check= unireg_check_arg;
99
100
  if (! share->getTimestampField() && unireg_check != NONE)
100
101
  {
106
107
  }
107
108
}
108
109
 
109
 
Field_timestamp::Field_timestamp(bool maybe_null_arg,
110
 
                                 const char *field_name_arg,
111
 
                                 const CHARSET_INFO * const cs)
112
 
  :Field_str((unsigned char*) NULL,
113
 
             DateTime::MAX_STRING_LENGTH - 1 /* no \0 */,
114
 
             maybe_null_arg ? (unsigned char*) "": 0,
115
 
             0,
116
 
             field_name_arg,
117
 
             cs)
 
110
Epoch::Epoch(bool maybe_null_arg,
 
111
             const char *field_name_arg,
 
112
             const CHARSET_INFO * const cs) :
 
113
  Field_str((unsigned char*) NULL,
 
114
            DateTime::MAX_STRING_LENGTH - 1 /* no \0 */,
 
115
            maybe_null_arg ? (unsigned char*) "": 0,
 
116
            0,
 
117
            field_name_arg,
 
118
            cs)
118
119
{
119
 
  /* For 4.0 MYD and 4.0 InnoDB compatibility */
120
 
  flags|= UNSIGNED_FLAG;
121
120
  if (unireg_check != TIMESTAMP_DN_FIELD)
122
121
    flags|= ON_UPDATE_NOW_FLAG;
123
122
}
128
127
  Returns value indicating during which operations this TIMESTAMP field
129
128
  should be auto-set to current timestamp.
130
129
*/
131
 
timestamp_auto_set_type Field_timestamp::get_auto_set_type() const
 
130
timestamp_auto_set_type Epoch::get_auto_set_type() const
132
131
{
133
132
  switch (unireg_check)
134
133
  {
156
155
  }
157
156
}
158
157
 
159
 
int Field_timestamp::store(const char *from,
160
 
                           uint32_t len,
161
 
                           const CHARSET_INFO * const )
 
158
int Epoch::store(const char *from,
 
159
                 uint32_t len,
 
160
                 const CHARSET_INFO * const )
162
161
{
163
162
  Timestamp temporal;
164
163
 
165
164
  ASSERT_COLUMN_MARKED_FOR_WRITE;
166
165
 
167
 
  if (! temporal.from_string(from, (size_t) len))
 
166
  if (not temporal.from_string(from, (size_t) len))
168
167
  {
169
168
    my_error(ER_INVALID_UNIX_TIMESTAMP_VALUE, MYF(ME_FATALERROR), from);
170
169
    return 1;
171
170
  }
172
171
 
173
172
  time_t tmp;
174
 
  temporal.to_time_t(&tmp);
 
173
  temporal.to_time_t(tmp);
175
174
 
176
 
  store_timestamp(tmp);
 
175
  pack_num(tmp);
177
176
  return 0;
178
177
}
179
178
 
180
 
int Field_timestamp::store(double from)
 
179
int Epoch::store(double from)
181
180
{
182
181
  ASSERT_COLUMN_MARKED_FOR_WRITE;
183
182
 
193
192
    my_error(ER_INVALID_UNIX_TIMESTAMP_VALUE, MYF(ME_FATALERROR), tmp.c_str());
194
193
    return 2;
195
194
  }
196
 
  return Field_timestamp::store((int64_t) rint(from), false);
 
195
  return Epoch::store((int64_t) rint(from), false);
197
196
}
198
197
 
199
 
int Field_timestamp::store(int64_t from, bool)
 
198
int Epoch::store(int64_t from, bool)
200
199
{
201
200
  ASSERT_COLUMN_MARKED_FOR_WRITE;
202
201
 
215
214
  }
216
215
 
217
216
  time_t tmp;
218
 
  temporal.to_time_t(&tmp);
219
 
 
220
 
  store_timestamp(tmp);
 
217
  temporal.to_time_t(tmp);
 
218
 
 
219
  pack_num(tmp);
 
220
 
221
221
  return 0;
222
222
}
223
223
 
224
 
double Field_timestamp::val_real(void)
 
224
double Epoch::val_real(void)
225
225
{
226
 
  return (double) Field_timestamp::val_int();
 
226
  return (double) Epoch::val_int();
227
227
}
228
228
 
229
 
int64_t Field_timestamp::val_int(void)
 
229
int64_t Epoch::val_int(void)
230
230
{
231
231
  uint64_t temp;
232
232
 
233
233
  ASSERT_COLUMN_MARKED_FOR_READ;
234
234
 
235
 
#ifdef WORDS_BIGENDIAN
236
 
  if (getTable() && getTable()->getShare()->db_low_byte_first)
237
 
    temp= uint8korr(ptr);
238
 
  else
239
 
#endif
240
 
    int64_tget(temp, ptr);
 
235
  unpack_num(temp);
241
236
 
242
237
  Timestamp temporal;
243
238
  (void) temporal.from_time_t((time_t) temp);
248
243
  return result;
249
244
}
250
245
 
251
 
String *Field_timestamp::val_str(String *val_buffer, String *)
 
246
String *Epoch::val_str(String *val_buffer, String *)
252
247
{
253
 
  uint64_t temp;
 
248
  uint64_t temp= 0;
254
249
  char *to;
255
250
  int to_len= field_length + 1;
256
251
 
257
252
  val_buffer->alloc(to_len);
258
253
  to= (char *) val_buffer->ptr();
259
254
 
260
 
#ifdef WORDS_BIGENDIAN
261
 
  if (getTable() && getTable()->getShare()->db_low_byte_first)
262
 
    temp= uint8korr(ptr);
263
 
  else
264
 
#endif
265
 
    int64_tget(temp, ptr);
 
255
  unpack_num(temp);
266
256
 
267
257
  val_buffer->set_charset(&my_charset_bin);     /* Safety */
268
258
 
277
267
  return val_buffer;
278
268
}
279
269
 
280
 
bool Field_timestamp::get_date(DRIZZLE_TIME *ltime, uint32_t)
 
270
bool Epoch::get_date(type::Time *ltime, uint32_t)
281
271
{
282
272
  uint64_t temp;
283
273
 
284
 
#ifdef WORDS_BIGENDIAN
285
 
  if (getTable() && getTable()->getShare()->db_low_byte_first)
286
 
    temp= uint8korr(ptr);
287
 
  else
288
 
#endif
289
 
    int64_tget(temp, ptr);
 
274
  unpack_num(temp);
290
275
  
291
276
  memset(ltime, 0, sizeof(*ltime));
292
277
 
293
278
  Timestamp temporal;
294
279
  (void) temporal.from_time_t((time_t) temp);
295
280
 
296
 
  /* @TODO Goodbye the below code when DRIZZLE_TIME is finally gone.. */
 
281
  /* @TODO Goodbye the below code when type::Time is finally gone.. */
297
282
 
298
283
  ltime->time_type= DRIZZLE_TIMESTAMP_DATETIME;
299
284
  ltime->year= temporal.years();
306
291
  return 0;
307
292
}
308
293
 
309
 
bool Field_timestamp::get_time(DRIZZLE_TIME *ltime)
310
 
{
311
 
  return Field_timestamp::get_date(ltime,0);
312
 
}
313
 
 
314
 
int Field_timestamp::cmp(const unsigned char *a_ptr, const unsigned char *b_ptr)
315
 
{
316
 
  int64_t a,b;
317
 
#ifdef WORDS_BIGENDIAN
318
 
  if (getTable() && getTable()->getShare()->db_low_byte_first)
319
 
  {
320
 
    a=sint8korr(a_ptr);
321
 
    b=sint8korr(b_ptr);
322
 
  }
323
 
  else
324
 
#endif
325
 
  {
326
 
    int64_tget(a, a_ptr);
327
 
    int64_tget(b, b_ptr);
328
 
  }
329
 
  return ((uint64_t) a < (uint64_t) b) ? -1 : ((uint64_t) a > (uint64_t) b) ? 1 : 0;
330
 
}
331
 
 
332
 
 
333
 
void Field_timestamp::sort_string(unsigned char *to,uint32_t )
 
294
bool Epoch::get_time(type::Time *ltime)
 
295
{
 
296
  return Epoch::get_date(ltime,0);
 
297
}
 
298
 
 
299
int Epoch::cmp(const unsigned char *a_ptr, const unsigned char *b_ptr)
 
300
{
 
301
  uint64_t a,b;
 
302
 
 
303
  unpack_num(a, a_ptr);
 
304
  unpack_num(b, b_ptr);
 
305
 
 
306
  return (a < b) ? -1 : (a > b) ? 1 : 0;
 
307
}
 
308
 
 
309
 
 
310
void Epoch::sort_string(unsigned char *to,uint32_t )
334
311
{
335
312
#ifdef WORDS_BIGENDIAN
336
313
  if (!getTable() || !getTable()->getShare()->db_low_byte_first)
358
335
  }
359
336
}
360
337
 
361
 
void Field_timestamp::sql_type(String &res) const
 
338
void Epoch::sql_type(String &res) const
362
339
{
363
340
  res.set_ascii(STRING_WITH_LEN("timestamp"));
364
341
}
365
342
 
366
 
void Field_timestamp::set_time()
 
343
void Epoch::set_time()
367
344
{
368
345
  Session *session= getTable() ? getTable()->in_use : current_session;
369
346
  time_t tmp= session->query_start();
370
347
  set_notnull();
371
 
  store_timestamp(tmp);
 
348
  pack_num(tmp);
372
349
}
373
350
 
374
 
void Field_timestamp::set_default()
 
351
void Epoch::set_default()
375
352
{
376
353
  if (getTable()->timestamp_field == this &&
377
354
      unireg_check != TIMESTAMP_UN_FIELD)
 
355
  {
378
356
    set_time();
 
357
  }
379
358
  else
 
359
  {
380
360
    Field::set_default();
 
361
  }
381
362
}
382
363
 
383
 
long Field_timestamp::get_timestamp(bool *null_value)
 
364
long Epoch::get_timestamp(bool *null_value)
384
365
{
385
366
  if ((*null_value= is_null()))
386
367
    return 0;
387
 
#ifdef WORDS_BIGENDIAN
388
 
  if (getTable() && getTable()->getShare()->db_low_byte_first)
389
 
    return sint8korr(ptr);
390
 
#endif
391
 
  int64_t tmp;
392
 
  int64_tget(tmp, ptr);
393
 
  return tmp;
 
368
 
 
369
  uint64_t tmp;
 
370
  return unpack_num(tmp);
394
371
}
395
372
 
396
 
void Field_timestamp::store_timestamp(int64_t timestamp)
 
373
size_t Epoch::max_string_length()
397
374
{
398
 
#ifdef WORDS_BIGENDIAN
399
 
  if (getTable() && getTable()->getShare()->db_low_byte_first)
400
 
  {
401
 
    int8store(ptr, timestamp);
402
 
  }
403
 
  else
404
 
#endif
405
 
    int64_tstore(ptr, timestamp);
 
375
  return sizeof(uint64_t);
406
376
}
407
377
 
 
378
} /* namespace field */
408
379
} /* namespace drizzled */