J'ai un démon de jeu non-forking écrit en Perl , qui utilise des requêtes acync pour écrire les statistiques des joueurs dans une base de données PostgreSQL 9.3. Mais lorsque j'ai besoin de lire quelque chose dans la base de données (comme si un joueur est banni ou si le joueur a un statut VIP), j'utilise des requêtes synchrones.
Cela arrête le jeu pendant un court instant, jusqu'à ce que la valeur ait été lue dans la base de données.
Je ne peux pas réécrire mon démon de jeu pour utiliser des requêtes asynchrones pour lire des valeurs (j'ai essayé, mais cela nécessitait trop de changements), donc ma question est : serait-il judicieux de combiner plusieurs requêtes non liées (que je dois faire quand un nouveau joueur connects) à 1 procédure et comment pourrais-je retourner plusieurs valeurs en même temps à mon programme Perl?
Mes requêtes actuelles prennent toutes un ID de joueur comme paramètre et renvoient 1 valeur:
-- 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=?
Pour combiner les requêtes ci-dessus, j'ai probablement besoin d'une procédure comme celle-ci:
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;
Veuillez m'aider à déclarer correctement la procédure ci-dessus.
NULL
ouTRUE
dans mais_banned
variable cette déclaration:select true into is_banned from pref_ban where id=_id
. Y a-t-il un moyen de le changer enFALSE
ouTRUE
?