1
1
/* -*- mode: c++; c-basic-offset: 2; indent-tabs-mode: nil; -*-
2
2
* vim:expandtab:shiftwidth=2:tabstop=2:smarttab:
4
* Copyright (C) 2010 Brian Aker
4
5
* Copyright (C) 2008 MySQL
6
7
* This program is free software; you can redistribute it and/or modify
31
32
#include "drizzled/field/str.h"
32
33
#include "drizzled/field/num.h"
33
34
#include "drizzled/field/blob.h"
35
#include "drizzled/field/boolean.h"
34
36
#include "drizzled/field/enum.h"
35
37
#include "drizzled/field/null.h"
36
38
#include "drizzled/field/date.h"
40
42
#include "drizzled/field/int32.h"
41
43
#include "drizzled/field/int64.h"
42
44
#include "drizzled/field/num.h"
43
#include "drizzled/field/timestamp.h"
45
#include "drizzled/field/time.h"
46
#include "drizzled/field/epoch.h"
44
47
#include "drizzled/field/datetime.h"
48
#include "drizzled/field/microtime.h"
45
49
#include "drizzled/field/varstring.h"
46
50
#include "drizzled/field/uuid.h"
47
51
#include "drizzled/time_functions.h"
795
976
field->decimals= 0;
798
int64_t Field::convert_decimal2int64_t(const my_decimal *val, bool, int *err)
979
int64_t Field::convert_decimal2int64_t(const type::Decimal *val, bool, int *err)
801
if (warn_if_overflow(my_decimal2int(E_DEC_ERROR &
982
if (warn_if_overflow(val->val_int32(E_DEC_ERROR &
802
983
~E_DEC_OVERFLOW & ~E_DEC_TRUNCATED,
805
986
i= (val->sign() ? INT64_MIN : INT64_MAX);
829
1010
return copy->length+ store_length;
832
bool Field::get_date(DRIZZLE_TIME *ltime,uint32_t fuzzydate)
1013
bool Field::get_date(type::Time *ltime,uint32_t fuzzydate)
835
1016
String tmp(buff,sizeof(buff),&my_charset_bin),*res;
845
bool Field::get_time(DRIZZLE_TIME *ltime)
1026
bool Field::get_time(type::Time *ltime)
848
1029
String tmp(buff,sizeof(buff),&my_charset_bin),*res;
858
int Field::store_time(DRIZZLE_TIME *ltime, enum enum_drizzle_timestamp_type)
1039
int Field::store_time(type::Time *ltime, enum enum_drizzle_timestamp_type)
860
1041
char buff[MAX_DATE_STRING_REP_LENGTH];
861
1042
uint32_t length= (uint32_t) my_TIME_to_str(ltime, buff);
931
1112
if (!Field::eq_def(field))
933
1115
TYPELIB *from_lib=((Field_enum*) field)->typelib;
935
1117
if (typelib->count < from_lib->count)
937
1120
for (uint32_t i=0 ; i < from_lib->count ; i++)
938
1122
if (my_strnncoll(field_charset,
939
1123
(const unsigned char*)typelib->type_names[i],
940
1124
strlen(typelib->type_names[i]),
941
1125
(const unsigned char*)from_lib->type_names[i],
942
1126
strlen(from_lib->type_names[i])))
950
1136
case DRIZZLE_TYPE_VARCHAR: return (length + (length < 256 ? 1: 2));
951
1137
case DRIZZLE_TYPE_UUID: return field::Uuid::max_string_length();
1138
case DRIZZLE_TYPE_MICROTIME: return field::Microtime::max_string_length();
1139
case DRIZZLE_TYPE_TIMESTAMP: return field::Epoch::max_string_length();
1140
case DRIZZLE_TYPE_BOOLEAN: return field::Boolean::max_string_length();
952
1141
case DRIZZLE_TYPE_DATE:
953
1142
case DRIZZLE_TYPE_ENUM:
954
1143
case DRIZZLE_TYPE_LONG: return 4;
955
1144
case DRIZZLE_TYPE_DOUBLE: return sizeof(double);
1145
case DRIZZLE_TYPE_TIME:
956
1146
case DRIZZLE_TYPE_DATETIME:
957
case DRIZZLE_TYPE_TIMESTAMP:
958
1147
case DRIZZLE_TYPE_LONGLONG: return 8; /* Don't crash if no int64_t */
959
1148
case DRIZZLE_TYPE_NULL: return 0;
960
1149
case DRIZZLE_TYPE_BLOB: return 4 + portable_sizeof_char_ptr;
961
1150
case DRIZZLE_TYPE_DECIMAL:
1078
1266
table->clearWriteSet(field_index);
1269
void Field::pack_num(uint64_t arg, unsigned char *destination)
1271
if (not destination)
1274
int64_tstore(destination, arg);
1277
void Field::pack_num(uint32_t arg, unsigned char *destination)
1279
if (not destination)
1282
longstore(destination, arg);
1285
uint64_t Field::unpack_num(uint64_t &destination, const unsigned char *arg) const
1290
int64_tget(destination, arg);
1295
uint32_t Field::unpack_num(uint32_t &destination, const unsigned char *arg) const
1300
longget(destination, arg);
1081
1305
std::ostream& operator<<(std::ostream& output, const Field &field)
1083
1307
output << "Field:(";
1084
1308
output << field.field_name;
1085
1309
output << ", ";
1086
1310
output << drizzled::display::type(field.real_type());
1313
if (field.flags & NOT_NULL_FLAG)
1314
output << " NOT_NULL";
1316
if (field.flags & PRI_KEY_FLAG)
1317
output << ", PRIMARY KEY";
1319
if (field.flags & UNIQUE_KEY_FLAG)
1320
output << ", UNIQUE KEY";
1322
if (field.flags & MULTIPLE_KEY_FLAG)
1323
output << ", MULTIPLE KEY";
1325
if (field.flags & BLOB_FLAG)
1328
if (field.flags & UNSIGNED_FLAG)
1329
output << ", UNSIGNED";
1331
if (field.flags & BINARY_FLAG)
1332
output << ", BINARY";
1089
1336
return output; // for multiple << operators.