如果没有索引,OrientDB ORecordHookAbstract将触发onRecordAfterRead两次

时间:2015-02-27 10:44:05

标签: hook orientdb

我正在使用OrientDB中的钩子功能来对调用者“透明地”实现某些文档字段的加密。 基本上这个过程是:

1:当onRecordBeforeCreate或onRecordBeforeUpdate事件触发时,我们对某些数据字段应用加密并在创建或更新之前更改文档

byte[] data = doc.field("data");
byte[] encrypted = encrypt(data);
doc.field("data", encrypted);

2:当onRecordAfterRead触发时,我们从文档字段中获取加密数据,解密它们,然后使用解密数据再次更改文档字段。

byte[] encrypted = doc.field("data");
byte[] decrypted = decrypt(encrypted);
doc.field("data", decrypted);

问题是事件onRecordAfterRead是两次触发并且第一次数据正确解密(因为是加密的)但是第二次解密失败因为我们已经解密了它,因此文档“加载”失败

如果我执行加载文档的查询使用过滤器(where子句)中的文档的某些字段,则会发生这种情况。 例如,以下查询不会触发问题:

select count from Data;

但以下查询会触发问题:

select from Data where status ="processed";

这是因为我在状态字段中没有索引。如果我添加一个索引,那么它只会触发一次事件。所以这与索引的使用与否有关。 如果OrientDB在执行查询时“扫描”文档,是否应该触发事件?它不应该只在匹配的文件实际加载时才开火吗?有办法解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

onRecordAfterRead应该被调用一次,如果被多次调用应该是一个bug,你可以在https://github.com/orientechnologies/orientdb/issues上用一个重现问题的测试用例来报告它。