Ho un demone di gioco non forking scritto in Perl , che utilizza query acync per scrivere le statistiche dei giocatori in un database PostgreSQL 9.3. Ma quando ho bisogno di leggere qualcosa dal database (come se un giocatore è bandito o se il giocatore ha uno stato VIP), allora uso le query sincrone.
Questo fa fermare il gioco per un breve momento, fino a quando il valore non viene letto dal database.
Non riesco a riscrivere il mio demone di gioco per usare query asincrone per leggere i valori (ci ho provato, ma ha richiesto troppe modifiche), quindi mia domanda è : avrebbe senso combinare diverse query non correlate (che devo fare quando un nuovo giocatore si collega) a 1 procedura e come posso restituire più valori contemporaneamente al mio programma Perl?
Le mie query attuali prendono tutti un ID giocatore come parametro e restituiscono 1 valore:
-- 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=?
Per combinare le domande di cui sopra probabilmente ho bisogno di una procedura come questa:
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;
Aiutatemi a dichiarare correttamente la procedura sopra descritta.
NULL
oTRUE
nel miois_banned
variabile con questa affermazione:select true into is_banned from pref_ban where id=_id
. C'è un modo per cambiarlo inFALSE
oTRUE
?