Всем здратути. А работал ли кто с сабжем?
Приспичило мне тут погуглить на предмет embedded NoSQL for C/C++. Нашёлся сабж. Прям идеально что хотел: безо всяких там json-заморочек, тупая бинарщина – кусок памяти под ключ, кусок памяти под значение; есть Hash DB, B+ Tree DB и Fixed-length DB; что ещё здоровому человеку может быть нужно?
Плюс, судя по нагугленному, по скорости его ещё никто не переплюнул, так что вопрос про альтернативы – чисто на всякий случай. Ихний же KyotoCabinet не интересен: (1) GPL; (2) там нет Fixed-length DB; (3) на SO гуглилось что TC в некоторых аспектах всё равно лучше. А тривиальные RAII-обёртки вокруг евойного сишного API любой дурак напишет.
Но непонятно про транзакции. Что случится, если я буду писать без явных вызовов start transaction (…dbtranbegin()) & commit (…dbtrancommit())? Мне не нужно batch writes, я собираюсь писать по одной записи за раз, но нужно чтобы в момент выхода из функции записи база была на диске и консистентная. Т.е. хочу implicit transactions. Вызвать start transaction & commit явно мне не проблема, но мечтается обойтись без WAL-файла (т.к. это замедление).
По этой теме в доках есть только два пассажа:
(1) «database file is not corrupted even under catastrophic situation» – но corruption тут можно трактовать по-всякому; так есть поведение implicit tranasction или нет?
(2) В функциях …dbopen() для всех типов баз есть флаг HDBOTSYNC, «which means every transaction synchronizes updated contents with the device». Будет ли этот флаг действовать, если я НЕ стартую транзакцию явно?