Eu tenho um daemon de jogo não-bifurcado escrito em Perl , que usa consultas acync para gravar estatísticas de jogador em um banco de dados PostgreSQL 9.3. Mas quando preciso ler algo do banco de dados (como se um jogador é banido ou se o jogador tem um status VIP), então uso consultas síncronas.
Isso faz o jogo parar por um breve momento, até que o valor seja lido no banco de dados.
Não consigo reescrever meu daemon de jogo para usar consultas assíncronas para ler valores (tentei, mas exigiu muitas alterações); portanto, minha pergunta é : faria sentido combinar várias consultas não relacionadas (que eu preciso fazer quando um novo jogador conecta) a 1 procedimento e como eu poderia retornar vários valores ao mesmo tempo ao meu programa Perl?
Todas as minhas consultas atuais usam um ID de jogador como parâmetro e retornam 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 as consultas acima, provavelmente preciso de um procedimento 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, ajude-me a declarar o procedimento acima corretamente.
NULL
ouTRUE
na minhais_banned
variável com a seguinte declaração:select true into is_banned from pref_ban where id=_id
. Existe uma maneira de mudar paraFALSE
ouTRUE
?