thoughts on interactive query

From: Sim Zacks <sim(at)compulab(dot)co(dot)il>
To: PostgreSQL general <pgsql-general(at)postgresql(dot)org>
Subject: thoughts on interactive query
Date: 2011-06-14 07:39:11
Message-ID: 4DF7101F.10501@compulab.co.il
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-general

I am playing around with making interactive queries and was wondering if
anyone had any comments.

If your comment is "That is a stupid idea", please try to qualify that
with something constructive as well.

The idea is that sometimes during a process, user input is required. The
way we have been doing this is to return an error code and then the GUI
asks the user the question and restarts the query with the answer passed
as a parameter.

The problem with this is that it is sometimes a long, complicated
transaction and ending it in the middle just to ask the user "yes or no"
and then running the entire transaction again seems awfully inefficient.

What I have tried successfully is the following plpython function:

create or replace function python_prompt(v_question text) returns bool as
$$
import socket
ipaddr=plpy.execute("select inet_client_addr()")[0]["inet_client_addr"]
HOST, PORT = str(ipaddr), 9999
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.settimeout(30)
sock.connect((HOST, PORT))
sock.send(v_question + "\n")
ans=sock.recv(1024) # Processing waits here for either an answer or the
timeout to expire
sock.close()
if ans=="yes":
return 1
else:
return 0
$$ language 'plpythonu';

I added a socket server to my application, so each client listens on the
same port.

If the query requires user input in the middle of the function, it can
then ask and wait for the answer. If it doesn't receive an answer within
the timeout period (30 seconds in this case) it dies with a timeout error.

A use case for this is:

create or replace function myprocess() returns int as

$$

begin

--long process

if not python_prompt('The final computed numbers fall out of normal
range. To continue with this process you must manually override. Do you
want to override?') then

raise exception 'Numbers out of normal range';

end if;

return 0;

end;

$$ language 'plpgsql';

During the wait time, I didn't see any CPU or memory usage , so setting
a high timeout will use a connection but won't grind the server to a halt.

Responses

Browse pgsql-general by date

  From Date Subject
Next Message Thom Brown 2011-06-14 07:49:20 Re: No implicit index created when adding primary key with ALTER TABLE
Previous Message AI Rumman 2011-06-14 07:33:17 how to install plpython?