#!/bin/bash # scripts/copy-database-for-task.sh # Copies database from main repo to task-specific PostgreSQL instance TASK_ID=$1 SOURCE_HOST=${2:-"localhost"} SOURCE_PORT=${3:-"5432"} TARGET_HOST=${4:-"localhost"} TARGET_PORT=${5:-"5433"} SOURCE_DB="managing" # Convert to lowercase (compatible with bash 3.2+) TARGET_DB="managing_$(echo "$TASK_ID" | tr '[:upper:]' '[:lower:]')" ORLEANS_SOURCE_DB="orleans" ORLEANS_TARGET_DB="orleans_$(echo "$TASK_ID" | tr '[:upper:]' '[:lower:]')" DB_USER="postgres" DB_PASSWORD="postgres" set -e # Exit on error echo "๐Ÿ“ฆ Copying database for task: $TASK_ID" echo " Source: $SOURCE_HOST:$SOURCE_PORT" echo " Target: $TARGET_HOST:$TARGET_PORT" # Wait for target PostgreSQL to be ready echo "โณ Waiting for target PostgreSQL..." for i in {1..60}; do if PGPASSWORD=$DB_PASSWORD psql -h $TARGET_HOST -p $TARGET_PORT -U $DB_USER -d postgres -c '\q' 2>/dev/null; then echo "โœ… Target PostgreSQL is ready" break fi if [ $i -eq 60 ]; then echo "โŒ Target PostgreSQL not ready after 60 attempts" exit 1 fi sleep 1 done # Verify source database is accessible echo "๐Ÿ” Verifying source database..." if ! PGPASSWORD=$DB_PASSWORD psql -h $SOURCE_HOST -p $SOURCE_PORT -U $DB_USER -d postgres -c '\q' 2>/dev/null; then echo "โŒ Cannot connect to source database at $SOURCE_HOST:$SOURCE_PORT" exit 1 fi # Create target databases (drop if exists for fresh copy) echo "๐Ÿ—‘๏ธ Dropping existing target databases if they exist..." PGPASSWORD=$DB_PASSWORD psql -h $TARGET_HOST -p $TARGET_PORT -U $DB_USER -d postgres -c "DROP DATABASE IF EXISTS \"$TARGET_DB\";" 2>/dev/null || true PGPASSWORD=$DB_PASSWORD psql -h $TARGET_HOST -p $TARGET_PORT -U $DB_USER -d postgres -c "DROP DATABASE IF EXISTS \"$ORLEANS_TARGET_DB\";" 2>/dev/null || true echo "๐Ÿ“ Creating target databases..." PGPASSWORD=$DB_PASSWORD psql -h $TARGET_HOST -p $TARGET_PORT -U $DB_USER -d postgres -c "CREATE DATABASE \"$TARGET_DB\";" PGPASSWORD=$DB_PASSWORD psql -h $TARGET_HOST -p $TARGET_PORT -U $DB_USER -d postgres -c "CREATE DATABASE \"$ORLEANS_TARGET_DB\";" # Create temporary dump files TEMP_DIR=$(mktemp -d) MANAGING_DUMP="$TEMP_DIR/managing_${TASK_ID}.dump" ORLEANS_DUMP="$TEMP_DIR/orleans_${TASK_ID}.dump" # Dump source databases echo "๐Ÿ“ค Dumping source database: $SOURCE_DB..." PGPASSWORD=$DB_PASSWORD pg_dump -h $SOURCE_HOST -p $SOURCE_PORT -U $DB_USER -Fc "$SOURCE_DB" > "$MANAGING_DUMP" if [ ! -s "$MANAGING_DUMP" ]; then echo "โŒ Failed to dump source database $SOURCE_DB" rm -rf "$TEMP_DIR" exit 1 fi echo "๐Ÿ“ค Dumping Orleans database: $ORLEANS_SOURCE_DB..." PGPASSWORD=$DB_PASSWORD pg_dump -h $SOURCE_HOST -p $SOURCE_PORT -U $DB_USER -Fc "$ORLEANS_SOURCE_DB" > "$ORLEANS_DUMP" 2>/dev/null || { echo "โš ๏ธ Orleans database not found, skipping..." ORLEANS_DUMP="" } # Restore to target databases echo "๐Ÿ“ฅ Restoring to target database: $TARGET_DB..." PGPASSWORD=$DB_PASSWORD pg_restore -h $TARGET_HOST -p $TARGET_PORT -U $DB_USER -d "$TARGET_DB" --no-owner --no-acl --clean --if-exists "$MANAGING_DUMP" if [ $? -eq 0 ]; then echo "โœ… Successfully restored $TARGET_DB" else echo "โŒ Failed to restore $TARGET_DB" rm -rf "$TEMP_DIR" exit 1 fi if [ -n "$ORLEANS_DUMP" ] && [ -s "$ORLEANS_DUMP" ]; then echo "๐Ÿ“ฅ Restoring Orleans database: $ORLEANS_TARGET_DB..." PGPASSWORD=$DB_PASSWORD pg_restore -h $TARGET_HOST -p $TARGET_PORT -U $DB_USER -d "$ORLEANS_TARGET_DB" --no-owner --no-acl --clean --if-exists "$ORLEANS_DUMP" if [ $? -eq 0 ]; then echo "โœ… Successfully restored $ORLEANS_TARGET_DB" # Clean Orleans membership tables to avoid conflicts with old silos echo "๐Ÿงน Cleaning Orleans membership tables (removing old silo entries)..." PGPASSWORD=$DB_PASSWORD psql -h $TARGET_HOST -p $TARGET_PORT -U $DB_USER -d "$ORLEANS_TARGET_DB" <