@@ -11,9 +11,11 @@ import std.typecons : BitFlags, tuple, Tuple;
11
11
// / Range for iterating over a collection using a Schema.
12
12
struct DocumentRange (Schema)
13
13
{
14
- private MongoCursor! ( Bson, Bson, typeof ( null )) _cursor ;
14
+ alias Cursor = MongoCursor! Bson;
15
15
16
- public this (MongoCursor! (Bson, Bson, typeof (null )) cursor)
16
+ private Cursor _cursor;
17
+
18
+ public this (Cursor cursor)
17
19
{
18
20
_cursor = cursor;
19
21
}
@@ -377,7 +379,7 @@ struct SchemaPipeline
377
379
return this ;
378
380
}
379
381
380
- Bson run ()
382
+ Bson run () @trusted // workaround because old vibe.d versions mistagged aggregate safety
381
383
{
382
384
debug finalized = true ;
383
385
return _collection.aggregate(pipeline);
@@ -410,7 +412,7 @@ mixin template MongoSchema()
410
412
}
411
413
412
414
// / Returns: the _id value (if set by save or find)
413
- @property ref BsonObjectID bsonID() @safe
415
+ @property ref BsonObjectID bsonID() @safe return
414
416
{
415
417
return _schema_object_id_;
416
418
}
@@ -727,48 +729,82 @@ void register(T)(MongoCollection collection) @safe
727
729
static foreach (memberName; getSerializableMembers! obj)
728
730
{
729
731
{
732
+ alias member = __traits(getMember, obj, memberName);
733
+
730
734
string name = memberName;
731
- static if (hasUDA! ((__traits(getMember, obj, memberName)) , schemaName))
735
+ static if (hasUDA! (member , schemaName))
732
736
{
733
- static assert (getUDAs! ((__traits(getMember, obj, memberName)) , schemaName)
737
+ static assert (getUDAs! (member , schemaName)
734
738
.length == 1 , " Member '" ~ memberName ~ " ' can only have one name!" );
735
- name = getUDAs! ((__traits(getMember, obj, memberName)) , schemaName)[0 ].name;
739
+ name = getUDAs! (member , schemaName)[0 ].name;
736
740
}
737
741
738
- IndexFlags flags = IndexFlags.None;
739
742
ulong expires = 0LU;
740
743
bool force;
741
744
742
- static if (hasUDA! ((__traits(getMember, obj, memberName)) , mongoForceIndex))
745
+ static if (hasUDA! (member , mongoForceIndex))
743
746
{
744
747
force = true ;
745
748
}
746
- static if (hasUDA! ((__traits(getMember, obj, memberName)), mongoBackground))
747
- {
748
- flags |= IndexFlags.Background;
749
- }
750
- static if (hasUDA! ((__traits(getMember, obj, memberName)), mongoDropDuplicates))
751
- {
752
- flags |= IndexFlags.DropDuplicates;
753
- }
754
- static if (hasUDA! ((__traits(getMember, obj, memberName)), mongoSparse))
749
+ static if (hasUDA! (member, mongoExpire))
755
750
{
756
- flags |= IndexFlags.Sparse;
751
+ static assert (getUDAs! (member, mongoExpire)
752
+ .length == 1 , " Member '" ~ memberName ~ " ' can only have one expiry value!" );
753
+ expires = getUDAs! (member, mongoExpire)[0 ].seconds;
757
754
}
758
- static if (hasUDA! ((__traits(getMember, obj, memberName)), mongoUnique))
755
+
756
+
757
+ static if (is (IndexOptions))
759
758
{
760
- flags |= IndexFlags.Unique;
759
+ IndexOptions indexOptions;
760
+ static if (hasUDA! (member, mongoBackground))
761
+ {
762
+ indexOptions.background = true ;
763
+ }
764
+ static if (hasUDA! (member, mongoDropDuplicates))
765
+ {
766
+ indexOptions.dropDups = true ;
767
+ }
768
+ static if (hasUDA! (member, mongoSparse))
769
+ {
770
+ indexOptions.sparse = true ;
771
+ }
772
+ static if (hasUDA! (member, mongoUnique))
773
+ {
774
+ indexOptions.unique = true ;
775
+ }
776
+ static if (hasUDA! (member, mongoExpire))
777
+ {
778
+ indexOptions.expireAfterSeconds = cast (int )expires;
779
+ }
761
780
}
762
- static if (hasUDA ! ((__traits(getMember, obj, memberName)), mongoExpire))
781
+ else
763
782
{
764
- static assert (getUDAs! ((__traits(getMember, obj, memberName)), mongoExpire)
765
- .length == 1 , " Member '" ~ memberName ~ " ' can only have one expiry value!" );
766
- flags |= IndexFlags.ExpireAfterSeconds;
767
- expires = getUDAs! ((__traits(getMember, obj, memberName)), mongoExpire)[0 ].seconds;
783
+ IndexFlags flags = IndexFlags.None;
784
+ static if (hasUDA! (member, mongoBackground))
785
+ {
786
+ flags |= IndexFlags.Background;
787
+ }
788
+ static if (hasUDA! (member, mongoDropDuplicates))
789
+ {
790
+ flags |= IndexFlags.DropDuplicates;
791
+ }
792
+ static if (hasUDA! (member, mongoSparse))
793
+ {
794
+ flags |= IndexFlags.Sparse;
795
+ }
796
+ static if (hasUDA! (member, mongoUnique))
797
+ {
798
+ flags |= IndexFlags.Unique;
799
+ }
800
+ static if (hasUDA! (member, mongoExpire))
801
+ {
802
+ flags |= IndexFlags.ExpireAfterSeconds;
803
+ }
804
+
805
+ if (flags != IndexFlags.None || force)
806
+ collection.ensureIndex([tuple(name, 1 )], flags, dur! " seconds" (expires));
768
807
}
769
-
770
- if (flags != IndexFlags.None || force)
771
- collection.ensureIndex([tuple(name, 1 )], flags, dur! " seconds" (expires));
772
808
}
773
809
}
774
810
}
@@ -800,7 +836,10 @@ unittest
800
836
801
837
unittest
802
838
{
803
- import std.digest.digest ;
839
+ static if (__VERSION__ >= 2076 )
840
+ import std.digest ;
841
+ else
842
+ import std.digest.digest ;
804
843
import std.digest.sha ;
805
844
import std.datetime.systime ;
806
845
@@ -988,7 +1027,7 @@ unittest
988
1027
{
989
1028
mixin MongoSchema;
990
1029
991
- @mongoUnique string username;
1030
+ @mongoExpire( 30 ) @ mongoUnique string username;
992
1031
@binaryType()
993
1032
ubyte [] hash;
994
1033
@schemaName(" profile-picture" )
@@ -1002,21 +1041,21 @@ unittest
1002
1041
1003
1042
User user;
1004
1043
user.username = " Example" ;
1005
- user.hash = sha512Of(" password123" );
1044
+ user.hash = sha512Of(" password123" ). dup ;
1006
1045
user.profilePicture = " example-avatar.png" ;
1007
1046
1008
1047
assertNotThrown(user.save());
1009
1048
1010
1049
User user2;
1011
1050
user2.username = " Bob" ;
1012
- user2.hash = sha512Of(" foobar" );
1051
+ user2.hash = sha512Of(" foobar" ). dup ;
1013
1052
user2.profilePicture = " bob-avatar.png" ;
1014
1053
1015
1054
assertNotThrown(user2.save());
1016
1055
1017
1056
User faker;
1018
1057
faker.username = " Example" ;
1019
- faker.hash = sha512Of(" PASSWORD" );
1058
+ faker.hash = sha512Of(" PASSWORD" ). dup ;
1020
1059
faker.profilePicture = " example-avatar.png" ;
1021
1060
1022
1061
assertThrown(faker.save());
@@ -1046,7 +1085,7 @@ unittest
1046
1085
1047
1086
User user3;
1048
1087
user3.username = " User123" ;
1049
- user3.hash = sha512Of(" 486951" );
1088
+ user3.hash = sha512Of(" 486951" ). dup ;
1050
1089
user3.profilePicture = " new.png" ;
1051
1090
User.upsert([" username" : " User123" ], user3.toSchemaBson);
1052
1091
user3 = User.findOne([" username" : " User123" ]);
0 commit comments