Skip to content

Commit 91752fc

Browse files
committed
Add Variant compatibility layer. Change name of Kind get function to
kget.
1 parent 145a956 commit 91752fc

File tree

2 files changed

+45
-24
lines changed

2 files changed

+45
-24
lines changed

source/mysql/protocol/comms.d

Lines changed: 21 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -38,10 +38,11 @@ import mysql.protocol.packet_helpers;
3838
import mysql.protocol.packets;
3939
import mysql.protocol.sockets;
4040

41-
/** Gets the value stored in an algebraic type based on its data type.
42-
*/
4341
import taggedalgebraic.taggedalgebraic;
44-
auto ref get(alias K, U)(auto ref TaggedAlgebraic!U ta) if (is(typeof(K) == TaggedAlgebraic!U.Kind))
42+
43+
// Trick tagged algebraic into getting the value based on the kind enum. Much
44+
// easier than dealing with types when I already have the kind.
45+
auto kget(alias K, U)(auto ref TaggedAlgebraic!U ta) if (is(typeof(K) == TaggedAlgebraic!U.Kind))
4546
{
4647
import taggedalgebraic.taggedunion;
4748
return (cast(TaggedUnion!U)ta).value!K;
@@ -142,7 +143,7 @@ package struct ProtocolPrepared
142143
types[ct++] = cast(ubyte) ext;
143144
types[ct++] = SIGNED;
144145
reAlloc(2);
145-
bool bv = isRef? *v.get!BitRef : v.get!Bit;
146+
bool bv = isRef? *v.kget!BitRef : v.kget!Bit;
146147
vals[vcl++] = 1;
147148
vals[vcl++] = bv? 0x31: 0x30;
148149
break;
@@ -152,23 +153,23 @@ package struct ProtocolPrepared
152153
types[ct++] = SQLType.TINY;
153154
types[ct++] = SIGNED;
154155
reAlloc(1);
155-
vals[vcl++] = isRef? *v.get!ByteRef : v.get!Byte;
156+
vals[vcl++] = isRef? *v.kget!ByteRef : v.kget!Byte;
156157
break;
157158
case UByteRef:
158159
isRef = true; goto case;
159160
case UByte:
160161
types[ct++] = SQLType.TINY;
161162
types[ct++] = UNSIGNED;
162163
reAlloc(1);
163-
vals[vcl++] = isRef? *v.get!UByteRef : v.get!UByte;
164+
vals[vcl++] = isRef? *v.kget!UByteRef : v.kget!UByte;
164165
break;
165166
case ShortRef:
166167
isRef = true; goto case;
167168
case Short:
168169
types[ct++] = SQLType.SHORT;
169170
types[ct++] = SIGNED;
170171
reAlloc(2);
171-
short si = isRef? *v.get!ShortRef : v.get!Short;
172+
short si = isRef? *v.kget!ShortRef : v.kget!Short;
172173
vals[vcl++] = cast(ubyte) (si & 0xff);
173174
vals[vcl++] = cast(ubyte) ((si >> 8) & 0xff);
174175
break;
@@ -178,7 +179,7 @@ package struct ProtocolPrepared
178179
types[ct++] = SQLType.SHORT;
179180
types[ct++] = UNSIGNED;
180181
reAlloc(2);
181-
ushort us = isRef? *v.get!UShortRef : v.get!UShort;
182+
ushort us = isRef? *v.kget!UShortRef : v.kget!UShort;
182183
vals[vcl++] = cast(ubyte) (us & 0xff);
183184
vals[vcl++] = cast(ubyte) ((us >> 8) & 0xff);
184185
break;
@@ -188,7 +189,7 @@ package struct ProtocolPrepared
188189
types[ct++] = SQLType.INT;
189190
types[ct++] = SIGNED;
190191
reAlloc(4);
191-
int ii = isRef? *v.get!IntRef : v.get!Int;
192+
int ii = isRef? *v.kget!IntRef : v.kget!Int;
192193
vals[vcl++] = cast(ubyte) (ii & 0xff);
193194
vals[vcl++] = cast(ubyte) ((ii >> 8) & 0xff);
194195
vals[vcl++] = cast(ubyte) ((ii >> 16) & 0xff);
@@ -200,7 +201,7 @@ package struct ProtocolPrepared
200201
types[ct++] = SQLType.INT;
201202
types[ct++] = UNSIGNED;
202203
reAlloc(4);
203-
uint ui = isRef? *v.get!UIntRef : v.get!UInt;
204+
uint ui = isRef? *v.kget!UIntRef : v.kget!UInt;
204205
vals[vcl++] = cast(ubyte) (ui & 0xff);
205206
vals[vcl++] = cast(ubyte) ((ui >> 8) & 0xff);
206207
vals[vcl++] = cast(ubyte) ((ui >> 16) & 0xff);
@@ -212,7 +213,7 @@ package struct ProtocolPrepared
212213
types[ct++] = SQLType.LONGLONG;
213214
types[ct++] = SIGNED;
214215
reAlloc(8);
215-
long li = isRef? *v.get!LongRef : v.get!Long;
216+
long li = isRef? *v.kget!LongRef : v.kget!Long;
216217
vals[vcl++] = cast(ubyte) (li & 0xff);
217218
vals[vcl++] = cast(ubyte) ((li >> 8) & 0xff);
218219
vals[vcl++] = cast(ubyte) ((li >> 16) & 0xff);
@@ -228,7 +229,7 @@ package struct ProtocolPrepared
228229
types[ct++] = SQLType.LONGLONG;
229230
types[ct++] = UNSIGNED;
230231
reAlloc(8);
231-
ulong ul = isRef? *v.get!ULongRef : v.get!ULong;
232+
ulong ul = isRef? *v.kget!ULongRef : v.kget!ULong;
232233
vals[vcl++] = cast(ubyte) (ul & 0xff);
233234
vals[vcl++] = cast(ubyte) ((ul >> 8) & 0xff);
234235
vals[vcl++] = cast(ubyte) ((ul >> 16) & 0xff);
@@ -244,7 +245,7 @@ package struct ProtocolPrepared
244245
types[ct++] = SQLType.FLOAT;
245246
types[ct++] = SIGNED;
246247
reAlloc(4);
247-
float[1] f = [isRef? *v.get!FloatRef : v.get!Float];
248+
float[1] f = [isRef? *v.kget!FloatRef : v.kget!Float];
248249
ubyte[] uba = cast(ubyte[]) f[];
249250
vals[vcl .. vcl + uba.length] = uba[];
250251
vcl += uba.length;
@@ -255,7 +256,7 @@ package struct ProtocolPrepared
255256
types[ct++] = SQLType.DOUBLE;
256257
types[ct++] = SIGNED;
257258
reAlloc(8);
258-
double[1] d = [isRef? *v.get!DoubleRef : v.get!Double];
259+
double[1] d = [isRef? *v.kget!DoubleRef : v.kget!Double];
259260
ubyte[] uba = cast(ubyte[]) d[];
260261
vals[vcl .. uba.length] = uba[];
261262
vcl += uba.length;
@@ -265,7 +266,7 @@ package struct ProtocolPrepared
265266
case Date:
266267
types[ct++] = SQLType.DATE;
267268
types[ct++] = SIGNED;
268-
auto date = isRef? *v.get!DateRef : v.get!Date;
269+
auto date = isRef? *v.kget!DateRef : v.kget!Date;
269270
ubyte[] da = pack(date);
270271
size_t l = da.length;
271272
reAlloc(l);
@@ -277,7 +278,7 @@ package struct ProtocolPrepared
277278
case Time:
278279
types[ct++] = SQLType.TIME;
279280
types[ct++] = SIGNED;
280-
auto time = isRef? *v.get!TimeRef : v.get!Time;
281+
auto time = isRef? *v.kget!TimeRef : v.kget!Time;
281282
ubyte[] ta = pack(time);
282283
size_t l = ta.length;
283284
reAlloc(l);
@@ -289,7 +290,7 @@ package struct ProtocolPrepared
289290
case DateTime:
290291
types[ct++] = SQLType.DATETIME;
291292
types[ct++] = SIGNED;
292-
auto dt = isRef? *v.get!DateTimeRef : v.get!DateTime;
293+
auto dt = isRef? *v.kget!DateTimeRef : v.kget!DateTime;
293294
ubyte[] da = pack(dt);
294295
size_t l = da.length;
295296
reAlloc(l);
@@ -301,7 +302,7 @@ package struct ProtocolPrepared
301302
case Timestamp:
302303
types[ct++] = SQLType.TIMESTAMP;
303304
types[ct++] = SIGNED;
304-
auto tms = isRef? *v.get!TimestampRef : v.get!Timestamp;
305+
auto tms = isRef? *v.kget!TimestampRef : v.kget!Timestamp;
305306
auto dt = mysql.protocol.packet_helpers.toDateTime(tms.rep);
306307
ubyte[] da = pack(dt);
307308
size_t l = da.length;
@@ -317,7 +318,7 @@ package struct ProtocolPrepared
317318
else
318319
types[ct++] = cast(ubyte) ext;
319320
types[ct++] = SIGNED;
320-
const char[] ca = isRef? *v.get!TextRef : v.get!Text;
321+
const char[] ca = isRef? *v.kget!TextRef : v.kget!Text;
321322
ubyte[] packed = packLCS(ca);
322323
reAlloc(packed.length);
323324
vals[vcl..vcl+packed.length] = packed[];
@@ -331,7 +332,7 @@ package struct ProtocolPrepared
331332
else
332333
types[ct++] = cast(ubyte) ext;
333334
types[ct++] = SIGNED;
334-
const ubyte[] uba = isRef? *v.get!BlobRef : v.get!Blob;
335+
const ubyte[] uba = isRef? *v.kget!BlobRef : v.kget!Blob;
335336
ubyte[] packed = packLCS(uba);
336337
reAlloc(packed.length);
337338
vals[vcl..vcl+packed.length] = packed[];

source/mysql/types.d

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
module mysql.types;
33
import taggedalgebraic.taggedalgebraic;
44
import std.datetime : DateTime, TimeOfDay, Date;
5-
public import taggedalgebraic.taggedalgebraic : get;
65

76
/++
87
A simple struct to represent time difference.
@@ -125,13 +124,34 @@ package Variant _toVar(MySQLVal v)
125124
return v.apply!((a) => Variant(a));
126125
}
127126

128-
// helper to fix deficiency of convertsTo in TaggedAlgebraic
129-
package bool convertsTo(T)(ref MySQLVal val)
127+
/++
128+
Compatibility layer for std.variant.Variant. These functions provide methods
129+
that TaggedAlgebraic does not provide in order to keep functionality that was
130+
available with Variant.
131+
+/
132+
bool convertsTo(T)(ref MySQLVal val)
130133
{
131134
return val.apply!((a) => is(typeof(a) : T));
132135
}
133136

134-
package T coerce(T)(auto ref MySQLVal val)
137+
/// ditto
138+
T get(T)(auto ref MySQLVal val)
139+
{
140+
static T convert(V)(ref V v)
141+
{
142+
static if(is(V : T))
143+
return v;
144+
else
145+
{
146+
import mysql.exceptions;
147+
throw new MYX("Cannot get type " ~ T.stringof ~ " with MySQLVal storing type " ~ V.stringof);
148+
}
149+
}
150+
return val.apply!convert();
151+
}
152+
153+
/// ditto
154+
T coerce(T)(auto ref MySQLVal val)
135155
{
136156
import std.conv : to;
137157
static T convert(V)(ref V v)

0 commit comments

Comments
 (0)