~ubuntu-branches/ubuntu/saucy/drizzle/saucy-proposed

1.2.5 by Monty Taylor
Import upstream version 2011.01.07
1
/* - mode: c; c-basic-offset: 2; indent-tabs-mode: nil; -*-
2
 *  vim:expandtab:shiftwidth=2:tabstop=2:smarttab:
3
 *
4
 * Copyright (C) 2010 Brian Aker
5
 * All rights reserved.
6
 *
7
 * Redistribution and use in source and binary forms, with or without
8
 * modification, are permitted provided that the following conditions are met:
9
 *     * Redistributions of source code must retain the above copyright
10
 *       notice, this list of conditions and the following disclaimer.
11
 *     * Redistributions in binary form must reproduce the above copyright
12
 *       notice, this list of conditions and the following disclaimer in the
13
 *       documentation and/or other materials provided with the distribution.
14
 *     * Neither the name of the <organization> nor the
15
 *       names of its contributors may be used to endorse or promote products
16
 *       derived from this software without specific prior written permission.
17
 *
18
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
19
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
20
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
21
 * DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
22
 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
23
 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
24
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
25
 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
27
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28
 *
29
 */
30
31
// I looked at code which also had this Copyright header.
32
33
/*
34
 * Copyright (C) 1996, 1997 Theodore Ts'o.
35
 *
36
 * %Begin-Header%
37
 * Redistribution and use in source and binary forms, with or without
38
 * modification, are permitted provided that the following conditions
39
 * are met:
40
 * 1. Redistributions of source code must retain the above copyright
41
 *    notice, and the entire permission notice in its entirety,
42
 *    including the disclaimer of warranties.
43
 * 2. Redistributions in binary form must reproduce the above copyright
44
 *    notice, this list of conditions and the following disclaimer in the
45
 *    documentation and/or other materials provided with the distribution.
46
 * 3. The name of the author may not be used to endorse or promote
47
 *    products derived from this software without specific prior
48
 *    written permission.
49
 *
50
 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
51
 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
52
 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ALL OF
53
 * WHICH ARE HEREBY DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE
54
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
55
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
56
 * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
57
 * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
58
 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
59
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
60
 * USE OF THIS SOFTWARE, EVEN IF NOT ADVISED OF THE POSSIBILITY OF SUCH
61
 * DAMAGE.
62
 * %End-Header%
63
 */
64
1.1.2 by Monty Taylor
Import upstream version 2011.03.13
65
#pragma once
1.2.5 by Monty Taylor
Import upstream version 2011.01.07
66
67
#include <cstdio>
1.1.3 by Tobias Frost
Import upstream version 2012.01.30
68
#include <iosfwd>
69
70
namespace drizzled {
71
namespace type {
72
73
class Uuid 
74
{
1.2.5 by Monty Taylor
Import upstream version 2011.01.07
75
	uint32_t	time_low;
76
	uint16_t	time_mid;
77
	uint16_t	time_hi_and_version;
78
	uint16_t	clock_seq;
79
	uint8_t	node[6];
80
81
public:
82
83
  Uuid() :
84
    time_low(0),
85
    time_mid(0),
86
    time_hi_and_version(0),
87
    clock_seq(0)
88
  {
89
    node[0]= node[1]= node[2]= node[3]= node[4]= node[5]= 0;
90
  }
91
92
  void unpack(const unsigned char *in)
93
  {
94
    const uint8_t	*ptr= reinterpret_cast<const uint8_t *>(in);
95
    uint32_t tmp;
96
97
    tmp= *ptr++;
98
    tmp= (tmp << 8) | *ptr++;
99
    tmp= (tmp << 8) | *ptr++;
100
    tmp= (tmp << 8) | *ptr++;
101
    time_low= tmp;
102
103
    tmp= *ptr++;
104
    tmp= (tmp << 8) | *ptr++;
105
    time_mid= tmp;
106
107
    tmp= *ptr++;
108
    tmp= (tmp << 8) | *ptr++;
109
    time_hi_and_version = tmp;
110
111
    tmp= *ptr++;
112
    tmp= (tmp << 8) | *ptr++;
113
    clock_seq= tmp;
114
115
    memcpy(node, ptr, 6);
116
  }
117
118
  void pack(unsigned char *out)
119
  {
120
    uint32_t	tmp;
121
122
    tmp = time_low;
123
    out[3] = (unsigned char) tmp;
124
    tmp >>= 8;
125
    out[2] = (unsigned char) tmp;
126
    tmp >>= 8;
127
    out[1] = (unsigned char) tmp;
128
    tmp >>= 8;
129
    out[0] = (unsigned char) tmp;
130
131
    tmp = time_mid;
132
    out[5] = (unsigned char) tmp;
133
    tmp >>= 8;
134
    out[4] = (unsigned char) tmp;
135
136
    tmp = time_hi_and_version;
137
    out[7] = (unsigned char) tmp;
138
    tmp >>= 8;
139
    out[6] = (unsigned char) tmp;
140
141
    tmp = clock_seq;
142
    out[9] = (unsigned char) tmp;
143
    tmp >>= 8;
144
    out[8] = (unsigned char) tmp;
145
146
    memcpy(out+10, node, 6);
147
  }
148
149
  bool parse(const char *in)
150
  {
151
    const char	*cp;
152
    char buf[3];
153
    size_t i;
154
155
    for (i= 0, cp= in; i < DISPLAY_LENGTH; i++, cp++)
156
    {
157
      if ((i == 8) || (i == 13) || (i == 18) || (i == 23))
158
      {
159
        if (*cp == '-')
160
        {
161
          continue;
162
        }
163
        else
164
        {
165
          return true;
166
        }
167
      }
168
169
      if (not isxdigit(*cp))
170
        return true;
171
    }
172
173
    time_low= strtoul(in, NULL, 16);
174
    time_mid= strtoul(in+9, NULL, 16);
175
    time_hi_and_version= strtoul(in+14, NULL, 16);
176
    clock_seq= strtoul(in+19, NULL, 16);
177
    cp= in+24;
178
    buf[2]= 0;
179
180
    for (i= 0; i < 6; i++)
181
    {
182
      buf[0]= *cp++;
183
      buf[1]= *cp++;
184
      node[i]= strtoul(buf, NULL, 16);
185
    }
186
187
    return false;
188
  }
189
1.1.3 by Tobias Frost
Import upstream version 2012.01.30
190
  void unparse(char *out) const
1.2.5 by Monty Taylor
Import upstream version 2011.01.07
191
  {
192
    snprintf(out, DISPLAY_BUFFER_LENGTH, "%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x",
193
            time_low,
194
            time_mid,
195
            time_hi_and_version,
196
            clock_seq >> 8,
197
            clock_seq & 0xFF,
198
            node[0],
199
            node[1],
200
            node[2],
201
            node[3],
202
            node[4],
203
            node[5]);
204
  }
205
1.1.3 by Tobias Frost
Import upstream version 2012.01.30
206
  void time(timeval& ret_val) const
1.2.5 by Monty Taylor
Import upstream version 2011.01.07
207
  {
208
    uint32_t high;
209
    uint64_t clock_reg;
210
211
    high= time_mid | ((time_hi_and_version & 0xFFF) << 16);
212
    clock_reg= time_low | ((uint64_t) high << 32);
213
214
    clock_reg -= (((uint64_t) 0x01B21DD2) << 32) + 0x13814000;
215
    ret_val.tv_sec = clock_reg / 10000000;
216
    ret_val.tv_usec = (clock_reg % 10000000) / 10;
217
  }
1.1.3 by Tobias Frost
Import upstream version 2012.01.30
218
  bool isTimeType() const
1.2.5 by Monty Taylor
Import upstream version 2011.01.07
219
  {
1.1.3 by Tobias Frost
Import upstream version 2012.01.30
220
    return ((time_hi_and_version >> 12) & 0xF) == 1; 
1.2.5 by Monty Taylor
Import upstream version 2011.01.07
221
  }
222
223
  static const size_t LENGTH= 16;
224
  static const size_t DISPLAY_LENGTH= 36;
225
  static const size_t DISPLAY_BUFFER_LENGTH= DISPLAY_LENGTH+1;
226
};
227
228
} /* namespace type */
229
} /* namespace drizzled */
230
231