// Платформенные заметки: tmpfs/ENOSPC, WSL1/ENOLCK, заметки о Windows
// Раздел учебника: Том V, глава 28, «Платформенные нюансы», §28.2/§28.3.
// Что демонстрирует: устойчивую обработку ошибок геометрии на экзотичных
//   файловых системах; сами сниппеты-оговорки приведены в тексте учебника.
//
// Краткие заметки (полные сниппеты — в §28.2/§28.3):
//   - tmpfs (например /dev/shm): размер ограничен памятью; mdbx_env_set_geometry
//     с большим upper может завершиться ENOSPC/EDQUOT при росте файла.
//   - WSL1: старые версии не поддерживают fcntl(F_SETLK) на некоторых ФС —
//     возможен MDBX_ENOLCK; обход — хранить БД на ext4 внутри WSL.
//   - Windows: 32-битные сборки требуют линковки с флагом LARGEADDRESSAWARE
//     для поддержки больших адресных пространств и БД > 2 ГБ.
//
// Сборка: g++ -std=c++17 -I<libmdbx-include> -I../common 35-platform-notes.c++ -lmdbx
// Запуск: ./35-platform-notes
// Ожидаемый вывод:
//   geometry probe: <result>
//   ok: platform error handling shown
// При сбое — сообщение в stderr и exit 1.
//
// SPDX-License-Identifier: Apache-2.0

#include <iostream>
#include <string>

#include "common.h++"
#include <mdbx.h++>

int main() {
  try {
    const std::string path = std::string(example::tmpdir()) + "/mdbx-35-platform-notes.mdbx";
    mdbx::env::remove(path);
    mdbx::env_managed env = example::env_open(path);

    // Проверка границ геометрии не обязана падать: запрашиваем «абсурдную»
    // верхнюю границу и аккуратно обрабатываем результат.
    mdbx::env::geometry probe;
#if INTPTR_MAX > 0x7fffFFFFl
    probe.size_upper = intptr_t(8) * mdbx::env::geometry::TB;
#else
    probe.size_upper = mdbx::env::geometry::maximal_value;
#endif
    try {
      env.set_geometry(probe);
      std::cout << "geometry probe: accepted\n";
    } catch (const std::exception &ex) {
      // На tmpfs/WSL1/32-битной Windows это может завершиться ошибкой —
      // для примера важно, что она перехвачена, а не уронила процесс.
      std::cout << "geometry probe: rejected (" << ex.what() << ")\n";
    }

    std::cout << "ok: platform error handling shown\n";
    return EXIT_SUCCESS;
  } catch (const std::exception &ex) {
    std::cerr << "error: " << ex.what() << "\n";
    return EXIT_FAILURE;
  }
}