PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

Vous n'êtes pas identifié(e).

#1 Re : C et C++ » la lecture ça passe, l'écriture ça casse. » 29/04/2010 10:29:32

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.

#2 Re : C et C++ » la lecture ça passe, l'écriture ça casse. » 28/04/2010 17:08:46

:oops:
ça commence à m'enerver.
je n'ai rien comme réponse pour ces deux requêtes.

#3 Re : C et C++ » la lecture ça passe, l'écriture ça casse. » 28/04/2010 16:47:21

non, rien.
par contre la fonction mape_add_ip contient l'insert, et ça s'effectue sans problème.

#4 Re : C et C++ » la lecture ça passe, l'écriture ça casse. » 28/04/2010 16:39:53

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.

#5 C et C++ » la lecture ça passe, l'écriture ça casse. » 28/04/2010 15:49:52

R.Seif
Réponses : 8

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é

#6 Re : Général » ça neretourne rien » 23/04/2010 23:26:53

mais il doit me retourner la valeur même si elle est nulle!!!!

#7 Re : Général » ça neretourne rien » 23/04/2010 14:22:56

select mape_add_peer ('192.168.1.13',80);

une @ ip et un numéro de port quelconques commes entrées!!!!!

#8 Re : Général » ça neretourne rien » 23/04/2010 14:17:28

 mape_add_peer 
---------------
              
(1 file)

tu vois?

#9 Re : Général » ça neretourne rien » 23/04/2010 14:13:40

j'ai complété la condition, "else return peerid;"
et j'ai fait des raise notice à chaque étape, toujours rien!!!!!!!!!!!!!!!

#10 Général » ça neretourne rien » 23/04/2010 13:22:53

R.Seif
Réponses : 9

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;

#12 Optimisation » Nbre de cx simultanées? » 21/04/2010 16:44:10

R.Seif
Réponses : 2

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??

#13 Réplication » truncate » 20/04/2010 16:55:16

R.Seif
Réponses : 1

Bonsoir,

je veux vider ma table chaque 30 min, l'option timer n'existe pas avec truncate!!!
qqu'un sait comment le faire?

#15 Re : Optimisation » Appel de deux fonctions ou jointure?? » 20/04/2010 15:36:06

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;

#16 Optimisation » Appel de deux fonctions ou jointure?? » 20/04/2010 11:54:30

R.Seif
Réponses : 4

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????

#17 Re : Optimisation » optimisation de l'insertion et la selection » 19/04/2010 16:16:44

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

#18 Re : Optimisation » optimisation de l'insertion et la selection » 19/04/2010 15:52:06

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.
smile

#19 Re : Optimisation » optimisation de l'insertion et la selection » 19/04/2010 14:42:41

et bah ça ne marche pas quand je fais l'insert avant le select.

#20 Re : Optimisation » optimisation de l'insertion et la selection » 19/04/2010 14:18:53

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.

#21 Optimisation » optimisation de l'insertion et la selection » 19/04/2010 13:39:55

R.Seif
Réponses : 9

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?

Pied de page des forums

Propulsé par FluxBB