@@ -52,6 +52,8 @@ struct ColumnSpecialization
52
52
// /ditto
53
53
alias CSN = ColumnSpecialization;
54
54
55
+ @safe :
56
+
55
57
@(" columnSpecial" )
56
58
debug (MYSQLN_TESTS )
57
59
unittest
@@ -70,7 +72,7 @@ unittest
70
72
immutable totalSize = 1000 ; // Deliberately not a multiple of chunkSize below
71
73
auto alph = cast (const (ubyte )[]) " ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" ;
72
74
auto data = alph.cycle.take(totalSize).array;
73
- cn.exec(" INSERT INTO `columnSpecial` VALUES (\" " ~ (cast (string )data)~ " \" )" );
75
+ cn.exec(" INSERT INTO `columnSpecial` VALUES (\" " ~ (cast (const ( char )[] )data)~ " \" )" );
74
76
75
77
// Common stuff
76
78
int chunkSize;
@@ -199,15 +201,15 @@ ulong exec(Connection conn, const(char[]) sql)
199
201
}
200
202
// /ditto
201
203
ulong exec (T... )(Connection conn, const (char []) sql, T args)
202
- if (T.length > 0 && ! is (T[0 ] == Variant []))
204
+ if (T.length > 0 && ! is (T[0 ] == Variant []) && ! is (T[ 0 ] == MySQLVal[]) )
203
205
{
204
206
auto prepared = conn.prepare(sql);
205
207
prepared.setArgs(args);
206
208
return exec (conn, prepared);
207
209
}
208
210
// /ditto
209
211
deprecated (" Variant support is deprecated. Use MySQLVal[] instead of Variant[]" )
210
- ulong exec (Connection conn, const (char []) sql, Variant [] args)
212
+ ulong exec (Connection conn, const (char []) sql, Variant [] args) @system
211
213
{
212
214
auto prepared = conn.prepare(sql);
213
215
prepared.setArgs(args);
@@ -231,14 +233,14 @@ ulong exec(Connection conn, ref Prepared prepared)
231
233
}
232
234
// /ditto
233
235
ulong exec (T... )(Connection conn, ref Prepared prepared, T args)
234
- if (T.length > 0 && ! is (T[0 ] == Variant []))
236
+ if (T.length > 0 && ! is (T[0 ] == Variant []) && ! is (T[ 0 ] == MySQLVal[]) )
235
237
{
236
238
prepared.setArgs(args);
237
239
return exec (conn, prepared);
238
240
}
239
241
// /ditto
240
242
deprecated (" Variant support is deprecated. Use MySQLVal[] instead of Variant[]" )
241
- ulong exec (Connection conn, ref Prepared prepared, Variant [] args)
243
+ ulong exec (Connection conn, ref Prepared prepared, Variant [] args) @system
242
244
{
243
245
prepared.setArgs(args);
244
246
return exec (conn, prepared);
@@ -341,15 +343,15 @@ ResultRange query(Connection conn, const(char[]) sql, ColumnSpecialization[] csa
341
343
}
342
344
// /ditto
343
345
ResultRange query (T... )(Connection conn, const (char []) sql, T args)
344
- if (T.length > 0 && ! is (T[0 ] == Variant []) && ! is (T[0 ] == ColumnSpecialization) && ! is (T[0 ] == ColumnSpecialization[]))
346
+ if (T.length > 0 && ! is (T[0 ] == Variant []) && ! is (T[0 ] == MySQLVal[]) && ! is (T[ 0 ] == ColumnSpecialization) && ! is (T[0 ] == ColumnSpecialization[]))
345
347
{
346
348
auto prepared = conn.prepare(sql);
347
349
prepared.setArgs(args);
348
350
return query (conn, prepared);
349
351
}
350
352
// /ditto
351
353
deprecated (" Variant support is deprecated. Use MySQLVal[] instead of Variant[]" )
352
- ResultRange query (Connection conn, const (char []) sql, Variant [] args)
354
+ ResultRange query (Connection conn, const (char []) sql, Variant [] args) @system
353
355
{
354
356
auto prepared = conn.prepare(sql);
355
357
prepared.setArgs(args);
@@ -374,14 +376,14 @@ ResultRange query(Connection conn, ref Prepared prepared)
374
376
}
375
377
// /ditto
376
378
ResultRange query (T... )(Connection conn, ref Prepared prepared, T args)
377
- if (T.length > 0 && ! is (T[0 ] == Variant []) && ! is (T[0 ] == ColumnSpecialization) && ! is (T[0 ] == ColumnSpecialization[]))
379
+ if (T.length > 0 && ! is (T[0 ] == Variant []) && ! is (T[0 ] == MySQLVal[]) && ! is (T[ 0 ] == ColumnSpecialization) && ! is (T[0 ] == ColumnSpecialization[]))
378
380
{
379
381
prepared.setArgs(args);
380
382
return query (conn, prepared);
381
383
}
382
384
// /ditto
383
385
deprecated (" Variant support is deprecated. Use MySQLVal[] instead of Variant[]" )
384
- ResultRange query (Connection conn, ref Prepared prepared, Variant [] args)
386
+ ResultRange query (Connection conn, ref Prepared prepared, Variant [] args) @system
385
387
{
386
388
prepared.setArgs(args);
387
389
return query (conn, prepared);
@@ -414,7 +416,7 @@ package ResultRange queryImpl(ColumnSpecialization[] csa,
414
416
conn._rsh.addSpecializations(csa);
415
417
416
418
conn._headersPending = false ;
417
- return ResultRange (SafeResultRange( conn, conn._rsh, conn._rsh.fieldNames) );
419
+ return ResultRange (conn, conn._rsh, conn._rsh.fieldNames);
418
420
}
419
421
420
422
/+ +
@@ -487,7 +489,7 @@ Nullable!Row queryRow(Connection conn, const(char[]) sql, ColumnSpecialization[]
487
489
}
488
490
// /ditto
489
491
Nullable! Row queryRow (T... )(Connection conn, const (char []) sql, T args)
490
- if (T.length > 0 && ! is (T[0 ] == Variant []) && ! is (T[0 ] == ColumnSpecialization) && ! is (T[0 ] == ColumnSpecialization[]))
492
+ if (T.length > 0 && ! is (T[0 ] == Variant []) && ! is (T[0 ] == MySQLVal[]) && ! is (T[ 0 ] == ColumnSpecialization) && ! is (T[0 ] == ColumnSpecialization[]))
491
493
{
492
494
auto prepared = conn.prepare(sql);
493
495
prepared.setArgs(args);
@@ -502,7 +504,7 @@ Nullable!Row queryRow(Connection conn, const(char[]) sql, MySQLVal[] args)
502
504
}
503
505
// /ditto
504
506
deprecated (" Variant support is deprecated. Use MySQLVal[] instead of Variant[]" )
505
- Nullable! Row queryRow (Connection conn, const (char []) sql, Variant [] args)
507
+ Nullable! Row queryRow (Connection conn, const (char []) sql, Variant [] args) @system
506
508
{
507
509
auto prepared = conn.prepare(sql);
508
510
prepared.setArgs(args);
@@ -519,14 +521,14 @@ Nullable!Row queryRow(Connection conn, ref Prepared prepared)
519
521
}
520
522
// /ditto
521
523
Nullable! Row queryRow (T... )(Connection conn, ref Prepared prepared, T args)
522
- if (T.length > 0 && ! is (T[0 ] == Variant []) && ! is (T[0 ] == ColumnSpecialization) && ! is (T[0 ] == ColumnSpecialization[]))
524
+ if (T.length > 0 && ! is (T[0 ] == Variant []) && ! is (T[0 ] == MySQLVal[]) && ! is (T[ 0 ] == ColumnSpecialization) && ! is (T[0 ] == ColumnSpecialization[]))
523
525
{
524
526
prepared.setArgs(args);
525
527
return queryRow (conn, prepared);
526
528
}
527
529
// /ditto
528
530
deprecated (" Variant support is deprecated. Use MySQLVal[] instead of Variant[]" )
529
- Nullable! Row queryRow (Connection conn, ref Prepared prepared, Variant [] args)
531
+ Nullable! Row queryRow (Connection conn, ref Prepared prepared, Variant [] args) @system
530
532
{
531
533
prepared.setArgs(args);
532
534
return queryRow (conn, prepared);
@@ -615,15 +617,17 @@ package void queryRowTupleImpl(T...)(Connection conn, ExecQueryImplInfo info, re
615
617
ulong ra;
616
618
enforce! MYXNoResultRecieved(execQueryImpl(conn, info, ra));
617
619
618
- Row rr = conn.getNextRow();
620
+ auto rr = conn.getNextRow();
619
621
/+ if (!rr._valid) // The result set was empty - not a crime.
620
622
return;+/
621
623
enforce! MYX (rr._values.length == args.length, " Result column count does not match the target tuple." );
622
624
foreach (size_t i, dummy; args)
623
625
{
624
- enforce! MYX (typeid (args[i]).toString() == rr._values[i].type.toString(),
626
+ import taggedalgebraic.taggedalgebraic : get , hasType;
627
+ enforce! MYX (rr._values[i].hasType! (T[i]),
625
628
" Tuple " ~ to! string (i)~ " type and column type are not compatible." );
626
- args[i] = rr._values[i].get ! (typeof (args[i]));
629
+ // use taggedalgebraic get to avoid extra calls.
630
+ args[i] = get ! (T[i])(rr._values[i]);
627
631
}
628
632
// If there were more rows, flush them away
629
633
// Question: Should I check in purgeResult and throw if there were - it's very inefficient to
@@ -726,7 +730,7 @@ Nullable!MySQLVal queryValue(Connection conn, const(char[]) sql, ColumnSpecializ
726
730
}
727
731
// /ditto
728
732
Nullable! MySQLVal queryValue (T... )(Connection conn, const (char []) sql, T args)
729
- if (T.length > 0 && ! is (T[0 ] == Variant []) && ! is (T[0 ] == ColumnSpecialization) && ! is (T[0 ] == ColumnSpecialization[]))
733
+ if (T.length > 0 && ! is (T[0 ] == Variant []) && ! is (T[0 ] == MySQLVal[]) && ! is (T[ 0 ] == ColumnSpecialization) && ! is (T[0 ] == ColumnSpecialization[]))
730
734
{
731
735
auto prepared = conn.prepare(sql);
732
736
prepared.setArgs(args);
@@ -741,7 +745,7 @@ Nullable!MySQLVal queryValue(Connection conn, const(char[]) sql, MySQLVal[] args
741
745
}
742
746
// /ditto
743
747
deprecated (" Variant support is deprecated. Use MySQLVal[] instead of Variant[]" )
744
- Nullable! MySQLVal queryValue (Connection conn, const (char []) sql, Variant [] args)
748
+ Nullable! MySQLVal queryValue (Connection conn, const (char []) sql, Variant [] args) @system
745
749
{
746
750
auto prepared = conn.prepare(sql);
747
751
prepared.setArgs(args);
@@ -758,7 +762,7 @@ Nullable!MySQLVal queryValue(Connection conn, ref Prepared prepared)
758
762
}
759
763
// /ditto
760
764
Nullable! MySQLVal queryValue (T... )(Connection conn, ref Prepared prepared, T args)
761
- if (T.length > 0 && ! is (T[0 ] == Variant []) && ! is (T[0 ] == ColumnSpecialization) && ! is (T[0 ] == ColumnSpecialization[]))
765
+ if (T.length > 0 && ! is (T[0 ] == Variant []) && ! is (T[0 ] == MySQLVal[]) && ! is (T[ 0 ] == ColumnSpecialization) && ! is (T[0 ] == ColumnSpecialization[]))
762
766
{
763
767
prepared.setArgs(args);
764
768
return queryValue (conn, prepared);
@@ -771,7 +775,7 @@ Nullable!MySQLVal queryValue(Connection conn, ref Prepared prepared, MySQLVal[]
771
775
}
772
776
// /ditto
773
777
deprecated (" Variant support is deprecated. Use MySQLVal[] instead of Variant[]" )
774
- Nullable! MySQLVal queryValue (Connection conn, ref Prepared prepared, Variant [] args)
778
+ Nullable! MySQLVal queryValue (Connection conn, ref Prepared prepared, Variant [] args) @system
775
779
{
776
780
prepared.setArgs(args);
777
781
return queryValue (conn, prepared);
@@ -795,7 +799,7 @@ package Nullable!MySQLVal queryValueImpl(ColumnSpecialization[] csa, Connection
795
799
return Nullable! MySQLVal();
796
800
else
797
801
{
798
- auto row = results.safe. front;
802
+ auto row = results.front;
799
803
results.close();
800
804
801
805
if (row.length == 0 )
@@ -827,7 +831,7 @@ unittest
827
831
// exec: const(char[]) sql
828
832
assert (cn.exec(" INSERT INTO `execOverloads` VALUES (1, \" aa\" )" ) == 1 );
829
833
assert (cn.exec(prepareSQL, 2 , " bb" ) == 1 );
830
- assert (cn.exec(prepareSQL, [Variant (3 ), Variant (" cc" )]) == 1 );
834
+ assert (cn.exec(prepareSQL, [MySQLVal (3 ), MySQLVal (" cc" )]) == 1 );
831
835
832
836
// exec: prepared sql
833
837
auto prepared = cn.prepare(prepareSQL);
@@ -838,7 +842,7 @@ unittest
838
842
assert (prepared.getArg(0 ) == 5 );
839
843
assert (prepared.getArg(1 ) == " ee" );
840
844
841
- assert (cn.exec(prepared, [Variant (6 ), Variant (" ff" )]) == 1 );
845
+ assert (cn.exec(prepared, [MySQLVal (6 ), MySQLVal (" ff" )]) == 1 );
842
846
assert (prepared.getArg(0 ) == 6 );
843
847
assert (prepared.getArg(1 ) == " ff" );
844
848
@@ -912,7 +916,7 @@ unittest
912
916
assert (rows[0 ][0 ] == 2 );
913
917
assert (rows[0 ][1 ] == " bb" );
914
918
915
- rows = cn.query(prepareSQL, [Variant (3 ), Variant (" cc" )]).array;
919
+ rows = cn.query(prepareSQL, [MySQLVal (3 ), MySQLVal (" cc" )]).array;
916
920
assert (rows.length == 1 );
917
921
assert (rows[0 ].length == 2 );
918
922
assert (rows[0 ][0 ] == 3 );
@@ -933,7 +937,7 @@ unittest
933
937
assert (rows[0 ][0 ] == 2 );
934
938
assert (rows[0 ][1 ] == " bb" );
935
939
936
- rows = cn.query(prepared, [Variant (3 ), Variant (" cc" )]).array;
940
+ rows = cn.query(prepared, [MySQLVal (3 ), MySQLVal (" cc" )]).array;
937
941
assert (rows.length == 1 );
938
942
assert (rows[0 ].length == 2 );
939
943
assert (rows[0 ][0 ] == 3 );
@@ -951,53 +955,55 @@ unittest
951
955
952
956
// Test queryRow
953
957
{
954
- Nullable! Row row;
958
+ Nullable! Row nrow;
959
+ // avoid always saying nrow.get
960
+ Row row () { return nrow.get ; }
955
961
956
962
// String sql
957
- row = cn.queryRow(" SELECT * FROM `queryOverloads` WHERE `i`=1 AND `s`=\" aa\" " );
958
- assert (! row .isNull);
963
+ nrow = cn.queryRow(" SELECT * FROM `queryOverloads` WHERE `i`=1 AND `s`=\" aa\" " );
964
+ assert (! nrow .isNull);
959
965
assert (row.length == 2 );
960
966
assert (row[0 ] == 1 );
961
967
assert (row[1 ] == " aa" );
962
968
963
- row = cn.queryRow(prepareSQL, 2 , " bb" );
964
- assert (! row .isNull);
969
+ nrow = cn.queryRow(prepareSQL, 2 , " bb" );
970
+ assert (! nrow .isNull);
965
971
assert (row.length == 2 );
966
972
assert (row[0 ] == 2 );
967
973
assert (row[1 ] == " bb" );
968
974
969
- row = cn.queryRow(prepareSQL, [Variant (3 ), Variant (" cc" )]);
970
- assert (! row .isNull);
975
+ nrow = cn.queryRow(prepareSQL, [MySQLVal (3 ), MySQLVal (" cc" )]);
976
+ assert (! nrow .isNull);
971
977
assert (row.length == 2 );
972
978
assert (row[0 ] == 3 );
973
979
assert (row[1 ] == " cc" );
974
980
975
981
// Prepared sql
976
982
auto prepared = cn.prepare(prepareSQL);
977
983
prepared.setArgs(1 , " aa" );
978
- row = cn.queryRow(prepared);
979
- assert (! row .isNull);
984
+ nrow = cn.queryRow(prepared);
985
+ assert (! nrow .isNull);
980
986
assert (row.length == 2 );
981
987
assert (row[0 ] == 1 );
982
988
assert (row[1 ] == " aa" );
983
989
984
- row = cn.queryRow(prepared, 2 , " bb" );
985
- assert (! row .isNull);
990
+ nrow = cn.queryRow(prepared, 2 , " bb" );
991
+ assert (! nrow .isNull);
986
992
assert (row.length == 2 );
987
993
assert (row[0 ] == 2 );
988
994
assert (row[1 ] == " bb" );
989
995
990
- row = cn.queryRow(prepared, [Variant (3 ), Variant (" cc" )]);
991
- assert (! row .isNull);
996
+ nrow = cn.queryRow(prepared, [MySQLVal (3 ), MySQLVal (" cc" )]);
997
+ assert (! nrow .isNull);
992
998
assert (row.length == 2 );
993
999
assert (row[0 ] == 3 );
994
1000
assert (row[1 ] == " cc" );
995
1001
996
1002
// BCPrepared sql
997
1003
auto bcPrepared = cn.prepareBackwardCompatImpl(prepareSQL);
998
1004
bcPrepared.setArgs(1 , " aa" );
999
- row = cn.queryRow(bcPrepared);
1000
- assert (! row .isNull);
1005
+ nrow = cn.queryRow(bcPrepared);
1006
+ assert (! nrow .isNull);
1001
1007
assert (row.length == 2 );
1002
1008
assert (row[0 ] == 1 );
1003
1009
assert (row[1 ] == " aa" );
@@ -1030,48 +1036,48 @@ unittest
1030
1036
1031
1037
// Test queryValue
1032
1038
{
1033
- Nullable! Variant value;
1039
+ Nullable! MySQLVal value;
1034
1040
1035
1041
// String sql
1036
1042
value = cn.queryValue(" SELECT * FROM `queryOverloads` WHERE `i`=1 AND `s`=\" aa\" " );
1037
1043
assert (! value.isNull);
1038
- assert (value.get .type != typeid ( typeof ( null )) );
1044
+ assert (value.get .kind != MySQLVal.Kind.Null );
1039
1045
assert (value.get == 1 );
1040
1046
1041
1047
value = cn.queryValue(prepareSQL, 2 , " bb" );
1042
1048
assert (! value.isNull);
1043
- assert (value.get .type != typeid ( typeof ( null )) );
1049
+ assert (value.get .kind != MySQLVal.Kind.Null );
1044
1050
assert (value.get == 2 );
1045
1051
1046
- value = cn.queryValue(prepareSQL, [Variant (3 ), Variant (" cc" )]);
1052
+ value = cn.queryValue(prepareSQL, [MySQLVal (3 ), MySQLVal (" cc" )]);
1047
1053
assert (! value.isNull);
1048
- assert (value.get .type != typeid ( typeof ( null )) );
1054
+ assert (value.get .kind != MySQLVal.Kind.Null );
1049
1055
assert (value.get == 3 );
1050
1056
1051
1057
// Prepared sql
1052
1058
auto prepared = cn.prepare(prepareSQL);
1053
1059
prepared.setArgs(1 , " aa" );
1054
1060
value = cn.queryValue(prepared);
1055
1061
assert (! value.isNull);
1056
- assert (value.get .type != typeid ( typeof ( null )) );
1062
+ assert (value.get .kind != MySQLVal.Kind.Null );
1057
1063
assert (value.get == 1 );
1058
1064
1059
1065
value = cn.queryValue(prepared, 2 , " bb" );
1060
1066
assert (! value.isNull);
1061
- assert (value.get .type != typeid ( typeof ( null )) );
1067
+ assert (value.get .kind != MySQLVal.Kind.Null );
1062
1068
assert (value.get == 2 );
1063
1069
1064
- value = cn.queryValue(prepared, [Variant (3 ), Variant (" cc" )]);
1070
+ value = cn.queryValue(prepared, [MySQLVal (3 ), MySQLVal (" cc" )]);
1065
1071
assert (! value.isNull);
1066
- assert (value.get .type != typeid ( typeof ( null )) );
1072
+ assert (value.get .kind != MySQLVal.Kind.Null );
1067
1073
assert (value.get == 3 );
1068
1074
1069
1075
// BCPrepared sql
1070
1076
auto bcPrepared = cn.prepareBackwardCompatImpl(prepareSQL);
1071
1077
bcPrepared.setArgs(1 , " aa" );
1072
1078
value = cn.queryValue(bcPrepared);
1073
1079
assert (! value.isNull);
1074
- assert (value.get .type != typeid ( typeof ( null )) );
1080
+ assert (value.get .kind != MySQLVal.Kind.Null );
1075
1081
assert (value.get == 1 );
1076
1082
}
1077
1083
}
0 commit comments