[SQL] Requête sur une liste d'adresse ip

Requête sur une liste d'adresse ip [SQL] - SQL/NoSQL - Programmation

Marsh Posté le 08-12-2017 à 17:13:51    

:hello:  
 
Je manipule à travers un soft en C++ une base contenant un ensemble de machine. Je cherche à récupérer un fragment de la table en filtrant les machines suivant le sous-réseau auxquels elles appartiennent.  
Pour l'instant, je contourne le problème en récupérant toute la liste et en la filtrant coté c++. Ca marche, mais ca m'impose d'avoir un modèle intermédiaire que sert de proxy entre la base de donnée et le reste du soft.  
 
Je me suis dis qu'on devait pouvoir faire plus malin, et je suis arrivé à çà :
 

Code :
  1. select * from systems where ( networkaddress & inet('255.255.255.0')) <> inet('172.16.128.0');


 
Est-ce qu'on peut faire encore plus malin en passant par la macro network?  
 
Du genre:  

Code :
  1. select * from ( network(networkaddress) = network(inet('172.16.128.0/24')) );


 
mais sans erreur de syntaxe [:o_jap]


---------------
Il vaut parfois mieux allumer un lance-flamme que maudire l'obscurité. (Pratchett) // Eurosataniste convaincu.
Reply

Marsh Posté le 08-12-2017 à 17:13:51   

Reply

Marsh Posté le 08-12-2017 à 17:19:39    

Je dirais :
select * from systems where network(networkaddress) = network(inet('172.16.128.0/24'))
 
Edit : cela dit, je ne sais pas où t'as trouvé les fonctions network() et inet() :??:
Je la vois pas sur https://dev.mysql.com/doc/refman/5. [...] tions.html
Cependant, pour inet() tu devrais trouver ton bonheur avec INET_ATON(). A noter que pour avoir le sous-réseau, il doit y avoir moyen d'appliquer la définition en faisant un AND (cf https://fr.wikipedia.org/wiki/Sous- [...] %C3%A9seau )


Message édité par rufo le 08-12-2017 à 17:25:24

---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 08-12-2017 à 19:44:32    

Tapé trop vite avant de partir du boulot [:tinostar]
Evidemment je fais ma requête dans la table systems  
 
Les fonctions network() et inet() sont dispo en postgresql  
https://www.postgresql.org/docs/9.4 [...] s-net.html


---------------
Il vaut parfois mieux allumer un lance-flamme que maudire l'obscurité. (Pratchett) // Eurosataniste convaincu.
Reply

Marsh Posté le 08-12-2017 à 20:31:02    

Désolé, j'avais cru que tu étais en Mysql. Cela dit, appliquer la déf/algo du masque de sous-réseau dans ta requête avec un AND reste valable
 
Edit : je parle du AND entre 2 entiers et non de l'opérateur logique entre 2 conditions même si en logique booléenne, ça revient au même.


Message édité par rufo le 08-12-2017 à 20:32:04

---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 11-12-2017 à 16:48:05    

C'est un peu ce que j'avais trouvé comme solution en premier lieu.  
 
Mais en fait, on peut faire largement plus simple avec les fonctions pgsql:
 

Code :
  1. select * from systems where networkaddress << inet('172.16.128.0/24');

 
 
C'est propre et facile à générer en C. Ca me va bien comme solution [:le_magi61]


---------------
Il vaut parfois mieux allumer un lance-flamme que maudire l'obscurité. (Pratchett) // Eurosataniste convaincu.
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed