Files
cppbessot/cmake/scripts/cppbessotDbActionCommon.cmake
T

169 lines
5.9 KiB
CMake

cmake_minimum_required(VERSION 3.16)
include("${CMAKE_CURRENT_LIST_DIR}/../dbActionShared.cmake")
function(cppbessot_db_action_require_var var_name)
if(NOT DEFINED ${var_name} OR "${${var_name}}" STREQUAL "")
message(FATAL_ERROR "Required variable `${var_name}` is missing.")
endif()
endfunction()
function(cppbessot_db_action_resolve_project_path out_var input_path)
cppbessot_db_action_require_var(CPPBESSOT_PROJECT_SOURCE_DIR)
if(IS_ABSOLUTE "${input_path}")
set(_resolved "${input_path}")
else()
set(_resolved "${CPPBESSOT_PROJECT_SOURCE_DIR}/${input_path}")
endif()
get_filename_component(_resolved "${_resolved}" ABSOLUTE)
set(${out_var} "${_resolved}" PARENT_SCOPE)
endfunction()
function(cppbessot_db_action_validate_schema_dir_name schema_dir)
_cppbessot_db_action_validate_basename(
"${schema_dir}"
"Schema directory name"
"CPPBESSOT_WORKDIR")
endfunction()
function(cppbessot_db_action_get_schema_dir_path out_var schema_dir)
cppbessot_db_action_validate_schema_dir_name("${schema_dir}")
cppbessot_db_action_resolve_project_path(_workdir "${CPPBESSOT_WORKDIR}")
set(${out_var} "${_workdir}/${schema_dir}" PARENT_SCOPE)
endfunction()
function(cppbessot_db_action_assert_schema_dir_ready schema_dir)
cppbessot_db_action_get_schema_dir_path(_schema_dir_path "${schema_dir}")
if(NOT IS_DIRECTORY "${_schema_dir_path}")
message(FATAL_ERROR "Schema directory does not exist: ${_schema_dir_path}")
endif()
set(_openapi_file "${_schema_dir_path}/openapi/openapi.yaml")
if(NOT EXISTS "${_openapi_file}")
message(FATAL_ERROR "OpenAPI file does not exist: ${_openapi_file}")
endif()
endfunction()
function(cppbessot_db_action_validate_migration_dir_name migration_dir)
_cppbessot_db_action_validate_basename(
"${migration_dir}"
"Migration directory name"
"CPPBESSOT_WORKDIR/migrations")
endfunction()
function(cppbessot_db_action_get_migration_dir_path out_var migration_dir)
cppbessot_db_action_validate_migration_dir_name("${migration_dir}")
cppbessot_db_action_resolve_project_path(_workdir "${CPPBESSOT_WORKDIR}")
set(${out_var} "${_workdir}/migrations/${migration_dir}" PARENT_SCOPE)
endfunction()
function(cppbessot_db_action_assert_migration_dir_exists migration_dir)
cppbessot_db_action_get_migration_dir_path(_migration_dir_path "${migration_dir}")
if(NOT IS_DIRECTORY "${_migration_dir_path}")
message(FATAL_ERROR "Migration directory does not exist: ${_migration_dir_path}")
endif()
endfunction()
function(cppbessot_db_action_validate_db_target db_target)
_cppbessot_db_action_validate_db_target_impl("${db_target}")
endfunction()
function(cppbessot_db_action_backend_subdir out_var backend)
if("${backend}" STREQUAL "sqlite")
set(${out_var} "sqlite" PARENT_SCOPE)
return()
endif()
if("${backend}" STREQUAL "postgre")
set(${out_var} "postgre" PARENT_SCOPE)
return()
endif()
message(FATAL_ERROR "Unsupported backend `${backend}`.")
endfunction()
function(cppbessot_db_action_collect_nonempty_sql_files out_var sql_dir)
if(NOT IS_DIRECTORY "${sql_dir}")
set(${out_var} "" PARENT_SCOPE)
return()
endif()
file(GLOB _candidate_files "${sql_dir}/*.sql")
list(SORT _candidate_files)
set(_sql_files)
foreach(_candidate IN LISTS _candidate_files)
file(READ "${_candidate}" _contents)
string(STRIP "${_contents}" _trimmed)
if(NOT "${_trimmed}" STREQUAL "")
list(APPEND _sql_files "${_candidate}")
endif()
endforeach()
set(${out_var} "${_sql_files}" PARENT_SCOPE)
endfunction()
function(cppbessot_db_action_is_migration_sql_file out_var sql_file)
get_filename_component(_filename "${sql_file}" NAME)
if("${_filename}" MATCHES "-[0-9]+-(pre|post)\\.sql$")
set(${out_var} TRUE PARENT_SCOPE)
return()
endif()
set(${out_var} FALSE PARENT_SCOPE)
endfunction()
function(cppbessot_db_action_collect_schema_sql_files out_var sql_dir)
cppbessot_db_action_collect_nonempty_sql_files(_candidate_files "${sql_dir}")
set(_sql_files)
foreach(_candidate IN LISTS _candidate_files)
cppbessot_db_action_is_migration_sql_file(_is_migration_sql "${_candidate}")
if(NOT _is_migration_sql)
list(APPEND _sql_files "${_candidate}")
endif()
endforeach()
set(${out_var} "${_sql_files}" PARENT_SCOPE)
endfunction()
function(cppbessot_db_action_migration_sort_key out_var sql_file)
get_filename_component(_filename "${sql_file}" NAME)
string(REGEX REPLACE "-([0-9]+)-pre\\.sql$" "-\\1-0-pre.sql" _sort_key "${_filename}")
string(REGEX REPLACE "-([0-9]+)-post\\.sql$" "-\\1-1-post.sql" _sort_key "${_sort_key}")
set(${out_var} "${_sort_key}" PARENT_SCOPE)
endfunction()
function(cppbessot_db_action_collect_migration_sql_files out_var sql_dir)
cppbessot_db_action_collect_nonempty_sql_files(_candidate_files "${sql_dir}")
set(_keyed_files)
foreach(_candidate IN LISTS _candidate_files)
cppbessot_db_action_is_migration_sql_file(_is_migration_sql "${_candidate}")
if(_is_migration_sql)
cppbessot_db_action_migration_sort_key(_sort_key "${_candidate}")
list(APPEND _keyed_files "${_sort_key}|${_candidate}")
endif()
endforeach()
list(SORT _keyed_files)
set(_sql_files)
foreach(_keyed_file IN LISTS _keyed_files)
string(REGEX REPLACE "^[^|]+\\|" "" _sql_file "${_keyed_file}")
list(APPEND _sql_files "${_sql_file}")
endforeach()
set(${out_var} "${_sql_files}" PARENT_SCOPE)
endfunction()
function(cppbessot_db_action_require_nonempty_sql_dir sql_dir failure_prefix)
cppbessot_db_action_collect_schema_sql_files(_sql_files "${sql_dir}")
if(NOT _sql_files)
message(FATAL_ERROR "${failure_prefix}: no non-empty SQL files found under ${sql_dir}")
endif()
endfunction()
function(cppbessot_db_action_find_program_or_fail out_var program_name hint)
find_program(_program "${program_name}")
if(NOT _program)
message(FATAL_ERROR "Missing required program `${program_name}`. ${hint}")
endif()
set(${out_var} "${_program}" PARENT_SCOPE)
endfunction()