Skip to content

Commit edce0c5

Browse files
committed
safety & vibe.d updates
1 parent d76bb3a commit edce0c5

File tree

2 files changed

+79
-35
lines changed

2 files changed

+79
-35
lines changed

source/mongoschema/db.d

+74-35
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,11 @@ import std.typecons : BitFlags, tuple, Tuple;
1111
/// Range for iterating over a collection using a Schema.
1212
struct DocumentRange(Schema)
1313
{
14-
private MongoCursor!(Bson, Bson, typeof(null)) _cursor;
14+
alias Cursor = MongoCursor!Bson;
1515

16-
public this(MongoCursor!(Bson, Bson, typeof(null)) cursor)
16+
private Cursor _cursor;
17+
18+
public this(Cursor cursor)
1719
{
1820
_cursor = cursor;
1921
}
@@ -377,7 +379,7 @@ struct SchemaPipeline
377379
return this;
378380
}
379381

380-
Bson run()
382+
Bson run() @trusted // workaround because old vibe.d versions mistagged aggregate safety
381383
{
382384
debug finalized = true;
383385
return _collection.aggregate(pipeline);
@@ -410,7 +412,7 @@ mixin template MongoSchema()
410412
}
411413

412414
/// Returns: the _id value (if set by save or find)
413-
@property ref BsonObjectID bsonID() @safe
415+
@property ref BsonObjectID bsonID() @safe return
414416
{
415417
return _schema_object_id_;
416418
}
@@ -727,48 +729,82 @@ void register(T)(MongoCollection collection) @safe
727729
static foreach (memberName; getSerializableMembers!obj)
728730
{
729731
{
732+
alias member = __traits(getMember, obj, memberName);
733+
730734
string name = memberName;
731-
static if (hasUDA!((__traits(getMember, obj, memberName)), schemaName))
735+
static if (hasUDA!(member, schemaName))
732736
{
733-
static assert(getUDAs!((__traits(getMember, obj, memberName)), schemaName)
737+
static assert(getUDAs!(member, schemaName)
734738
.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;
736740
}
737741

738-
IndexFlags flags = IndexFlags.None;
739742
ulong expires = 0LU;
740743
bool force;
741744

742-
static if (hasUDA!((__traits(getMember, obj, memberName)), mongoForceIndex))
745+
static if (hasUDA!(member, mongoForceIndex))
743746
{
744747
force = true;
745748
}
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))
755750
{
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;
757754
}
758-
static if (hasUDA!((__traits(getMember, obj, memberName)), mongoUnique))
755+
756+
757+
static if (is(IndexOptions))
759758
{
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+
}
761780
}
762-
static if (hasUDA!((__traits(getMember, obj, memberName)), mongoExpire))
781+
else
763782
{
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));
768807
}
769-
770-
if (flags != IndexFlags.None || force)
771-
collection.ensureIndex([tuple(name, 1)], flags, dur!"seconds"(expires));
772808
}
773809
}
774810
}
@@ -800,7 +836,10 @@ unittest
800836

801837
unittest
802838
{
803-
import std.digest.digest;
839+
static if (__VERSION__ >= 2076)
840+
import std.digest;
841+
else
842+
import std.digest.digest;
804843
import std.digest.sha;
805844
import std.datetime.systime;
806845

@@ -988,7 +1027,7 @@ unittest
9881027
{
9891028
mixin MongoSchema;
9901029

991-
@mongoUnique string username;
1030+
@mongoExpire(30) @mongoUnique string username;
9921031
@binaryType()
9931032
ubyte[] hash;
9941033
@schemaName("profile-picture")
@@ -1002,21 +1041,21 @@ unittest
10021041

10031042
User user;
10041043
user.username = "Example";
1005-
user.hash = sha512Of("password123");
1044+
user.hash = sha512Of("password123").dup;
10061045
user.profilePicture = "example-avatar.png";
10071046

10081047
assertNotThrown(user.save());
10091048

10101049
User user2;
10111050
user2.username = "Bob";
1012-
user2.hash = sha512Of("foobar");
1051+
user2.hash = sha512Of("foobar").dup;
10131052
user2.profilePicture = "bob-avatar.png";
10141053

10151054
assertNotThrown(user2.save());
10161055

10171056
User faker;
10181057
faker.username = "Example";
1019-
faker.hash = sha512Of("PASSWORD");
1058+
faker.hash = sha512Of("PASSWORD").dup;
10201059
faker.profilePicture = "example-avatar.png";
10211060

10221061
assertThrown(faker.save());
@@ -1046,7 +1085,7 @@ unittest
10461085

10471086
User user3;
10481087
user3.username = "User123";
1049-
user3.hash = sha512Of("486951");
1088+
user3.hash = sha512Of("486951").dup;
10501089
user3.profilePicture = "new.png";
10511090
User.upsert(["username": "User123"], user3.toSchemaBson);
10521091
user3 = User.findOne(["username": "User123"]);

source/mongoschema/package.d

+5
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,11 @@ enum mongoUnique;
5151
/// Field must be a SchemaDate/BsonDate. You must update the time using collMod.
5252
struct mongoExpire
5353
{
54+
///
55+
this(int seconds)
56+
{
57+
this.seconds = cast(ulong) seconds;
58+
}
5459
///
5560
this(long seconds)
5661
{

0 commit comments

Comments
 (0)