FUNCTION network(inet,inet) ?
От | Niels van Dijke |
---|---|
Тема | FUNCTION network(inet,inet) ? |
Дата | |
Msg-id | 3d9d53570710290624p7f41f825l95aed037c28984f9@mail.gmail.com обсуждение исходный текст |
Список | pgsql-hackers |
LS,<br /><br />I don't know if this is the right mailing list to post my request. But here it goes. PostgreSQL has greatlysupport for data types inet and cidr. But so far I haven't been able to figure out how one would convert a ip/netmask(what one will find on a network card) pair into a network cidr. <br /><br />I've written three functions whichhelp me to help me with my problem:<br /><br />CREATE OR REPLACE FUNCTION get_masklen(inet)<br /> RETURNS integer AS<br/>$BODY$<br />DECLARE<br /> _netmask ALIAS FOR $1;<br />BEGIN<br /> IF _netmask IS NULL THEN return NULL; <br /> ELSIF _netmask = '<a href="http://255.255.255.255">255.255.255.255</a>'::inet THEN return 32;<br /> ELSIF _netmask ='<a href="http://255.255.255.254">255.255.255.254</a>'::inet THEN return 31;<br /> ELSIF _netmask = ' <a href="http://255.255.255.252">255.255.255.252</a>'::inetTHEN return 30;<br /> ELSIF _netmask = '<a href="http://255.255.255.248">255.255.255.248</a>'::inetTHEN return 29;<br /> ELSIF _netmask = '<a href="http://255.255.255.240">255.255.255.240</a>'::inet THEN return 28;<br /> ELSIF _netmask = '<a href="http://255.255.255.224">255.255.255.224</a>'::inetTHEN return 27;<br /> ELSIF _netmask = '<a href="http://255.255.255.192">255.255.255.192</a>'::inet THEN return 26;<br /> ELSIF _netmask = '<a href="http://255.255.255.128">255.255.255.128</a>'::inetTHEN return 25;<br /> ELSIF _netmask = '<a href="http://255.255.255.0">255.255.255.0</a>'::inet THEN return 24; <br /> ELSIF _netmask = '<a href="http://255.255.254.0">255.255.254.0</a>'::inet THEN return 23;<br /> ELSIF _netmask = '<a href="http://255.255.252.0">255.255.252.0</a>'::inet THEN return 22;<br /> ELSIF _netmask = ' <a href="http://255.255.248.0">255.255.248.0</a>'::inet THEN return 21;<br /> ELSIF _netmask = '<a href="http://255.255.240.0">255.255.240.0</a>'::inet THEN return 20;<br /> ELSIF _netmask = '<a href="http://255.255.224.0">255.255.224.0</a>'::inet THEN return 19;<br /> ELSIF _netmask = '<a href="http://255.255.192.0">255.255.192.0</a>'::inet THEN return 18;<br /> ELSIF _netmask = '<a href="http://255.255.128.0">255.255.128.0</a>'::inet THEN return 17;<br /> ELSIF _netmask = '<a href="http://255.255.0.0">255.255.0.0</a>'::inet THEN return 16;<br /> ELSIF _netmask = '<a href="http://255.254.0.0">255.254.0.0</a>'::inet THEN return 15; <br /> ELSIF _netmask = '<a href="http://255.252.0.0">255.252.0.0</a>'::inet THEN return 14;<br /> ELSIF _netmask = '<a href="http://255.248.0.0">255.248.0.0</a>'::inet THEN return 13;<br /> ELSIF _netmask = ' <a href="http://255.240.0.0">255.240.0.0</a>'::inet THEN return 12;<br /> ELSIF _netmask = '<a href="http://255.224.0.0">255.224.0.0</a>'::inet THEN return 11;<br /> ELSIF _netmask = '<a href="http://255.192.0.0">255.192.0.0</a>'::inet THEN return 10;<br /> ELSIF _netmask = '<a href="http://255.128.0.0">255.128.0.0</a>'::inet THEN return 9;<br /> ELSIF _netmask = '<a href="http://255.0.0.0">255.0.0.0</a>'::inet THEN return 8; <br /> ELSIF _netmask = '<a href="http://254.0.0.0">254.0.0.0</a>'::inet THEN return 7;<br /> ELSIF _netmask = '<a href="http://252.0.0.0">252.0.0.0</a>'::inet THEN return 6;<br /> ELSIF _netmask = ' <a href="http://248.0.0.0">248.0.0.0</a>'::inet THEN return 5;<br /> ELSIF _netmask = '<a href="http://240.0.0.0">240.0.0.0</a>'::inet THEN return 4;<br /> ELSIF _netmask = '<a href="http://224.0.0.0"> 224.0.0.0</a>'::inet THEN return 3;<br /> ELSIF _netmask = '<a href="http://192.0.0.0">192.0.0.0</a>'::inet THENreturn 2;<br /> ELSIF _netmask = '<a href="http://128.0.0.0">128.0.0.0</a>'::inet THEN return 1; <br /> ELSIF_netmask = '<a href="http://0.0.0.0">0.0.0.0</a>'::inet THEN return 0;<br /> ELSE<br /> RAISE EXCEPTION'get_masklen(''%''): Invalid netmask', _netmask;<br /> END IF;<br /><br /> RETURN NULL;<br />END;<br />$BODY$<br/> LANGUAGE 'plpgsql' IMMUTABLE STRICT<br /> COST 100;<br /><br />CREATE OR REPLACE FUNCTION set_masklen(inet,inet)<br/> RETURNS inet AS<br />$BODY$<br />BEGIN<br /> RETURN set_masklen($1,get_masklen($2))::inet;<br />END;<br />$BODY$<br /> LANGUAGE 'plpgsql' IMMUTABLE STRICT<br /> COST 100;<br/><br />CREATE OR REPLACE FUNCTION network(inet,inet)<br /> RETURNS cidr AS<br />$BODY$<br />BEGIN<br /> RETURNset_masklen($1,get_masklen($2))::cidr; <br />END;<br />$BODY$<br /> LANGUAGE 'plpgsql' IMMUTABLE STRICT<br /> COST100;<br /><br /># SELECT network('<a href="http://1.2.3.4">1.2.3.4</a>'::inet,'<a href="http://255.255.0.0">255.255.0.0</a>'::inet);<br /> network <br />-------------<br /> <a href="http://1.2.0.0/16">1.2.0.0/16</a><br/>(1 row)<br /><br />My question is: are these interesting enough to adopt in thePostgreSQL core set of functions. Ideally not in plpgsql but written in C. A trivial thing for one of the core team toconvert into C if you ask me. If no one want to do this but still interest of adding the routines to the core set of functionsI can do the rewrite in C my self.... Well need to dust of my C skills a bit first to be honest. <br /><br />Happyhacking,<br /><br />|N.<br />
В списке pgsql-hackers по дате отправления: