On Wed, Jan 12, 2022 at 1:22 PM Issa Gorissen <issa-goris...@usa.net> wrote:

> So I have this question, how to script the making of base backup for
> transfer on the slave server when the two SQL functions must be called
> in the same connection, in Bash for example; is this doable?
>

Not sure if I understand the problem correctly but if you are asking how to
open a connection to the database and keep it open while doing something
else in bash, then you could use "coproc" for instance. I sometimes use
this function:

coproc psql -XAtF $'\t' service="$srv"
pg () {
    local sql exp
    sql="$1"
    [ "$2" ] && { sql="$2"; exp="$1"; }
    echo "$sql" >&${COPROC[1]}
    read -u ${COPROC[0]} || return
    [ "$exp" ] || return 0
    [ "$REPLY" = "$exp" ] || return 64
    return 0
}


And here is some usage

    local TMOUT=1
    pg BEGIN 'BEGIN;'

This sends a BEGIN command and expects the word BEGIN as reply.

    if pg 'LOCK TABLE' '
LOCK TABLE some_table
  IN SHARE ROW EXCLUSIVE MODE NOWAIT;
';
    then
        :
    elif (( $? > 128 )); then     # read timeout exceeded
        die "Cannot lock some_table";
    else
        die "Unexpected error while locking some_table";
    fi

In the example above a table is locked with NOWAIT. Bash's read timeout is
set to 1sec. If that's exceeded because the lock is not obtained, read
comes back with status>128.

    unset TMOUT
    pg '
SELECT coalesce(min(id), -1)
     , coalesce(max(id), -1)
  FROM some_table'\;

Now we want to read some data. So, TMOUT is unset. The REPLY variable will
have the answer.

    IFS=$'\t' read mn mx <<<"$REPLY"

And this is how to split the reply into 2 bash variables, mn and mx.

At the end of the transaction then

    pg 'COMMIT' 'COMMIT;'

And send \q to finish psql. If "set -e" mode is active, make sure to negate
the result.

    # expecting read to fail after \q. Hence the negation.
    ! pg '\q'


In simpler cases, when you just want to push commands to psql, you can also
use this:

    exec {PSQL}> >(psql ...)

Note there is a blank between the 2 >. This is important.

Then

    echo >&$PSQL 'create table tf ();'
    echo >&$PSQL 'drop table tf;'

Does this help?

Reply via email to