use of org.bimserver.database.Record in project BIMserver by opensourceBIM.
the class FollowReferenceStackFrame method process.
@Override
public boolean process() throws BimserverDatabaseException, QueryException {
if (getQueryObjectProvider().hasRead(oid)) {
processPossibleIncludes(currentObject, null, include);
return true;
}
if (hasRun) {
return true;
}
hasRun = true;
if (oid == -1) {
throw new BimserverDatabaseException("Cannot get object for oid " + oid);
}
EClass eClass = getQueryObjectProvider().getDatabaseSession().getEClassForOid(oid);
ByteBuffer mustStartWith = ByteBuffer.wrap(new byte[12]);
mustStartWith.putInt(getReusable().getPid());
mustStartWith.putLong(oid);
ByteBuffer startSearchWith = ByteBuffer.wrap(new byte[16]);
startSearchWith.putInt(getReusable().getPid());
startSearchWith.putLong(oid);
startSearchWith.putInt(-getReusable().getRid());
SearchingRecordIterator recordIterator = getQueryObjectProvider().getDatabaseSession().getKeyValueStore().getRecordIterator(eClass.getEPackage().getName() + "_" + eClass.getName(), mustStartWith.array(), startSearchWith.array(), getQueryObjectProvider().getDatabaseSession());
try {
Record record = recordIterator.next();
if (record == null) {
return true;
}
getQueryObjectProvider().incReads();
ByteBuffer keyBuffer = ByteBuffer.wrap(record.getKey());
ByteBuffer valueBuffer = ByteBuffer.wrap(record.getValue());
// pid
keyBuffer.getInt();
long keyOid = keyBuffer.getLong();
int keyRid = -keyBuffer.getInt();
if (keyRid <= getReusable().getRid()) {
if (valueBuffer.capacity() == 1 && valueBuffer.get(0) == -1) {
valueBuffer.position(valueBuffer.position() + 1);
return true;
// deleted entity
} else {
currentObject = convertByteArrayToObject(eClass, keyOid, valueBuffer, keyRid);
if (currentObject != null) {
EReference opposite = getPackageMetaData().getInverseOrOpposite(currentObject.eClass(), fromReference);
if (opposite != null) {
Object x = currentObject.get(opposite.getName());
if (x instanceof List) {
List<Long> list = (List<Long>) x;
int index = list.indexOf(fromOid);
currentObject.addUseForSerialization(opposite, index);
} else {
currentObject.addUseForSerialization(opposite);
}
}
}
processPossibleIncludes(currentObject, null, include);
}
} else {
return true;
}
} finally {
recordIterator.close();
}
return true;
}
use of org.bimserver.database.Record in project BIMserver by opensourceBIM.
the class BimServer method checkPidRid.
private int checkPidRid(DatabaseSession session, Project project, int pid, int rid) throws BimserverDatabaseException, BimserverLockConflictException {
ByteBuffer buffer = ByteBuffer.allocate(4);
buffer.putInt(pid);
int removed = 0;
KeyValueStore keyValueStore = session.getKeyValueStore();
PackageMetaData packageMetaData = bimDatabase.getMetaDataManager().getPackageMetaData(project.getSchema());
for (EClass eClass : packageMetaData.getAllClasses()) {
String tableName = bimDatabase.getTableName(eClass);
if (!keyValueStore.isTransactional(session, tableName)) {
try (RecordIterator iterator = keyValueStore.getRecordIterator(tableName, buffer.array(), buffer.array(), session, true)) {
Record record = iterator.next();
while (record != null) {
ByteBuffer keyBuffer = ByteBuffer.wrap(record.getKey());
if (keyBuffer.capacity() != 16) {
throw new BimserverDatabaseException("Unexpected key size: " + keyBuffer.capacity());
}
// pid
keyBuffer.getInt();
// oid
keyBuffer.getLong();
// rid
int recordRid = -keyBuffer.getInt();
if (recordRid > rid) {
keyValueStore.delete(tableName, record.getKey(), session);
removed++;
}
record = iterator.next();
}
}
}
}
return removed;
}
Aggregations