Vous n'êtes pas identifié(e).
Pages : 1
en fait c'est ce que je fait avec la fonction verify_replicat, meme s'il y a un message d'erreur je récupère un 0, sinon ça me retourne 1.
:oops:
ça commence à m'enerver.
je n'ai rien comme réponse pour ces deux requêtes.
non, rien.
par contre la fonction mape_add_ip contient l'insert, et ça s'effectue sans problème.
j'ai ces erreurs ci:
Connection String: hostaddr=217.109.105.136 host=mape-manager user=mape password=pDocr1M! sslmode=require dbname=mapemanager port=5432
connection to DB ok!
commande 1 exécutée
1
NOTICE: l'adresse 192.168.1.14 existe déjà, son ID est le suivant:
commande 2 exécutée
7
row number 0 is out of range 0..-1
couldnt execute query 3
row number 0 is out of range 0..-1
couldnt execute query 4
PQresultStatus me retourne la valeur 7.
Bonjour,
J'ai un problème que j'arrive pas à résoudre.
j'appelle une fonction sql qui utilise un select, et ça marche.
j'appelle une fonction qui utilise un insert et ça ne s'exécute pas.
PGresult* result1;
PGresult* result2;
PGresult* result3;
PGresult* result4;
//sprintf(commande_sql1,"select verify_replicat('192.168.1.1', 'ADC16448521539632AB165', current_timestamp);");
const char *commande_sql1="select * from ips;";
result1 = PQexec(connect_database, commande_sql1);
char *val1 = PQgetvalue(result1,0,0);
printf("%s \n", val1);
if ((PQresultStatus(result1) != PGRES_TUPLES_OK ))
{
fprintf(stderr, "couldnt execute query 1\n");
PQclear(result1);
}
else {
printf ("commande 1 exécutée\n");
}
//sprintf(commande_sql2,"select verify_replicat('192.168.1.1', 'ADC16448521539632AB165', current_timestamp);");
const char *commande_sql2="select mape_add_ip('192.168.1.4');";
result2 = PQexec(connect_database, commande_sql2);
char *val2 = PQgetvalue(result2,0,0);
printf("%s \n", val2);
if ((PQresultStatus(result2) != PGRES_TUPLES_OK ))
{
fprintf(stderr, "couldnt execute query 2\n");
PQclear(result2);
}
else {
printf ("commande 2 exécutée\n");
}
//sprintf(commande_sql3,"select verify_replicat('192.168.1.2', 'BCC16448521539632AB165', current_timestamp);");
const char *commande_sql3="select verify_replicat('192.168.1.2', 'BCC16448521539632AB165', current_timestamp);";
result3 = PQexec(connect_database, commande_sql3);
char *val3 = PQgetvalue(result3,0,0);
printf ("%s\n", val3);
if ((PQresultStatus(result3) != PGRES_TUPLES_OK ))
{
fprintf(stderr, "couldnt execute query 3\n");
PQclear(result3);
}
else {
printf ("commande 3 exécutée\n");
}
//sprintf(commande_sql4,"select verify_replicat('192.168.1.3', 'ADC16448521539632AB165', current_timestamp);");
const char *commande_sql4="select verify_replicat('192.168.1.3', 'ADC16448521539632AB165', current_timestamp);";
result4 = PQexec(connect_database, commande_sql4);
char *val4 = PQgetvalue(result4,0,0);
printf ("%s\n", val4);
if ((PQresultStatus(result4) != PGRES_TUPLES_OK ))
{
fprintf(stderr, "couldnt execute query 4\n");
PQclear(result4);
}
else {
printf ("commande 4 exécutée\n");
}
les deux premières requêtes fonctionnent puisqu'il s'agit d'une sélection simple, et d'une fonction qui utilise la sélection.
les deux dernières ne s'exécutent pas puisqu'ils font appels à une fonction qui ne fait que l'insertion
R.Seif est actuellement connecté
mais il doit me retourner la valeur même si elle est nulle!!!!
select mape_add_peer ('192.168.1.13',80);
une @ ip et un numéro de port quelconques commes entrées!!!!!
mape_add_peer
---------------
(1 file)
tu vois?
j'ai complété la condition, "else return peerid;"
et j'ai fait des raise notice à chaque étape, toujours rien!!!!!!!!!!!!!!!
Bonjour,
j'ai un code qui est bien écrit, je suppose, mais qui ne retourne aucun résultat.
ça tourne, mais à la fin je n'ai une insertion ni dans la table ips, ni dans la table peers!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
create or replace FUNCTION mape_add_peer(inet,integer) RETURNS integer
AS $$
DECLARE
p_addr ALIAS for $1;
p_port ALIAS for $2;
ipid integer;
peerid integer;
BEGIN
-- Is the peer already set ?
select into peerid peers.id from peers, ips
where peers.ip = ips.ip and peers.id = ips.id and peers.ip = p_addr and peers.port = p_port;
IF peerid = 0
then
------ Get the ID corresponding to the address
select into ipid id from ips where ips.ip= p_addr;
IF ipid >= 1
then
insert into peers(ip, port, tmstmp) values (p_addr, p_port, date_trunc ('minute', current_timestamp));
select into peerid currval('peers_id_seq');
else
insert into ips(ip,md5) values (addr,'-');
select into ipid currval('ips_id_seq');
insert into peers(ip, port, tmstmp) values (p_addr, p_port, date_trunc ('minute', current_timestamp));
select into peerid currval('peers_id_seq');
end IF;
end IF;
return peerid;
end;$$
LANGUAGE plpgsql;
ok, merci
Bonjour,
j'ai les infos suivantes:
- max_connections = 1000
- max_files_per_process = 1000
- work_mem = 1MB
- shared_buffers = 24MB
- effective_cache_size = 128 MB
Je voulais savoirs le nbre de connexions max simultanées que peut supporter le serveur??
Bonsoir,
je veux vider ma table chaque 30 min, l'option timer n'existe pas avec truncate!!!
qqu'un sait comment le faire?
create OR replace FUNCTION mape_get_ip(inet) RETURNS integer
AS $$
DECLARE
addr ALIAS for $1;
ipid integer;
BEGIN
select into ipid ip from ips where ips.ip= addr;
return ipid;
end;$$
LANGUAGE plpgsql;
--------------------------------------------------------------------------------------
create OR replace FUNCTION mape_get_peer(inet,integer) RETURNS integer
AS $$
DECLARE
addr ALIAS FOR $1;
port ALIAS FOR $2;
ipid integer;
peerid integer;
BEGIN
-- Get the ID corresponding to the address
select into ipid mape_get_ip(addr);
IF ipid >= 1
then
select into peerid id FROM peers WHERE peers.ip = addr AND peers.port = port;
return peerid;
else
return 0;
end IF;
end;$$
LANGUAGE plpgsql;
----------------------------------------------------------------------------------------
select into peerid mape_get_peer(p_addr,p_port);
ou bien
create or replace FUNCTION mape_get_peer(inet,integer) RETURNS integer
AS $$
DECLARE
addr ALIAS for $1;
port ALIAS for $2;
--ipid integer;
peerid integer;
BEGIN
select into peerid id from peers, ips
where peers.ip = ips.ip and peers.id = ips.id and peers.ip = addr and peers.port = port;
if peerid > 0
return peerid;
else
return 0;
end IF;
end;$$
LANGUAGE plpgsql;
Bonjour,
Je me demandais c koi la solution la plus optimale?
est ce d'opter à chaque fois à l'appel de deux fonctions chacune scanne une table et rende un résultalt, ou bien faire une jointure entre les deux table avec toutes les conditions et rendre un seul résultat????
wé je l'ai fixé.
host fait l'extraction de l'@ IP en texte.
càd host('192.168.1.1') --> 192.168.1.1
pardon j'ai pa fé attention, mé vous voulez dire que l'index sur mape_add_ip n'est ce pa?
parce que j'ai pas fait d'index en mape_get_ip
c fait.
en plus j'ai gagné trop au niveau comparaison puisque mon prog utilise 5 fois la fonction mape_get_ip.
Je vous remercie.
et bah ça ne marche pas quand je fais l'insert avant le select.
et pour l'index?
en fait le test que je vais essayer est énorme, pour des observations de 1 journée, il me faut une journée pour récupérer les résultats.
donc j'ai opté à éliminer les index puisqu'ils ne sont efficace qu'en lecture, et non pas en écriture.
Bonjour,
Lors du programme si dessous, je veux insérer une @IP, tester son existance, me rendre un msg d'erreur (qui ne soit pas systématique) s'il existe, sinon on insère cette nouvelle @.
-- MAPE_ADD_IP
-- Takes a CIDR representation of the IP in input and adds a record in the ips table
-- returns the index of the entry
-- if the entry exists, returns simply the ID
--
CREATE OR REPLACE FUNCTION mape_add_ip(inet) RETURNS inet
AS $$
DECLARE
addr ALIAS FOR $1;
md5ip varchar;
ipid INTEGER;
BEGIN
SELECT INTO ipid mape_get_ip(addr);
IF ipid >= 1
THEN
return (addr);
ELSE
INSERT INTO ips(ip,md5) VALUES (addr,'-');
--SELECT INTO ipid currval('ips_id_seq');
END IF;
return (addr);
END;$$
LANGUAGE plpgsql;
-----------------------------------------------------------------------------------------
-- MAPE_GET_IP
-- Returns the ID of the given addr
--
CREATE OR REPLACE FUNCTION mape_get_ip(inet) RETURNS integer
AS $$
DECLARE
addr ALIAS FOR $1;
ipid INTEGER;
BEGIN
SELECT INTO ipid ip FROM ips WHERE host(ips.ip) = host(addr);
IF ipid >=1
THEN
return ipid;
ELSE
return 0;
END IF;
END;$$
LANGUAGE plpgsql;
--
cette opération va se faire plusieurs fois, donc j'ai pensé utiliser INSERT ... RUNNING ... mais j'ai pas su comment l'utiliser?
Pages : 1