diff --git a/Dockers/postgres-shadow/init.sh b/Dockers/postgres-shadow/init.sh index aa340e2..cff89a3 100644 --- a/Dockers/postgres-shadow/init.sh +++ b/Dockers/postgres-shadow/init.sh @@ -1,17 +1,11 @@ #!/bin/bash set -e -# Create the target database if it doesn't exist -psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" <<-EOSQL - DO - \$do\$ - BEGIN - IF NOT EXISTS (SELECT FROM pg_database WHERE datname = '$TARGET_DB_NAME') THEN - CREATE DATABASE $TARGET_DB_NAME OWNER $POSTGRES_USER; - END IF; - END - \$do\$; -EOSQL +# Check if database exists +if ! psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" -tAc "SELECT 1 FROM pg_database WHERE datname = '$TARGET_DB_NAME'" | grep -q 1; then + # Create the target database if it doesn't exist + createdb -U "$POSTGRES_USER" -O "$POSTGRES_USER" "$TARGET_DB_NAME" +fi # Enable the pgvector extension on both databases for DB in "$POSTGRES_DB" "$TARGET_DB_NAME"; do @@ -28,4 +22,4 @@ else echo "No SOURCE_DB_URL provided, skipping initial refresh" fi -echo "Database initialization completed at $(date)" \ No newline at end of file +echo "Database initialization completed at $(date)" diff --git a/Dockers/postgres-shadow/refresh.sh b/Dockers/postgres-shadow/refresh.sh index a609a76..163292f 100644 --- a/Dockers/postgres-shadow/refresh.sh +++ b/Dockers/postgres-shadow/refresh.sh @@ -23,10 +23,16 @@ EOSQL # Drop and recreate the target database psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" <<-EOSQL - DROP DATABASE IF EXISTS $TARGET_DB_NAME; - CREATE DATABASE $TARGET_DB_NAME OWNER $POSTGRES_USER; + SELECT pg_terminate_backend(pid) + FROM pg_stat_activity + WHERE datname = '$TARGET_DB_NAME' + AND pid != pg_backend_pid(); EOSQL +# Drop and create database as separate commands +dropdb -U "$POSTGRES_USER" --if-exists "$TARGET_DB_NAME" +createdb -U "$POSTGRES_USER" -O "$POSTGRES_USER" "$TARGET_DB_NAME" + # Copy the database if SOURCE_DB_URL is provided if [ ! -z "$SOURCE_DB_URL" ]; then echo "Copying database from $SOURCE_DB_URL to $TARGET_DB_NAME..." @@ -50,9 +56,22 @@ if [ ! -z "$SOURCE_DB_URL" ]; then EXECUTE 'ALTER SEQUENCE public.' || quote_ident(r.sequence_name) || ' OWNER TO $POSTGRES_USER'; END LOOP; - FOR r IN SELECT typname FROM pg_type WHERE typnamespace = 'public'::regnamespace + -- Handle regular types, excluding arrays and special types + FOR r IN SELECT t.typname + FROM pg_type t + LEFT JOIN pg_type arr ON arr.typelem = t.oid + WHERE t.typnamespace = 'public'::regnamespace + AND t.typtype NOT IN ('a', 'c') -- Exclude arrays and composite types + AND NOT EXISTS ( + SELECT 1 FROM pg_type arr + WHERE arr.typarray = t.oid + ) LOOP - EXECUTE 'ALTER TYPE public.' || quote_ident(r.typname) || ' OWNER TO $POSTGRES_USER'; + BEGIN + EXECUTE 'ALTER TYPE public.' || quote_ident(r.typname) || ' OWNER TO $POSTGRES_USER'; + EXCEPTION WHEN OTHERS THEN + RAISE NOTICE 'Could not alter ownership of type %: %', r.typname, SQLERRM; + END; END LOOP; END \$\$; @@ -61,4 +80,4 @@ EOSQL echo "Database refresh completed successfully at $(date)" else echo "No SOURCE_DB_URL provided, skipping database refresh" -fi \ No newline at end of file +fi