use of com.orientechnologies.orient.core.fetch.remote.ORemoteFetchListener in project orientdb by orientechnologies.
the class ONetworkProtocolBinary method readRecord.
protected void readRecord(final OClientConnection connection) throws IOException {
setDataCommandInfo(connection, "Load record");
if (!isConnectionAlive(connection))
return;
final ORecordId rid = channel.readRID();
final String fetchPlanString = channel.readString();
boolean ignoreCache = false;
ignoreCache = channel.readByte() == 1;
boolean loadTombstones = false;
loadTombstones = channel.readByte() > 0;
if (rid.getClusterId() == 0 && rid.getClusterPosition() == 0) {
// @COMPATIBILITY 0.9.25
// SEND THE DB CONFIGURATION INSTEAD SINCE IT WAS ON RECORD 0:0
OFetchHelper.checkFetchPlanValid(fetchPlanString);
beginResponse();
try {
sendOk(connection, clientTxId);
channel.writeByte((byte) 1);
final byte[] storageStream = connection.getDatabase().getStorage().callInLock(new Callable<byte[]>() {
@Override
public byte[] call() throws Exception {
return connection.getDatabase().getStorage().getConfiguration().toStream(connection.getData().protocolVersion);
}
}, false);
if (connection.getData().protocolVersion <= OChannelBinaryProtocol.PROTOCOL_VERSION_27) {
channel.writeBytes(storageStream);
channel.writeVersion(0);
channel.writeByte(OBlob.RECORD_TYPE);
} else {
channel.writeByte(OBlob.RECORD_TYPE);
channel.writeVersion(0);
channel.writeBytes(storageStream);
}
// NO MORE RECORDS
channel.writeByte((byte) 0);
} finally {
endResponse(connection);
}
} else {
final ORecord record = connection.getDatabase().load(rid, fetchPlanString, ignoreCache, loadTombstones, OStorage.LOCKING_STRATEGY.NONE);
beginResponse();
try {
sendOk(connection, clientTxId);
if (record != null) {
// HAS RECORD
channel.writeByte((byte) 1);
byte[] bytes = getRecordBytes(connection, record);
int length = trimCsvSerializedContent(connection, bytes);
if (connection.getData().protocolVersion <= OChannelBinaryProtocol.PROTOCOL_VERSION_27) {
channel.writeBytes(bytes, length);
channel.writeVersion(record.getVersion());
channel.writeByte(ORecordInternal.getRecordType(record));
} else {
channel.writeByte(ORecordInternal.getRecordType(record));
channel.writeVersion(record.getVersion());
channel.writeBytes(bytes, length);
}
if (fetchPlanString.length() > 0) {
// PLAN
if (record instanceof ODocument) {
final OFetchPlan fetchPlan = OFetchHelper.buildFetchPlan(fetchPlanString);
final Set<ORecord> recordsToSend = new HashSet<ORecord>();
final ODocument doc = (ODocument) record;
final OFetchListener listener = new ORemoteFetchListener() {
@Override
protected void sendRecord(ORecord iLinked) {
recordsToSend.add(iLinked);
}
};
final OFetchContext context = new ORemoteFetchContext();
OFetchHelper.fetch(doc, doc, fetchPlan, listener, context, "");
// SEND RECORDS TO LOAD IN CLIENT CACHE
for (ORecord d : recordsToSend) {
if (d.getIdentity().isValid()) {
// CLIENT CACHE
channel.writeByte((byte) 2);
// RECORD. IT ISN'T PART OF THE RESULT SET
writeIdentifiable(connection, d);
}
}
}
}
}
// NO MORE RECORDS
channel.writeByte((byte) 0);
} finally {
endResponse(connection);
}
}
}
use of com.orientechnologies.orient.core.fetch.remote.ORemoteFetchListener in project orientdb by orientechnologies.
the class OSyncCommandResultListener method result.
@Override
public boolean result(final Object iRecord) {
if (iRecord instanceof ORecord) {
alreadySent.add((ORecord) iRecord);
fetchedRecordsToSend.remove(iRecord);
}
if (wrappedResultListener != null)
// NOTIFY THE WRAPPED LISTENER
wrappedResultListener.result(iRecord);
fetchRecord(iRecord, new ORemoteFetchListener() {
@Override
protected void sendRecord(ORecord iLinked) {
if (!alreadySent.contains(iLinked))
fetchedRecordsToSend.add(iLinked);
}
});
return true;
}
use of com.orientechnologies.orient.core.fetch.remote.ORemoteFetchListener in project orientdb by orientechnologies.
the class OAsyncCommandResultListener method linkdedBySimpleValue.
@Override
public void linkdedBySimpleValue(ODocument doc) {
ORemoteFetchListener listener = new ORemoteFetchListener() {
@Override
protected void sendRecord(ORecord iLinked) {
if (!alreadySent.contains(iLinked.getIdentity())) {
alreadySent.add(iLinked.getIdentity());
try {
// CACHE IT ON THE CLIENT
protocol.channel.writeByte((byte) 2);
protocol.writeIdentifiable(connection, iLinked);
} catch (IOException e) {
OLogManager.instance().error(this, "Cannot write against channel", e);
}
}
}
@Override
public void parseLinked(ODocument iRootRecord, OIdentifiable iLinked, Object iUserObject, String iFieldName, OFetchContext iContext) throws OFetchException {
if (iLinked instanceof ORecord)
sendRecord((ORecord) iLinked);
}
@Override
public void parseLinkedCollectionValue(ODocument iRootRecord, OIdentifiable iLinked, Object iUserObject, String iFieldName, OFetchContext iContext) throws OFetchException {
if (iLinked instanceof ORecord)
sendRecord((ORecord) iLinked);
}
};
final OFetchContext context = new ORemoteFetchContext();
OFetchHelper.fetch(doc, doc, OFetchHelper.buildFetchPlan(""), listener, context, "");
}
use of com.orientechnologies.orient.core.fetch.remote.ORemoteFetchListener in project orientdb by orientechnologies.
the class OLiveCommandResultListener method result.
@Override
public boolean result(final Object iRecord) {
final ONetworkProtocolBinary protocol = ((ONetworkProtocolBinary) connection.getProtocol());
if (empty.compareAndSet(true, false))
try {
protocol.sendOk(connection, sessionId);
} catch (IOException ignored) {
}
try {
fetchRecord(iRecord, new ORemoteFetchListener() {
@Override
protected void sendRecord(ORecord iLinked) {
if (!alreadySent.contains(iLinked.getIdentity())) {
alreadySent.add(iLinked.getIdentity());
try {
// CACHE IT ON THE CLIENT
protocol.channel.writeByte((byte) 2);
protocol.writeIdentifiable(connection, iLinked);
} catch (IOException e) {
OLogManager.instance().error(this, "Cannot write against channel", e);
}
}
}
});
alreadySent.add(((OIdentifiable) iRecord).getIdentity());
// ONE MORE RECORD
protocol.channel.writeByte((byte) 1);
protocol.writeIdentifiable(connection, ((OIdentifiable) iRecord).getRecord());
protocol.channel.flush();
} catch (IOException e) {
return false;
}
return true;
}
use of com.orientechnologies.orient.core.fetch.remote.ORemoteFetchListener in project orientdb by orientechnologies.
the class ONetworkProtocolBinary method readRecordIfVersionIsNotLatest.
protected void readRecordIfVersionIsNotLatest(final OClientConnection connection) throws IOException {
setDataCommandInfo(connection, "Load record if version is not latest");
if (!isConnectionAlive(connection))
return;
final ORecordId rid = channel.readRID();
final int recordVersion = channel.readVersion();
final String fetchPlanString = channel.readString();
boolean ignoreCache = channel.readByte() == 1;
if (rid.getClusterId() == 0 && rid.getClusterPosition() == 0) {
// @COMPATIBILITY 0.9.25
// SEND THE DB CONFIGURATION INSTEAD SINCE IT WAS ON RECORD 0:0
OFetchHelper.checkFetchPlanValid(fetchPlanString);
beginResponse();
try {
sendOk(connection, clientTxId);
channel.writeByte((byte) 1);
final byte[] storageStream = connection.getDatabase().getStorage().callInLock(new Callable<byte[]>() {
@Override
public byte[] call() throws Exception {
return connection.getDatabase().getStorage().getConfiguration().toStream(connection.getData().protocolVersion);
}
}, false);
if (connection.getData().protocolVersion <= OChannelBinaryProtocol.PROTOCOL_VERSION_27) {
channel.writeBytes(storageStream);
channel.writeVersion(0);
channel.writeByte(OBlob.RECORD_TYPE);
} else {
channel.writeByte(OBlob.RECORD_TYPE);
channel.writeVersion(0);
channel.writeBytes(storageStream);
}
// NO MORE RECORDS
channel.writeByte((byte) 0);
} finally {
endResponse(connection);
}
} else {
final ORecord record = connection.getDatabase().loadIfVersionIsNotLatest(rid, recordVersion, fetchPlanString, ignoreCache);
beginResponse();
try {
sendOk(connection, clientTxId);
if (record != null) {
// HAS RECORD
channel.writeByte((byte) 1);
byte[] bytes = getRecordBytes(connection, record);
int length = trimCsvSerializedContent(connection, bytes);
channel.writeByte(ORecordInternal.getRecordType(record));
channel.writeVersion(record.getVersion());
channel.writeBytes(bytes, length);
if (fetchPlanString.length() > 0) {
// PLAN
if (record instanceof ODocument) {
final OFetchPlan fetchPlan = OFetchHelper.buildFetchPlan(fetchPlanString);
final Set<ORecord> recordsToSend = new HashSet<ORecord>();
final ODocument doc = (ODocument) record;
final OFetchListener listener = new ORemoteFetchListener() {
@Override
protected void sendRecord(ORecord iLinked) {
recordsToSend.add(iLinked);
}
};
final OFetchContext context = new ORemoteFetchContext();
OFetchHelper.fetch(doc, doc, fetchPlan, listener, context, "");
// SEND RECORDS TO LOAD IN CLIENT CACHE
for (ORecord d : recordsToSend) {
if (d.getIdentity().isValid()) {
// CLIENT CACHE
channel.writeByte((byte) 2);
// RECORD. IT ISN'T PART OF THE RESULT SET
writeIdentifiable(connection, d);
}
}
}
}
}
// NO MORE RECORDS
channel.writeByte((byte) 0);
} finally {
endResponse(connection);
}
}
}
Aggregations