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()