{{breadcrumbs}}
HUB / lib_mfdb_validator.sh
lib_mfdb_validator.sh
- Runtime
- Bash
- Category
- Bash
- Path
- /storage/emulated/0/Projects/Management/Libraries/sh/lib_mfdb_validator.sh
FILE // lib_mfdb_validator.sh
#!/bin/bash
# # Library: lib_mfdb_validator.sh
# MFDB Version: 1.3.1
# Format_Creator: Elton Boehnen
# Status: OFFICIAL - v1.3.1
# Date: 2026-05-06
#===============================================================================
# Library: lib_mfdb_validator.sh
# Jurisdiction: ["BASH", "CORE_COMMAND"]
# Status: OFFICIAL — Core-Command/Lib (v1.2)
# Author: Elton Boehnen
# Version: 1.2 (OFFICIAL) Archive Transport Update
# Date: 2026-04-26
# Description: MFDB (Multifile Database) validation library for Bash/Termux.
# v1.2 adds support for validating .mfdb.zip archives.
#===============================================================================
set -o pipefail
set -o nounset
# Source base validator if not already loaded
_MFDB_VAL_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
if ! declare -f bejson_validator_validate_file > /dev/null 2>&1; then
# shellcheck source=./lib_bejson_validator.sh
source "${_MFDB_VAL_DIR}/lib_bejson_validator.sh"
fi
#-------------------------------------------------------------------------------
# Error codes (30–49)
#-------------------------------------------------------------------------------
[[ -v E_MFDB_NOT_MANIFEST ]] || readonly E_MFDB_NOT_MANIFEST=30
[[ -v E_MFDB_NOT_ENTITY_FILE ]] || readonly E_MFDB_NOT_ENTITY_FILE=31
[[ -v E_MFDB_MANIFEST_RECORDS_TYPE ]] || readonly E_MFDB_MANIFEST_RECORDS_TYPE=32
[[ -v E_MFDB_ENTITY_NOT_FOUND ]] || readonly E_MFDB_ENTITY_NOT_FOUND=33
[[ -v E_MFDB_ENTITY_NAME_MISMATCH ]] || readonly E_MFDB_ENTITY_NAME_MISMATCH=34
[[ -v E_MFDB_DUPLICATE_ENTRY ]] || readonly E_MFDB_DUPLICATE_ENTRY=35
[[ -v E_MFDB_NO_PARENT_HIERARCHY ]] || readonly E_MFDB_NO_PARENT_HIERARCHY=36
[[ -v E_MFDB_MANIFEST_NOT_FOUND ]] || readonly E_MFDB_MANIFEST_NOT_FOUND=37
[[ -v E_MFDB_BIDIRECTIONAL_FAIL ]] || readonly E_MFDB_BIDIRECTIONAL_FAIL=38
[[ -v E_MFDB_FK_UNRESOLVED ]] || readonly E_MFDB_FK_UNRESOLVED=39
[[ -v E_MFDB_MISSING_REQUIRED_FIELD ]] || readonly E_MFDB_MISSING_REQUIRED_FIELD=40
[[ -v E_MFDB_NULL_REQUIRED ]] || readonly E_MFDB_NULL_REQUIRED=41
[[ -v E_MFDB_INVALID_ARCHIVE ]] || readonly E_MFDB_INVALID_ARCHIVE=42
#-------------------------------------------------------------------------------
# Validation state
#-------------------------------------------------------------------------------
__MFDB_VALIDATION_ERRORS=()
__MFDB_VALIDATION_WARNINGS=()
mfdb_validator_reset_state() {
__MFDB_VALIDATION_ERRORS=()
__MFDB_VALIDATION_WARNINGS=()
}
__mfdb_add_error() {
local message="$1"
local location="${2:-}"
__MFDB_VALIDATION_ERRORS+=("ERROR | Location: $location | Message: $message")
}
mfdb_validator_has_errors() { [[ ${#__MFDB_VALIDATION_ERRORS[@]} -gt 0 ]]; }
mfdb_validator_get_errors() { printf '%s\n' "${__MFDB_VALIDATION_ERRORS[@]+"${__MFDB_VALIDATION_ERRORS[@]}"}"; }
#-------------------------------------------------------------------------------
# Archive Validation
#-------------------------------------------------------------------------------
# mfdb_validator_validate_archive <archive_path>
mfdb_validator_validate_archive() {
local archive_path="$1"
mfdb_validator_reset_state
if [[ ! -f "$archive_path" ]]; then
__mfdb_add_error "Archive not found: $archive_path" "File System"
return $E_MFDB_MANIFEST_NOT_FOUND
fi
if ! unzip -l "$archive_path" | grep -q "104a.mfdb.bejson"; then
__mfdb_add_error "Missing 104a.mfdb.bejson manifest inside archive" "Zip Structure"
return $E_MFDB_INVALID_ARCHIVE
fi
return 0
}
#-------------------------------------------------------------------------------
# Main validation
#-------------------------------------------------------------------------------
mfdb_validator_validate_manifest() {
local manifest_path="$1"
mfdb_validator_reset_state
[[ ! -f "$manifest_path" ]] && return $E_MFDB_MANIFEST_NOT_FOUND
bejson_validator_validate_file "$manifest_path" || return $E_MFDB_NOT_MANIFEST
local rt=$(jq -r '.Records_Type | @json' "$manifest_path" 2>/dev/null)
[[ "$rt" != '["mfdb"]' ]] && return $E_MFDB_MANIFEST_RECORDS_TYPE
return 0
}
#-------------------------------------------------------------------------------
# Dependency check
#-------------------------------------------------------------------------------
mfdb_validator_check_dependencies() {
if ! command -v unzip >/dev/null 2>&1; then
echo "ERROR: Required command 'unzip' not found" >&2
return 1
fi
if ! command -v jq >/dev/null 2>&1; then
echo "ERROR: Required command 'jq' not found" >&2
return 1
fi
return 0
}
# Export functions
export -f mfdb_validator_validate_archive
export -f mfdb_validator_validate_manifest
export -f mfdb_validator_reset_state
export -f mfdb_validator_has_errors
export -f mfdb_validator_get_errors
export -f mfdb_validator_check_dependencies