# Copyright 1999-2026 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2

EAPI=8

RUST_MIN_VER="1.85.0"
RUST_REQ_USE="rustfmt"
LLVM_COMPAT=( {16..22} )
POSTGRES_COMPAT=( {14..18} )
POSTGRES_USEDEP="server"

inherit cargo edo git-r3 llvm-r2 postgres-multi

DESCRIPTION="Anonymization & Data Masking for PostgreSQL"
HOMEPAGE="https://gitlab.com/dalibo/postgresql_anonymizer"
EGIT_REPO_URI="https://gitlab.com/dalibo/${PN}.git"

LICENSE="Apache-2.0 BSD ISC MIT POSTGRESQL Unicode-DFS-2016"
SLOT="0"
REQUIRED_USE="${POSTGRES_REQ_USE} ${LLVM_REQUIRED_USE}"

RDEPEND="${POSTGRES_DEP}"
BDEPEND=">=dev-util/cargo-pgrx-0.18.0
	virtual/pkgconfig
	$(llvm_gen_dep 'llvm-core/clang:${LLVM_SLOT}')"

DOCS=( {CHANGELOG,NEWS,README}.md )

QA_FLAGS_IGNORED="usr/lib.*/postgresql-.*/lib.*/anon.so"

pkg_setup() {
	llvm-r2_pkg_setup
	postgres-multi_pkg_setup
	rust_pkg_setup
}

src_unpack() {
	git-r3_src_unpack
	cargo_live_src_unpack
}

src_prepare() {
	# apply patches before postgres-multi_src_prepare copies src for each PostgreSQL version
	# eapply "${FILESDIR}/${PN}"-3.1.1-Makefile.patch
	eapply "${FILESDIR}/${PN}"-3.1.1-tests.patch
	postgres-multi_src_prepare
}

postgresql_anonymizer_compile() {
	export PGRX_HOME="${T}/pgrx-pg${PG_SLOT}"
	edo cargo pgrx init --pg"${PG_SLOT}" "${PG_CONFIG}"
	emake extension PGVER="pg${PG_SLOT}" PG_CONFIG="${PG_CONFIG}"
}

src_compile() {
	postgres-multi_foreach postgresql_anonymizer_compile
}

# the pgrx test suite installs the extension into PostgreSQL's system
# directories and cannot run inside the Portage sandbox.  Run the upstream
# SQL regression suite against a temporary PostgreSQL instance instead.
# This currently requires extension_control_path, which is available since 18.
postgresql_anonymizer_test() {
	[[ ${PG_SLOT} == 18 ]] || return 0

	local db port extensiondir libdir pkgdir
	db="${T}/pgsql-${PG_SLOT}"
	port="54${PG_SLOT}"
	pkgdir="${PWD}/target/release/anon-pg${PG_SLOT}"
	extensiondir="${pkgdir}$("${PG_CONFIG}" --sharedir)/extension"
	libdir="${pkgdir}$("${PG_CONFIG}" --pkglibdir)"

	sed -i -e "s/@PGPORT@/${port}/g" tests/sql/test_replica_masking.sql \
		tests/expected/test_replica_masking.out || die

	edo initdb -U portage -A trust -D "${db}"
	edo pg_ctl -w -D "${db}" start -o "-h 127.0.0.1 -k '${T}' -p ${port} \
		-c wal_level=logical \
		-c extension_control_path='${extensiondir}:\$system' \
		-c dynamic_library_path='${libdir}:\$libdir'"
	emake installcheck INSTALLCHECK_DEPS= PGVER="pg${PG_SLOT}" PGHOST="${T}" PGPORT="${port}"
	edo pg_ctl -w -D "${db}" stop
}

src_test() {
	postgres-multi_foreach postgresql_anonymizer_test
}

postgresql_anonymizer_install() {
	local PG_PKGLIBDIR PG_SHAREDIR

	PG_PKGLIBDIR="$("${PG_CONFIG}" --pkglibdir)"
	PG_SHAREDIR="$("${PG_CONFIG}" --sharedir)"

	dodir "${PG_SHAREDIR}"/extension "${PG_PKGLIBDIR}"

	emake install PG_CONFIG="${PG_CONFIG}" \
		PG_PKGLIBDIR="${ED}/${PG_PKGLIBDIR}" \
		PG_SHAREDIR="${ED}/${PG_SHAREDIR}" \
		PGVER="pg${PG_SLOT}" \
		TARGET_PKGLIBDIR="target/release/anon-pg${PG_SLOT}/${PG_PKGLIBDIR}" \
		TARGET_SHAREDIR="target/release/anon-pg${PG_SLOT}/${PG_SHAREDIR}"
}

src_install() {
	einstalldocs
	postgres-multi_foreach postgresql_anonymizer_install
}