#!/bin/bash

# 脚本名称: pg_export_tables.sh
# 功能: 导出指定环境的多个PostgreSQL表为CSV并压缩为一个文件
# 用法: ./pg_export_tables.sh <env> <table1,table2,...>

# 检查参数数量
if [ $# -lt 2 ]; then
  echo "错误: 参数不足"
  echo "用法: $0 <环境> <表名1,表名2,...>"
  exit 1
fi

# 获取参数
ENV=$1
TABLES_STR=$2

# 设置数据库连接参数
case $ENV in
  "int")
    DB_HOST="10.10.71.112"
    DB_PORT="5432"
    DB_USER="farmer"
    DB_PASS="q1w2e3.."
    DB_NAME="msp_int"
    ;;
  "stg")
    DB_HOST="10.10.70.240"
    DB_PORT="5432"
    DB_USER="farmer"
    DB_PASS="q1w2e3.."
    DB_NAME="msp_prod"
    ;;
  "prod")
    DB_HOST="10.10.70.218"
    DB_PORT="5432"
    DB_USER="farmer"
    DB_PASS="q1w2e3.."
    DB_NAME="msp_prod"
    ;;
  *)
    echo "错误: 未知环境 '$ENV'"
    echo "可用环境: int, stg, prod"
    exit 1
    ;;
esac

# 创建临时目录
TIMESTAMP=$(date "+%Y-%m-%d_%H-%M-%S")  # 使用短横线替代冒号
TMP_DIR="/data8/backup/temp/$(uuidgen)"
mkdir -p $TMP_DIR
OUTPUT_FILE="${ENV}_${TIMESTAMP}.tar.gz"

# 分割表名为数组
IFS=',' read -ra TABLES <<< "$TABLES_STR"

# 导出每个表
for TABLE in "${TABLES[@]}"; do
  echo "正在导出表: $TABLE"
  CSV_FILE="$TMP_DIR/${TABLE}.csv"
  
  # 使用PGPASSWORD环境变量传递密码
  PGPASSWORD=$DB_PASS /usr/pgsql-14/bin/psql -h $DB_HOST -p $DB_PORT -U $DB_USER -d $DB_NAME \
    -c "COPY (SELECT * FROM $TABLE) TO STDOUT WITH CSV HEADER" > $CSV_FILE
  
  # 检查导出是否成功
  if [ $? -ne 0 ]; then
    echo "错误: 导出表 $TABLE 失败"
    rm -rf $TMP_DIR
    exit 1
  fi
done

# 压缩所有CSV文件
echo "正在压缩文件..."
tar -czf $OUTPUT_FILE -C $TMP_DIR .

# 检查压缩是否成功
if [ $? -eq 0 ]; then
  echo "导出成功! 文件已保存为: $OUTPUT_FILE"
  # 计算文件大小
  FILE_SIZE=$(du -h $OUTPUT_FILE | cut -f1)
  echo "文件大小: $FILE_SIZE"
else
  echo "错误: 压缩文件失败"
fi

# 清理临时目录
rm -rf $TMP_DIR

# 检查压缩是否成功
if [ $? -eq 0 ]; then
  echo "准备上传: $OUTPUT_FILE"
  /usr/bin/mc cp $OUTPUT_FILE int/files/2023-11-23/$OUTPUT_FILE
  echo "上传完成"
  echo "https://intoss.mspbots.ai/files/2023-11-23/$OUTPUT_FILE"
  rm -rf $OUTPUT_FILE
else
  echo "错误: 压缩文件失败"
fi


exit 0
