Introduce AtomicFiles

Introduce AtomicFile and a test of this module to the code.

AtomicFile is like File, except all writes go to temporary files until
the class method finalize_all () is called and the temporary files are
copied over the real files. If any writes fail, like when there is no
more space on the filesystem, none of the files in the database will be
modified.

Since we need version 1.00 of libfiu, I have only added it to the debian
testing container, which includes libfiu-1.00 in the default repository.

Related to #155
This commit is contained in:
Shaun Ruffell 2020-02-16 12:52:10 -06:00 committed by lauft
parent 6db1d2b859
commit 8e99c07d85
9 changed files with 1039 additions and 6 deletions

View file

@ -8,6 +8,24 @@ if(POLICY CMP0037 AND ${CMAKE_VERSION} VERSION_LESS "3.11.0")
cmake_policy(SET CMP0037 OLD)
endif()
# If this is a debug build, check if we have libfiu installed and available on
# the system. If so, we will be able to use it to add additional tests of the
# failure conditions
if (uppercase_CMAKE_BUILD_TYPE MATCHES "DEBUG")
find_library(FIU_ENABLE fiu)
if (FIU_ENABLE)
message (STATUS "libfiu found")
add_definitions (-DFIU_ENABLE)
set (test_LIBS fiu ${TIMEW_LIBRARIES})
else (FIU_ENABLE)
message (STATUS "NOTE: install libfiu to run additional tests")
set (test_LIBS ${TIMEW_LIBRARIES})
endif (FIU_ENABLE)
else (uppercase_CMAKE_BUILD_TYPE MATCHES "DEBUG")
set (test_LIBS ${TIMEW_LIBRARIES})
endif (uppercase_CMAKE_BUILD_TYPE MATCHES "DEBUG")
include_directories (${CMAKE_SOURCE_DIR}
${CMAKE_SOURCE_DIR}/src
${CMAKE_SOURCE_DIR}/src/libshared/src
@ -16,7 +34,7 @@ include_directories (${CMAKE_SOURCE_DIR}
include_directories (${CMAKE_INSTALL_PREFIX}/include)
link_directories(${CMAKE_INSTALL_PREFIX}/lib)
set (test_SRCS data.t exclusion.t helper.t interval.t range.t rules.t util.t TagInfoDatabase.t)
set (test_SRCS atomic data.t exclusion.t helper.t interval.t range.t rules.t util.t TagInfoDatabase.t)
add_custom_target (test ./run_all --verbose
DEPENDS ${test_SRCS}
@ -24,7 +42,7 @@ add_custom_target (test ./run_all --verbose
foreach (src_FILE ${test_SRCS})
add_executable (${src_FILE} "${src_FILE}.cpp" test.cpp)
target_link_libraries (${src_FILE} timew libshared ${TIMEW_LIBRARIES})
target_link_libraries (${src_FILE} timew libshared ${test_LIBS})
endforeach (src_FILE)
configure_file(run_all run_all COPYONLY)