#!/usr/bin/env bash set -euo pipefail # Escolhe binário do Python (funciona no host ou dentro do container) if [ -x "./venv/bin/python" ]; then VENV_PY="./venv/bin/python" elif command -v python3 >/dev/null 2>&1; then VENV_PY="python3" else VENV_PY="python" fi # Configs DSN_CANDIDATES=() if [ -n "${ORACLE_LOCAL_DSN:-}" ]; then DSN_CANDIDATES+=("${ORACLE_LOCAL_DSN}") fi DSN_CANDIDATES+=("127.0.0.1:1521/XEPDB1" "oracle18c:1521/XEPDB1" "mqapilc_oracle18c:1521/XEPDB1") API_URL=${API_URL:-"http://localhost:8000"} echo "[1/5] Aguardando Oracle..." DSN_HOST="" for candidate in "${DSN_CANDIDATES[@]}"; do echo " Testando ${candidate}..." if $VENV_PY - </dev/null 2>&1 import cx_Oracle conn=cx_Oracle.connect("local123","local123","${candidate}") cur=conn.cursor();cur.execute("select 1 from dual");cur.fetchone() cur.close();conn.close() PY then DSN_HOST="${candidate}" break fi sleep 2 done if [ -z "$DSN_HOST" ]; then echo "ERRO: não foi possível conectar ao Oracle em nenhum dos DSN candidatos." exit 1 fi echo "Oracle OK em ${DSN_HOST}." echo "[2/5] Conferindo contagem atual..." COUNT=$($VENV_PY - </dev/null # Espera concluir while true; do STATUS=$(curl -s "${API_URL}/api/v1/ranking/status") running=$($VENV_PY - <<'PY' import os, json data=json.loads(os.environ["STATUS"]) print(data.get("running", False)) PY STATUS="$STATUS") echo " Status: ${STATUS}" if [ "$running" != "True" ] && [ "$running" != "true" ]; then break fi sleep 20 done NEED_B="yes" elif [ "${MAX_B}" -eq 0 ]; then echo "[3/5] Tabela já tem dados, mas componente B nunca foi preenchido (max=0)." NEED_B="yes" else echo "[3/5] Tabela já possui dados e componente B preenchido (max=${MAX_B}). Pulando cálculo pesado." NEED_B="no" fi if [ "${NEED_B}" = "yes" ]; then echo "[4/5] Rodando Componente B (PPG)..." ORACLE_LOCAL_DSN=${DSN_HOST} PYTHONUNBUFFERED=1 $VENV_PY scripts/popular_componente_b.py else echo "[4/5] Componente B já presente, sem necessidade de recálculo." fi echo "[5/5] Contagens finais:" $VENV_PY - <0"); print("B>0",cur.fetchone()[0]) cur.execute("select max(componente_b) from tb_ranking_consultor"); print("max B",cur.fetchone()[0]) cur.execute("select max(pontuacao_total) from tb_ranking_consultor"); print("max total",cur.fetchone()[0]) cur.close();conn.close() PY echo "Pronto."