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

# PostgreSQL 8.2 (diciembre de 2011, sin soporte upstream desde 2011) revivido
# para el toolchain de 2026: gcc-15 + glibc-2.43.  Derivado del ebuild original
# de Gentoo (postgresql-9.0.19.ebuild, EAPI 6), reescrito a EAPI 8 porque
# eutils/user/versionator ya no existen en el arbol.
#
# Solo se exponen las USE 'server' y 'pg_legacytimestamp'.  readline, zlib y nls
# van siempre activadas porque es lo que tenia el binario que hay en produccion
# (los mensajes del servidor salen en espanol); ssl, perl, ldap, python, tcl,
# kerberos, pam, uuid y xml se han eliminado del ebuild.

EAPI=8

inherit flag-o-matic systemd tmpfiles

DESCRIPTION="PostgreSQL RDBMS (legacy 8.2 slot, server only)"
HOMEPAGE="https://www.postgresql.org/"
SRC_URI="https://ftp.postgresql.org/pub/source/v${PV}/postgresql-${PV}.tar.bz2"

LICENSE="POSTGRESQL GPL-2"
SLOT="8.2"
KEYWORDS="amd64 x86"

IUSE="+pg_legacytimestamp +server"

# La suite de regresion de 8.2 no pasa dentro del entorno de Portage.
RESTRICT="test"

CDEPEND="
	>=app-eselect/eselect-postgresql-2.0
	acct-group/postgres
	acct-user/postgres
	sys-apps/less
	sys-libs/readline:0=
	virtual/libcrypt:=
	virtual/libintl
	virtual/zlib:=
"
DEPEND="${CDEPEND}"
BDEPEND="sys-devel/gettext"
RDEPEND="${CDEPEND}
	!dev-db/postgresql-base:${SLOT}
	!dev-db/postgresql-docs:${SLOT}
	!dev-db/postgresql-server:${SLOT}
"

src_prepare() {
	default

	# El socket unix de Gentoo esta en /run/postgresql, no en /tmp.
	sed -e "s|\(PGSOCKET_DIR[[:space:]]\+\)\"/tmp\"|\1\"${EPREFIX}/run/postgresql\"|" \
		-i src/include/pg_config_manual.h || die "no se pudo fijar PGSOCKET_DIR"
	grep -q "${EPREFIX}/run/postgresql" src/include/pg_config_manual.h \
		|| die "PGSOCKET_DIR no quedo apuntando a /run/postgresql"

	# El tarball ya trae los parsers generados (gram.c, scan.c, preproc.c...).
	# Las gramaticas de 2006 no pasan por bison-3/flex-2.6, asi que envejecemos
	# las fuentes .y/.l para que make no intente regenerarlas nunca.
	find . \( -name '*.y' -o -name '*.l' \) -exec touch -d '@1' {} + \
		|| die "no se pudo envejecer las gramaticas"
}

src_configure() {
	# --- Adaptacion del codigo de 2006 al toolchain de 2026 -----------------
	#
	# gcc-15 compila C23 por defecto: ahi 'bool', 'true' y 'false' son palabras
	# reservadas y chocan con el typedef de src/include/c.h, y las definiciones
	# de funcion al estilo K&R desaparecen.  gnu17 es el ultimo estandar que
	# acepta este codigo tal cual.
	append-cflags -std=gnu17

	# gcc-14 convirtio en errores duros varios diagnosticos que en 2006 eran
	# avisos normales.  Sin esto ni siquiera los tests de ./configure compilan,
	# con lo que configure deduciria mal media docena de capacidades del sistema.
	append-cflags $(test-flags-CC \
		-Wno-error=implicit-function-declaration \
		-Wno-error=implicit-int \
		-Wno-error=int-conversion \
		-Wno-error=incompatible-pointer-types \
		-Wno-error=return-mismatch \
		-Wno-error=declaration-missing-parameter-type \
		-Wno-error=builtin-declaration-mismatch \
		-Wno-error=format-security)

	# gcc-10 puso -fno-common por defecto; este arbol declara simbolos comunes.
	append-cflags -fcommon

	# PostgreSQL no incorporo -fwrapv a su configure hasta 8.3: sin el, gcc
	# moderno elimina comprobaciones de desbordamiento de enteros con signo.
	# -fno-strict-aliasing y -fno-aggressive-loop-optimizations son por el mismo
	# motivo (el codigo hace type punning y bucles que gcc puede "optimizar" mal).
	append-cflags -fwrapv -fno-strict-aliasing -fno-aggressive-loop-optimizations

	# El perfil 23.0 activa -D_FORTIFY_SOURCE=3, que usa tamanos de objeto
	# dinamicos y no se lleva bien con los arrays flexibles falsos (char x[1])
	# que usa el 8.2 por todas partes.  Bajamos al nivel 2, que es con el que se
	# construyo el binario que hay en produccion.
	append-cppflags -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2

	# LTO sobre este arbol no es una apuesta razonable.
	filter-lto

	export LDFLAGS_SL="${LDFLAGS}"
	export LDFLAGS_EX="${LDFLAGS}"

	local PO="${EPREFIX%/}"

	econf \
		--prefix="${PO}/usr/$(get_libdir)/postgresql-${SLOT}" \
		--datadir="${PO}/usr/share/postgresql-${SLOT}" \
		--includedir="${PO}/usr/include/postgresql-${SLOT}" \
		--mandir="${PO}/usr/share/postgresql-${SLOT}/man" \
		--sysconfdir="${PO}/etc/postgresql-${SLOT}" \
		--with-system-tzdata="${PO}/usr/share/zoneinfo" \
		--without-docdir \
		--enable-thread-safety \
		--with-readline \
		--with-zlib \
		--without-gssapi \
		--without-krb5 \
		--without-ldap \
		--without-pam \
		--without-perl \
		--without-python \
		--without-openssl \
		--without-tcl \
		--without-libxml \
		--without-libxslt \
		--without-ossp-uuid \
		--enable-nls \
		$(use_enable !pg_legacytimestamp integer-datetimes)
}

src_compile() {
	emake
	emake -C contrib
}

src_install() {
	emake DESTDIR="${D}" install
	emake DESTDIR="${D}" install -C contrib

	dodoc README HISTORY doc/{TODO,bug.template}

	# Las paginas de manual ya vienen construidas y las instala 'make install'
	# bajo /usr/share/postgresql-${SLOT}/man para que las gestione eselect.
	if ! use server ; then
		local m
		for m in initdb ipcclean pg_controldata pg_ctl pg_resetxlog \
				postgres postmaster ; do
			rm -f "${ED}/usr/share/postgresql-${SLOT}/man/man1/${m}.1" || die
			rm -f "${ED}/usr/$(get_libdir)/postgresql-${SLOT}/bin/${m}" || die
		done
	fi
	docompress /usr/share/postgresql-${SLOT}/man/man{1,3,7}

	insinto /etc/postgresql-${SLOT}
	newins src/bin/psql/psqlrc.sample psqlrc

	dodir /etc/eselect/postgresql/slots/${SLOT}
	echo "postgres_ebuilds=\"\${postgres_ebuilds} ${PF}\"" > \
		"${ED}/etc/eselect/postgresql/slots/${SLOT}/base" || die

	find "${ED}" -name '*.a' -delete || die

	if use server ; then
		sed -e "s|@SLOT@|${SLOT}|g" -e "s|@LIBDIR@|$(get_libdir)|g" \
			"${FILESDIR}/${PN}.confd-pre_9.2" | newconfd - ${PN}-${SLOT}

		sed -e "s|@SLOT@|${SLOT}|g" -e "s|@LIBDIR@|$(get_libdir)|g" \
			"${FILESDIR}/${PN}.init-pre_9.2" | newinitd - ${PN}-${SLOT}

		sed -e "s|@SLOT@|${SLOT}|g" -e "s|@LIBDIR@|$(get_libdir)|g" \
			"${FILESDIR}/${PN}.service-pre_9.2" | \
			systemd_newunit - ${PN}-${SLOT}.service

		newbin "${FILESDIR}/${PN}-check-db-dir" ${PN}-${SLOT}-check-db-dir

		newtmpfiles "${FILESDIR}/${PN}.tmpfiles" ${PN}-${SLOT}.conf
	fi
}

pkg_postinst() {
	postgresql-config update

	use server && tmpfiles_process ${PN}-${SLOT}.conf

	elog "Si necesitas un psqlrc global, ponlo en:"
	elog "    ${EROOT}/etc/postgresql-${SLOT}/"

	if use server ; then
		elog
		elog "El socket unix por defecto es:"
		elog "    ${EROOT}/run/postgresql/"
		elog
		elog "Para crear un cluster nuevo:"
		elog "    emerge --config =${CATEGORY}/${PF}"
		elog
		if use pg_legacytimestamp ; then
			elog "Compilado con marcas de tiempo en coma flotante"
			elog "(--disable-integer-datetimes), que es el formato con el que se"
			elog "creo el cluster 8.2 existente.  NO desactives pg_legacytimestamp:"
			elog "el servidor se negaria a abrir ese cluster."
		else
			ewarn "Compilado SIN pg_legacytimestamp (--enable-integer-datetimes)."
			ewarn "Un cluster 8.2 creado con el ebuild anterior NO arrancara con"
			ewarn "este binario.  Vuelve a activar pg_legacytimestamp si es el caso."
		fi
	fi
}

pkg_prerm() {
	if use server && [[ -z ${REPLACED_BY_VERSION} ]] ; then
		ewarn "Has volcado y/o migrado el cluster ${SLOT}?"
		ewarn "    https://wiki.gentoo.org/wiki/PostgreSQL"

		ebegin "Continuando con el borrado en 10 segundos (Control-C para cancelar)"
		sleep 10
		eend 0
	fi
}

pkg_postrm() {
	postgresql-config update
}

pkg_config() {
	use server || die "USE flag 'server' not enabled. Nothing to configure."

	[[ -f "${EROOT}/etc/conf.d/postgresql-${SLOT}" ]] \
		&& source "${EROOT}/etc/conf.d/postgresql-${SLOT}"
	[[ -z "${PGDATA}" ]] && PGDATA="${EROOT}/etc/postgresql-${SLOT}/"
	[[ -z "${DATA_DIR}" ]] \
		&& DATA_DIR="${EROOT}/var/lib/postgresql/${SLOT}/data"

	# environment.bz2 puede traer un locale distinto al del sistema.
	if [[ -f "${EROOT}/etc/env.d/02locale" ]] ; then
		unset LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY \
			LC_MESSAGES LC_ALL
		source "${EROOT}/etc/env.d/02locale"
		[[ -n "${LANG}" ]] && export LANG
		[[ -n "${LC_CTYPE}" ]] && export LC_CTYPE
		[[ -n "${LC_NUMERIC}" ]] && export LC_NUMERIC
		[[ -n "${LC_TIME}" ]] && export LC_TIME
		[[ -n "${LC_COLLATE}" ]] && export LC_COLLATE
		[[ -n "${LC_MONETARY}" ]] && export LC_MONETARY
		[[ -n "${LC_MESSAGES}" ]] && export LC_MESSAGES
		[[ -n "${LC_ALL}" ]] && export LC_ALL
	fi

	einfo "Las rutas y opciones de initdb se editan en:"
	einfo "    ${EROOT}/etc/conf.d/postgresql-${SLOT}"
	einfo
	einfo "PG_INITDB_OPTS vale ahora mismo:"
	einfo "    ${PG_INITDB_OPTS:-(ninguna)}"
	einfo
	einfo "Los ficheros de configuracion se instalaran en:"
	einfo "    ${PGDATA}"
	einfo
	einfo "El cluster se creara en:"
	einfo "    ${DATA_DIR}"
	einfo
	local answer correct
	while [[ "${correct}" != "true" ]] ; do
		einfo "Continuamos? (y/n)"
		read answer
		if [[ ${answer} =~ ^[Yy]([Ee][Ss])?$ ]] ; then
			correct="true"
		elif [[ ${answer} =~ ^[Nn]([Oo])?$ ]] ; then
			die "Inicializacion abortada."
		else
			echo "Respuesta no reconocida"
		fi
	done

	if [[ -n "$(ls -A "${DATA_DIR}" 2> /dev/null)" ]] ; then
		eerror "El directorio '${DATA_DIR}' no esta vacio."
		die "${DATA_DIR} no esta vacio."
	fi

	einfo "Creando el directorio de datos ..."
	if [[ ${EUID} == 0 ]] ; then
		mkdir -p "${DATA_DIR}"
		chown -Rf postgres:postgres "${DATA_DIR}"
		chmod 0700 "${DATA_DIR}"
	fi

	einfo "Inicializando la base de datos ..."
	if [[ ${EUID} == 0 ]] ; then
		su postgres -c "${EROOT}/usr/$(get_libdir)/postgresql-${SLOT}/bin/initdb -D \"${DATA_DIR}\" ${PG_INITDB_OPTS}"
	else
		"${EROOT}/usr/$(get_libdir)/postgresql-${SLOT}/bin/initdb" -U postgres \
			-D "${DATA_DIR}" ${PG_INITDB_OPTS}
	fi

	if [[ "${DATA_DIR%/}" != "${PGDATA%/}" ]] ; then
		mv "${DATA_DIR%/}"/{pg_{hba,ident},postgresql}.conf "${PGDATA}"
		ln -s "${PGDATA%/}"/{pg_{hba,ident},postgresql}.conf "${DATA_DIR%/}"
	fi

	einfo "El servidor registra los eventos por defecto en:"
	einfo "    ${DATA_DIR%/}/postmaster.log"
	einfo
	einfo "Usa ${EROOT}/etc/init.d/postgresql-${SLOT} en lugar de pg_ctl."
}