~drizzle-trunk/drizzle/development

« back to all changes in this revision

Viewing changes to drizzled/field/datetime.cc

Merge Stewart

Show diffs side-by-side

added added

removed removed

Lines of Context:
134
134
    char tmp_string[MAX_DATE_STRING_REP_LENGTH];
135
135
    size_t tmp_string_len;
136
136
 
137
 
    temporal.to_string(tmp_string, &tmp_string_len);
 
137
    tmp_string_len= temporal.to_string(tmp_string, MAX_DATE_STRING_REP_LENGTH);
 
138
    assert(tmp_string_len < MAX_DATE_STRING_REP_LENGTH);
138
139
    my_error(ER_INVALID_DATETIME_VALUE, MYF(ME_FATALERROR), tmp_string);
139
140
    return 1;
140
141
  }
174
175
String *Field_datetime::val_str(String *val_buffer,
175
176
                                String *)
176
177
{
177
 
  val_buffer->alloc(field_length);
178
 
  val_buffer->length(field_length);
179
 
  uint64_t tmp;
180
 
  long part1,part2;
181
 
  char *pos;
182
 
  int part3;
 
178
  val_buffer->alloc(drizzled::DateTime::MAX_STRING_LENGTH);
 
179
  val_buffer->length(drizzled::DateTime::MAX_STRING_LENGTH);
 
180
  int64_t tmp;
183
181
 
184
182
#ifdef WORDS_BIGENDIAN
185
183
  if (table && table->s->db_low_byte_first)
188
186
#endif
189
187
    int64_tget(tmp,ptr);
190
188
 
191
 
  /*
192
 
    Avoid problem with slow int64_t arithmetic and sprintf
193
 
  */
194
 
 
195
 
  part1=(long) (tmp/INT64_C(1000000));
196
 
  part2=(long) (tmp - (uint64_t) part1*INT64_C(1000000));
197
 
 
198
 
  pos=(char*) val_buffer->ptr() + MAX_DATETIME_WIDTH;
199
 
  *pos--=0;
200
 
  *pos--= (char) ('0'+(char) (part2%10)); part2/=10;
201
 
  *pos--= (char) ('0'+(char) (part2%10)); part3= (int) (part2 / 10);
202
 
  *pos--= ':';
203
 
  *pos--= (char) ('0'+(char) (part3%10)); part3/=10;
204
 
  *pos--= (char) ('0'+(char) (part3%10)); part3/=10;
205
 
  *pos--= ':';
206
 
  *pos--= (char) ('0'+(char) (part3%10)); part3/=10;
207
 
  *pos--= (char) ('0'+(char) part3);
208
 
  *pos--= ' ';
209
 
  *pos--= (char) ('0'+(char) (part1%10)); part1/=10;
210
 
  *pos--= (char) ('0'+(char) (part1%10)); part1/=10;
211
 
  *pos--= '-';
212
 
  *pos--= (char) ('0'+(char) (part1%10)); part1/=10;
213
 
  *pos--= (char) ('0'+(char) (part1%10)); part3= (int) (part1/10);
214
 
  *pos--= '-';
215
 
  *pos--= (char) ('0'+(char) (part3%10)); part3/=10;
216
 
  *pos--= (char) ('0'+(char) (part3%10)); part3/=10;
217
 
  *pos--= (char) ('0'+(char) (part3%10)); part3/=10;
218
 
  *pos=(char) ('0'+(char) part3);
 
189
  drizzled::DateTime dt;
 
190
 
 
191
  /* TODO: add an assert that this succeeds
 
192
   * currently fails due to bug in allowing
 
193
   * ALTER TABLE to add a datetime column that's
 
194
   * not null without a default value.
 
195
   */
 
196
  dt.from_int64_t(tmp, false); /* NOTE: this does *NOT* attempt convertion
 
197
                                        from formats such as 20090101 as
 
198
                                        the stored value has already been
 
199
                                        converted.
 
200
                               */
 
201
 
 
202
  int rlen;
 
203
  rlen= dt.to_string((char*)val_buffer->ptr(), drizzled::DateTime::MAX_STRING_LENGTH);
 
204
  assert((rlen+1) <  drizzled::DateTime::MAX_STRING_LENGTH);
 
205
 
 
206
  val_buffer->length(rlen);
 
207
 
219
208
  return val_buffer;
220
209
}
221
210