149 lines
4.4 KiB
Bash
Executable File
149 lines
4.4 KiB
Bash
Executable File
#!/bin/bash
|
||
# sync_dev_to_public.sh — 比對 dev/public schema,同步 pipeline 資料
|
||
# Usage: ./sync_dev_to_public.sh [check|sync] [file_uuid]
|
||
|
||
PSQL="/opt/homebrew/opt/libpq/bin/psql"
|
||
|
||
set -euo pipefail
|
||
|
||
SCHEMA="${MOMENTRY_DB_SCHEMA:-dev}"
|
||
DB_URL="${DATABASE_URL:-postgres://accusys@localhost:5432/momentry}"
|
||
MODE="${1:-check}"
|
||
FILE_UUID="${2:-}"
|
||
|
||
TABLES=("videos" "chunk" "face_detections" "processor_results" "monitor_jobs"
|
||
"identities" "identity_bindings" "tkg_nodes" "tkg_edges")
|
||
|
||
TARGET="public"
|
||
|
||
if [ -z "$FILE_UUID" ]; then
|
||
echo "Usage: $0 [check|sync] <file_uuid>"
|
||
echo ""
|
||
echo "Examples:"
|
||
echo " $0 check bd80fec92b0b6963d177a2c55bf713e2"
|
||
echo " $0 sync bd80fec92b0b6963d177a2c55bf713e2"
|
||
exit 1
|
||
fi
|
||
|
||
echo "=== Schema Sync: $SCHEMA → $TARGET ==="
|
||
echo "File UUID: $FILE_UUID"
|
||
echo "Mode: $MODE"
|
||
echo ""
|
||
|
||
check_table() {
|
||
local table=$1
|
||
local col=$2
|
||
local src_count dev_count pub_count
|
||
|
||
dev_count=$($PSQL -At "$DB_URL" -c "SELECT COUNT(*) FROM ${SCHEMA}.${table} WHERE ${col} = '${FILE_UUID}';" 2>/dev/null || echo "ERROR")
|
||
pub_count=$($PSQL -At "$DB_URL" -c "SELECT COUNT(*) FROM ${TARGET}.${table} WHERE ${col} = '${FILE_UUID}';" 2>/dev/null || echo "ERROR")
|
||
|
||
if [ "$dev_count" = "ERROR" ] || [ "$pub_count" = "ERROR" ]; then
|
||
echo " ⚠️ $table — query error (table may not exist in $TARGET)"
|
||
return 1
|
||
fi
|
||
|
||
if [ "$dev_count" -eq "$pub_count" ]; then
|
||
echo " ✅ $table — $dev_count rows (match)"
|
||
return 0
|
||
else
|
||
echo " ❌ $table — dev=$dev_count pub=$pub_count (MISMATCH)"
|
||
return 1
|
||
fi
|
||
}
|
||
|
||
sync_table() {
|
||
local table=$1
|
||
local col=$2
|
||
local src_count dev_count pub_count
|
||
|
||
dev_count=$($PSQL -At "$DB_URL" -c "SELECT COUNT(*) FROM ${SCHEMA}.${table} WHERE ${col} = '${FILE_UUID}';" 2>/dev/null || echo "0")
|
||
pub_count=$($PSQL -At "$DB_URL" -c "SELECT COUNT(*) FROM ${TARGET}.${table} WHERE ${col} = '${FILE_UUID}';" 2>/dev/null || echo "0")
|
||
|
||
if [ "$dev_count" = "0" ]; then
|
||
echo " ⏭️ $table — dev has 0 rows, skipping"
|
||
return
|
||
fi
|
||
|
||
if [ "$dev_count" -eq "$pub_count" ]; then
|
||
echo " ✅ $table — already synced ($dev_count rows)"
|
||
return
|
||
fi
|
||
|
||
echo " 🔄 Syncing $table: dev=$dev_count → pub=$pub_count ..."
|
||
|
||
# Delete existing public rows, insert from dev
|
||
$PSQL "$DB_URL" -q -c "DELETE FROM ${TARGET}.${table} WHERE ${col} = '${FILE_UUID}';" 2>/dev/null || true
|
||
|
||
# Get columns list (excluding id for SERIAL)
|
||
COLS=$($PSQL -At "$DB_URL" -c "
|
||
SELECT string_agg(column_name, ', ' ORDER BY ordinal_position)
|
||
FROM information_schema.columns
|
||
WHERE table_schema='${SCHEMA}' AND table_name='${table}'
|
||
AND column_name != 'id'
|
||
AND is_updatable='YES';
|
||
")
|
||
|
||
$PSQL "$DB_URL" -q -c "
|
||
INSERT INTO ${TARGET}.${table} (${COLS})
|
||
SELECT ${COLS}
|
||
FROM ${SCHEMA}.${table}
|
||
WHERE ${col} = '${FILE_UUID}';
|
||
" 2>/dev/null && echo " ✅ $table synced" || echo " ❌ $table sync FAILED"
|
||
}
|
||
|
||
echo "=== Checking Tables ==="
|
||
echo ""
|
||
MISMATCH=0
|
||
for table in "${TABLES[@]}"; do
|
||
# Determine the UUID column name for each table
|
||
case "$table" in
|
||
videos) col="file_uuid" ;;
|
||
chunk) col="file_uuid" ;;
|
||
face_detections) col="file_uuid" ;;
|
||
processor_results) col="file_uuid" ;;
|
||
monitor_jobs) col="uuid" ;;
|
||
identities) col="uuid" ;; # identities.uuid is UUID type
|
||
identity_bindings) col="uuid" ;;
|
||
tkg_nodes) col="file_uuid" ;;
|
||
tkg_edges) col="file_uuid" ;;
|
||
*) col="file_uuid" ;;
|
||
esac
|
||
|
||
if ! check_table "$table" "$col"; then
|
||
MISMATCH=$((MISMATCH + 1))
|
||
fi
|
||
done
|
||
|
||
echo ""
|
||
if [ "$MISMATCH" -eq 0 ]; then
|
||
echo "✅ All tables in sync"
|
||
exit 0
|
||
fi
|
||
|
||
if [ "$MODE" != "sync" ]; then
|
||
echo "⚠️ $MISMATCH table(s) have mismatches. Run '$0 sync $FILE_UUID' to fix."
|
||
exit 1
|
||
fi
|
||
|
||
echo "=== Syncing Tables ==="
|
||
echo ""
|
||
for table in "${TABLES[@]}"; do
|
||
case "$table" in
|
||
videos) col="file_uuid" ;;
|
||
chunk) col="file_uuid" ;;
|
||
face_detections) col="file_uuid" ;;
|
||
processor_results) col="file_uuid" ;;
|
||
monitor_jobs) col="uuid" ;;
|
||
identities) col="uuid" ;;
|
||
identity_bindings) col="uuid" ;;
|
||
tkg_nodes) col="file_uuid" ;;
|
||
tkg_edges) col="file_uuid" ;;
|
||
*) col="file_uuid" ;;
|
||
esac
|
||
sync_table "$table" "$col"
|
||
done
|
||
|
||
echo ""
|
||
echo "✅ Sync complete"
|