use of de.fhg.igd.mongomvcc.helper.IdSetIterator in project mongomvcc by igd-geo.
the class MongoDBVBranch method commit.
@Override
public long commit() {
Index idx = getIndex();
// clone dirty objects because we clear them below
Map<String, IdMap> dos = new HashMap<String, IdMap>(idx.getDirtyObjects());
Commit head = getHeadCommit();
Commit c = new Commit(_db.getCounter().getNextId(), head.getCID(), _rootCid, dos);
_tree.addCommit(c);
updateHead(c);
// mark deleted objects as deleted in the database
DB db = _db.getDB();
String lifetimeAttr = MongoDBConstants.LIFETIME + "." + getRootCid();
for (Map.Entry<String, IdSet> e : idx.getDeletedOids().entrySet()) {
DBCollection dbc = db.getCollection(e.getKey());
IdSetIterator li = e.getValue().iterator();
while (li.hasNext()) {
long oid = li.next();
// save the CID of the commit where the object has been deleted
dbc.update(new BasicDBObject(MongoDBConstants.ID, oid), new BasicDBObject("$set", new BasicDBObject(lifetimeAttr, head.getCID())));
}
}
// mark dirty objects as inserted
String instimeAttr = MongoDBConstants.LIFETIME + ".i" + getRootCid();
for (Map.Entry<String, IdMap> e : dos.entrySet()) {
DBCollection dbc = db.getCollection(e.getKey());
IdMap m = e.getValue();
IdMapIterator li = m.iterator();
while (li.hasNext()) {
li.advance();
long oid = li.value();
if (oid == -1) {
// do not save time of insertion
continue;
}
// save the CID of the commit where the object has been inserted
dbc.update(new BasicDBObject(MongoDBConstants.ID, oid), new BasicDBObject("$set", new BasicDBObject(instimeAttr, head.getCID())));
}
}
// reset index
idx.clearDirtyObjects();
// update named branch's head
if (_name != null) {
// and then update it
synchronized (this) {
// check for conflicts (i.e. if another thread has already updated the branch's head)
if (_tree.resolveBranch(_name).getCID() != c.getParentCID()) {
throw new VException("Branch " + _name + " has already been " + "updated by another commit");
}
_tree.updateBranchHead(_name, c.getCID());
}
}
return c.getCID();
}
Aggregations