Я решил использовать функцию сжатия Berkeley DB для оптимизации размера и частоты обращений к кешу моих баз данных после того, как некоторые записи были изменены (сокращены), оставляя «дыры» в базе данных.
Однако это не работает. Даже с этим очень простым сокращенным фрагментом кода:
if (db->open(db, NULL, dbFile, NULL, DB_HASH, DB_CREATE | DB_TRUNCATE, 0)) {
// Error...
}
if (res = db->compact(db, NULL, NULL, NULL, NULL, DB_FREE_SPACE, NULL)) {
db->err(db, res, "Compacting failed");
}
Я пытался указать пятый параметр или не указывать флаг, но все равно он завершается ошибкой с EINVAL (код 22) каждый раз:
Сжатие не удалось: неверный аргумент
(очень плохо, что нет точного сообщения об ошибке; у большинства ошибок БД Berkeley они есть)
Это работает, если я заменю DB_HASH на DB_BTREE, поэтому я считаю, что это как-то связано с использованием формата hash db. Однако, согласно документации , сжатие хеш-таблиц должно работать очень хорошо.
Кто-нибудь понял, что может вызвать эту ошибку?
PS: я использую Berkeley DB 4.5.20.