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
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065 #pragma once
00066
00067 #include <cstdio>
00068 #include <iosfwd>
00069
00070 namespace drizzled {
00071 namespace type {
00072
00073 class Uuid
00074 {
00075 uint32_t time_low;
00076 uint16_t time_mid;
00077 uint16_t time_hi_and_version;
00078 uint16_t clock_seq;
00079 uint8_t node[6];
00080
00081 public:
00082
00083 Uuid() :
00084 time_low(0),
00085 time_mid(0),
00086 time_hi_and_version(0),
00087 clock_seq(0)
00088 {
00089 node[0]= node[1]= node[2]= node[3]= node[4]= node[5]= 0;
00090 }
00091
00092 void unpack(const unsigned char *in)
00093 {
00094 const uint8_t *ptr= reinterpret_cast<const uint8_t *>(in);
00095 uint32_t tmp;
00096
00097 tmp= *ptr++;
00098 tmp= (tmp << 8) | *ptr++;
00099 tmp= (tmp << 8) | *ptr++;
00100 tmp= (tmp << 8) | *ptr++;
00101 time_low= tmp;
00102
00103 tmp= *ptr++;
00104 tmp= (tmp << 8) | *ptr++;
00105 time_mid= tmp;
00106
00107 tmp= *ptr++;
00108 tmp= (tmp << 8) | *ptr++;
00109 time_hi_and_version = tmp;
00110
00111 tmp= *ptr++;
00112 tmp= (tmp << 8) | *ptr++;
00113 clock_seq= tmp;
00114
00115 memcpy(node, ptr, 6);
00116 }
00117
00118 void pack(unsigned char *out)
00119 {
00120 uint32_t tmp;
00121
00122 tmp = time_low;
00123 out[3] = (unsigned char) tmp;
00124 tmp >>= 8;
00125 out[2] = (unsigned char) tmp;
00126 tmp >>= 8;
00127 out[1] = (unsigned char) tmp;
00128 tmp >>= 8;
00129 out[0] = (unsigned char) tmp;
00130
00131 tmp = time_mid;
00132 out[5] = (unsigned char) tmp;
00133 tmp >>= 8;
00134 out[4] = (unsigned char) tmp;
00135
00136 tmp = time_hi_and_version;
00137 out[7] = (unsigned char) tmp;
00138 tmp >>= 8;
00139 out[6] = (unsigned char) tmp;
00140
00141 tmp = clock_seq;
00142 out[9] = (unsigned char) tmp;
00143 tmp >>= 8;
00144 out[8] = (unsigned char) tmp;
00145
00146 memcpy(out+10, node, 6);
00147 }
00148
00149 bool parse(const char *in)
00150 {
00151 const char *cp;
00152 char buf[3];
00153 size_t i;
00154
00155 for (i= 0, cp= in; i < DISPLAY_LENGTH; i++, cp++)
00156 {
00157 if ((i == 8) || (i == 13) || (i == 18) || (i == 23))
00158 {
00159 if (*cp == '-')
00160 {
00161 continue;
00162 }
00163 else
00164 {
00165 return true;
00166 }
00167 }
00168
00169 if (not isxdigit(*cp))
00170 return true;
00171 }
00172
00173 time_low= strtoul(in, NULL, 16);
00174 time_mid= strtoul(in+9, NULL, 16);
00175 time_hi_and_version= strtoul(in+14, NULL, 16);
00176 clock_seq= strtoul(in+19, NULL, 16);
00177 cp= in+24;
00178 buf[2]= 0;
00179
00180 for (i= 0; i < 6; i++)
00181 {
00182 buf[0]= *cp++;
00183 buf[1]= *cp++;
00184 node[i]= strtoul(buf, NULL, 16);
00185 }
00186
00187 return false;
00188 }
00189
00190 void unparse(char *out) const
00191 {
00192 snprintf(out, DISPLAY_BUFFER_LENGTH, "%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x",
00193 time_low,
00194 time_mid,
00195 time_hi_and_version,
00196 clock_seq >> 8,
00197 clock_seq & 0xFF,
00198 node[0],
00199 node[1],
00200 node[2],
00201 node[3],
00202 node[4],
00203 node[5]);
00204 }
00205
00206 void time(timeval& ret_val) const
00207 {
00208 uint32_t high;
00209 uint64_t clock_reg;
00210
00211 high= time_mid | ((time_hi_and_version & 0xFFF) << 16);
00212 clock_reg= time_low | ((uint64_t) high << 32);
00213
00214 clock_reg -= (((uint64_t) 0x01B21DD2) << 32) + 0x13814000;
00215 ret_val.tv_sec = clock_reg / 10000000;
00216 ret_val.tv_usec = (clock_reg % 10000000) / 10;
00217 }
00218 bool isTimeType() const
00219 {
00220 return ((time_hi_and_version >> 12) & 0xF) == 1;
00221 }
00222
00223 static const size_t LENGTH= 16;
00224 static const size_t DISPLAY_LENGTH= 36;
00225 static const size_t DISPLAY_BUFFER_LENGTH= DISPLAY_LENGTH+1;
00226 };
00227
00228 }
00229 }
00230
00231