From fa6940523986dc1faa346f659eace95a5eddabb5 Mon Sep 17 00:00:00 2001 From: Olof Larsson Date: Fri, 28 Mar 2014 15:13:23 +0100 Subject: [PATCH] Copydb command access check, remote mtime defaults to 0, mote mtime field to the top. --- .../mcore/mcorecmd/CmdMCoreMStoreCopydb.java | 8 +++++ .../massivecraft/mcore/store/DriverMongo.java | 29 ++++++++++++++----- .../mcore/store/GsonMongoConverter.java | 8 +++-- 3 files changed, 35 insertions(+), 10 deletions(-) diff --git a/src/com/massivecraft/mcore/mcorecmd/CmdMCoreMStoreCopydb.java b/src/com/massivecraft/mcore/mcorecmd/CmdMCoreMStoreCopydb.java index d8b04ce9..ad3b01c6 100644 --- a/src/com/massivecraft/mcore/mcorecmd/CmdMCoreMStoreCopydb.java +++ b/src/com/massivecraft/mcore/mcorecmd/CmdMCoreMStoreCopydb.java @@ -78,6 +78,14 @@ public class CmdMCoreMStoreCopydb extends MCommand Collection ids = fromDriver.getIds(fromColl); msg("Now copying collection %d/%d %s with %d documents.", countCollCurrent, countCollTotal, collname, ids.size()); + + // Do a load check to verify we have access to this folder. + if (ids.size() > 0 && fromDriver.load(fromColl, ids.iterator().next()) == null) + { + msg("Skipping %s since could not load data.", collname); + continue; + } + for (String id : ids) { Entry data = fromDriver.load(fromColl, id); diff --git a/src/com/massivecraft/mcore/store/DriverMongo.java b/src/com/massivecraft/mcore/store/DriverMongo.java index d502f5bf..6a9122d1 100644 --- a/src/com/massivecraft/mcore/store/DriverMongo.java +++ b/src/com/massivecraft/mcore/store/DriverMongo.java @@ -70,10 +70,14 @@ public class DriverMongo extends DriverAbstract public Long getMtime(Coll coll, String id) { DBCollection dbcoll = fixColl(coll); + BasicDBObject found = (BasicDBObject)dbcoll.findOne(new BasicDBObject(ID_FIELD, id), dboKeysMtime); if (found == null) return null; - if ( ! found.containsField(MTIME_FIELD)) return null; // This should not happen! But better to ignore than crash? - return found.getLong(MTIME_FIELD); + + // In case there is no _mtime set we assume 0. Probably a manual database addition by the server owner. + long mtime = found.getLong(MTIME_FIELD, 0); + + return mtime; } @Override @@ -116,8 +120,10 @@ public class DriverMongo extends DriverAbstract { BasicDBObject raw = (BasicDBObject)cursor.next(); Object remoteId = raw.get(ID_FIELD); - if ( ! raw.containsField(MTIME_FIELD)) continue; // This should not happen! But better to ignore than crash? - Long mtime = raw.getLong(MTIME_FIELD); + + // In case there is no _mtime set we assume 0. Probably a manual database addition by the server owner. + long mtime = raw.getLong(MTIME_FIELD, 0); + ret.put(remoteId.toString(), mtime); } } @@ -136,8 +142,12 @@ public class DriverMongo extends DriverAbstract BasicDBObject raw = (BasicDBObject)dbcoll.findOne(new BasicDBObject(ID_FIELD, id)); if (raw == null) return null; - Long mtime = ((Number)raw.removeField(MTIME_FIELD)).longValue(); - raw.removeField(ID_FIELD); + Long mtime = 0L; + Object mtimeObject = raw.removeField(MTIME_FIELD); + if (mtimeObject != null) + { + mtime = ((Number)mtimeObject).longValue(); + } JsonElement element = GsonMongoConverter.mongo2GsonObject(raw); @@ -149,10 +159,13 @@ public class DriverMongo extends DriverAbstract { DBCollection dbcoll = fixColl(coll); - BasicDBObject dbo = GsonMongoConverter.gson2MongoObject(data); + BasicDBObject dbo = new BasicDBObject(); + Long mtime = System.currentTimeMillis(); - dbo.put(MTIME_FIELD, mtime); dbo.put(ID_FIELD, id); + dbo.put(MTIME_FIELD, mtime); + + GsonMongoConverter.gson2MongoObject(data, dbo); dbcoll.save(dbo); diff --git a/src/com/massivecraft/mcore/store/GsonMongoConverter.java b/src/com/massivecraft/mcore/store/GsonMongoConverter.java index b5b399fb..3c5aee84 100644 --- a/src/com/massivecraft/mcore/store/GsonMongoConverter.java +++ b/src/com/massivecraft/mcore/store/GsonMongoConverter.java @@ -38,10 +38,9 @@ public final class GsonMongoConverter return key; } - public static BasicDBObject gson2MongoObject(JsonElement inElement) + public static BasicDBObject gson2MongoObject(JsonElement inElement, BasicDBObject out) { JsonObject in = inElement.getAsJsonObject(); - BasicDBObject out = new BasicDBObject(); for (Entry entry : in.entrySet()) { String key = gson2MongoKey(entry.getKey()); @@ -62,6 +61,11 @@ public final class GsonMongoConverter return out; } + public static BasicDBObject gson2MongoObject(JsonElement inElement) + { + return gson2MongoObject(inElement, new BasicDBObject()); + } + public static BasicDBList gson2MongoArray(JsonElement inElement) { JsonArray in = inElement.getAsJsonArray();