Tengo un demonio de juego sin bifurcación escrito en Perl , que utiliza consultas acync para escribir estadísticas de jugador en una base de datos PostgreSQL 9.3. Pero cuando necesito leer algo de la base de datos (como si un jugador está prohibido o si el jugador tiene un estado VIP), entonces uso consultas sincrónicas.
Esto hace que el juego se detenga por un breve momento, hasta que el valor haya sido leído de la base de datos.
No puedo reescribir mi demonio del juego para usar consultas asíncronas para leer valores (lo intenté, pero requirió demasiados cambios), así que mi pregunta es : ¿tendría sentido combinar varias consultas no relacionadas (que debo hacer cuando un nuevo jugador conecta) a 1 procedimiento y ¿cómo podría devolver varios valores al mismo tiempo a mi programa Perl?
Todas mis consultas actuales toman una ID de jugador como parámetro y devuelven 1 valor:
-- Has the player been banned?
select true from pref_ban where id=?
-- What is the reputation of this player?
select
count(nullif(nice, false)) -
count(nullif(nice, true)) as rep
from pref_rep where id=?
-- Is he or she a special VIP player?
select vip > now() as vip from pref_users where id=?
-- How many games has the player played to the end?
select completed from pref_match where id=?
Para combinar las consultas anteriores, probablemente necesito un procedimiento como este:
create or replace function get_user_info(_id varchar) returns XXX as $BODY$
declare
is_banned boolean;
reputation integer;
is_vip boolean;
completed_games integer;
begin
select 1 into is_banned from pref_ban where id=_id;
select
count(nullif(nice, false)) -
count(nullif(nice, true))
into reputation
from pref_rep where id=_id;
select vip > now() into is_vip from pref_users where id=_id;
select completed into completed_games from pref_match where id=_id;
return XXX; /* How to return 4 values here? */
end;
$BODY$ language plpgsql;
Por favor, ayúdame a declarar el procedimiento anterior correctamente.
NULL
oTRUE
en miis_banned
variable, con esta declaración:select true into is_banned from pref_ban where id=_id
. ¿Hay alguna manera de cambiarlo aFALSE
oTRUE
?