00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #include "config.h"
00027
00028 #include <algorithm>
00029
00030 #include <drizzled/field/ipv6.h>
00031
00032 #include <drizzled/error.h>
00033 #include <drizzled/internal/my_sys.h>
00034 #include <drizzled/session.h>
00035 #include <drizzled/table.h>
00036
00037 namespace drizzled
00038 {
00039 namespace field
00040 {
00041
00042 IPv6::IPv6(unsigned char *ptr_arg,
00043 uint32_t len_arg,
00044 unsigned char *null_ptr_arg,
00045 unsigned char null_bit_arg,
00046 const char *field_name_arg) :
00047 Field(ptr_arg, len_arg,
00048 null_ptr_arg,
00049 null_bit_arg,
00050 Field::NONE,
00051 field_name_arg)
00052 {
00053 }
00054
00055 int IPv6::cmp(const unsigned char *a, const unsigned char *b)
00056 {
00057 return memcmp(a, b, max_string_length());
00058 }
00059
00060 int IPv6::store(const char *from, uint32_t, const charset_info_st * const )
00061 {
00062 ASSERT_COLUMN_MARKED_FOR_WRITE;
00063 type::IPv6 ptr_address;
00064
00065 if (not ptr_address.inet_pton(from))
00066 {
00067 my_error(ER_INVALID_IPV6_VALUE, MYF(ME_FATALERROR));
00068 return 1;
00069 }
00070
00071 ptr_address.store_object(ptr);
00072
00073 return 0;
00074 }
00075
00076 int IPv6::store(int64_t , bool )
00077 {
00078 ASSERT_COLUMN_MARKED_FOR_WRITE;
00079 my_error(ER_INVALID_IPV6_VALUE, MYF(ME_FATALERROR));
00080 return 1;
00081 }
00082
00083 int IPv6::store_decimal(const drizzled::type::Decimal*)
00084 {
00085 ASSERT_COLUMN_MARKED_FOR_WRITE;
00086 my_error(ER_INVALID_IPV6_VALUE, MYF(ME_FATALERROR));
00087 return 1;
00088 }
00089
00090 void IPv6::sql_type(String &res) const
00091 {
00092 res.set_ascii(STRING_WITH_LEN("ipv6"));
00093 }
00094
00095 double IPv6::val_real() const
00096 {
00097 ASSERT_COLUMN_MARKED_FOR_READ;
00098 my_error(ER_INVALID_IPV6_VALUE, MYF(ME_FATALERROR));
00099 return 0;
00100 }
00101
00102 int64_t IPv6::val_int() const
00103 {
00104 ASSERT_COLUMN_MARKED_FOR_READ;
00105 my_error(ER_INVALID_IPV6_VALUE, MYF(ME_FATALERROR));
00106 return 0;
00107 }
00108
00109 String *IPv6::val_str(String *val_buffer, String *) const
00110 {
00111 const charset_info_st * const cs= &my_charset_bin;
00112 uint32_t mlength= (type::IPv6::IPV6_BUFFER_LENGTH) * cs->mbmaxlen;
00113 type::IPv6 ptr_address;
00114
00115 val_buffer->alloc(mlength);
00116 char *buffer=(char*) val_buffer->ptr();
00117
00118 ASSERT_COLUMN_MARKED_FOR_READ;
00119
00120 ptr_address.restore_object(ptr);
00121 ptr_address.inet_ntop(buffer);
00122
00123 val_buffer->length(type::IPv6::IPV6_DISPLAY_LENGTH);
00124
00125 return val_buffer;
00126 }
00127
00128 void IPv6::sort_string(unsigned char *to, uint32_t length_arg)
00129 {
00130 assert(length_arg == type::IPv6::LENGTH);
00131 memcpy(to, ptr, length_arg);
00132 }
00133
00134 }
00135 }
00136