oidsDb.delete(txn, encodeLong(oid));
} else {
oidsDb.put(txn, encodeLong(oid), oidValues[i]);
}
}
DbCursor cursor = namesDb.openCursor(txn);
try {
for (int i = 0; i < names.length; i++) {
String name = names[i];
if (name == null) {
throw new IllegalArgumentException(
"The names must not be null");
}
long value = nameValues[i];
if (value < -1) {
throw new IllegalArgumentException(
"The name values must not be less than -1");
}
String nextName = cursor.findNext(encodeString(name))
? decodeString(cursor.getKey()) : null;
BindingKey nextKey = BindingKey.getAllowLast(nextName);
if (value != -1) {
/* Set -- next name must be write locked */
checkLocked(nodeInfo, nextKey, true);
if (!name.equals(nextName)) {
lock(nodeInfo, BindingKey.get(name), true,
"commit");
}
namesDb.put(
txn, encodeString(name), encodeLong(value));
} else if (!name.equals(nextName)) {
/* Already removed -- next name must be read locked */
checkLocked(nodeInfo, nextKey, false);
} else {
/* Remove -- name and next name must be write locked */
checkLocked(nodeInfo, nextKey, true);
checkLocked(nodeInfo,
BindingKey.getAllowLast(
cursor.findNext() ?
decodeString(cursor.getKey()) : null),
true);
namesDb.delete(txn, encodeString(name));
releaseLock(nodeInfo, nextKey, "commit");
}
}
} finally {
cursor.close();
}
txnDone = true;
txn.commit();
} finally {
if (!txnDone) {