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 по дате отправления:

Предыдущее
От: Florian Weimer
Дата:
Сообщение: Re: Obfuscated definitions of database objects
Следующее
От: "Kuriakose, Cinu Cheriyamoozhiyil"
Дата:
Сообщение: grep command