Re: FW: New function - hostmask - Mailing list pgsql-patches
From | Bruce Momjian |
---|---|
Subject | Re: FW: New function - hostmask |
Date | |
Msg-id | 200303212152.h2LLqe615586@candle.pha.pa.us Whole thread Raw |
List | pgsql-patches |
I have added this function after confirmation from another user that this is a function of general value. I changed the original oid because the original was was already in use. --------------------------------------------------------------------------- pgman wrote: > > Yes, and I emailed you back asking for the purpose of the function. I > looked in the patch and now see: > > + <entry><function>hostmask</function>(<type>inet</type>)</entry> > + <entry><type>inet</type></entry> > + <entry>construct hostmask for network</entry> > + <entry><literal>hostmask('192.168.23.20/30')</literal></entry> > + <entry><literal>0.0.0.3</literal></entry> > > Is this something that is of general value? > > --------------------------------------------------------------------------- > > greg wrote: > > > > Hi Bruce, > > > > Apologies for sending this directly to you but I posted a patch last > > week to the pgsql-patches mailing list. > > > > I haven't heard anything back .. Not sure if this was overlooked, or was > > problematic in a way not familiar to me. > > > > Would appreciate a response. > > > > Thanks, > > > > -Greg > > > > -- > > Dr. Greg Wickham GrangeNet Network Operations Manager > > Phone: +61 2 6222 3552 AARNet Pty Ltd > > Mob : +61 4 0785 4566 Australian Academic and > > Email: greg.wickham@grangenet.net Research Network > > > > -----Original Message----- > > From: greg [mailto:greg.wickham@grangenet.net] > > Sent: Thursday, February 13, 2003 6:04 PM > > To: 'pgsql-patches@postgresql.org' > > Subject: New function - hostmask > > > > > > > > Hi, > > > > Have (by necessity) copied and altered the existing 'netmask' function > > in postgresql to perform 'hostmask' style duties. > > > > A diff against v7.3.2 is attached. > > > > The patch affects three files: > > > > postgresql-7.3.2/doc/src/sgml/func.sgml - Updated list of network > > functions with a simple example > > postgresql-7.3.2/src/backend/utils/adt/network.c - The bulk of the new > > 'hostmask' routine. > > postgresql-7.3.2/src/include/catalog/pg_proc.h - Addition of function > > 'hostmask' into pg_proc > > > > Note that I arbitrarily chose 2311 as the OID (in pg_proc) as it was > > unused (although not guaranteed to be the lowest unused value). > > > > Would appreciate any feedback on this (first submission to postgresql > > and all), > > -- Bruce Momjian | http://candle.pha.pa.us pgman@candle.pha.pa.us | (610) 359-1001 + If your life is a hard drive, | 13 Roberts Road + Christ can be your backup. | Newtown Square, Pennsylvania 19073 Index: doc/src/sgml/func.sgml =================================================================== RCS file: /cvsroot/pgsql-server/doc/src/sgml/func.sgml,v retrieving revision 1.145 diff -c -c -r1.145 func.sgml *** doc/src/sgml/func.sgml 20 Mar 2003 18:58:02 -0000 1.145 --- doc/src/sgml/func.sgml 21 Mar 2003 21:49:26 -0000 *************** *** 5900,5905 **** --- 5900,5912 ---- <entry><literal>255.255.255.0</literal></entry> </row> <row> + <entry><function>hostmask</function>(<type>inet</type>)</entry> + <entry><type>inet</type></entry> + <entry>construct hostmask for network</entry> + <entry><literal>hostmask('192.168.23.20/30')</literal></entry> + <entry><literal>0.0.0.3</literal></entry> + </row> + <row> <entry><literal><function>network</function>(<type>inet</type>)</literal></entry> <entry><type>cidr</type></entry> <entry>extract network part of address</entry> Index: src/backend/utils/adt/network.c =================================================================== RCS file: /cvsroot/pgsql-server/src/backend/utils/adt/network.c,v retrieving revision 1.38 diff -c -c -r1.38 network.c *** src/backend/utils/adt/network.c 13 Nov 2002 00:39:47 -0000 1.38 --- src/backend/utils/adt/network.c 21 Mar 2003 21:49:34 -0000 *************** *** 605,610 **** --- 605,650 ---- PG_RETURN_INET_P(dst); } + Datum + network_hostmask(PG_FUNCTION_ARGS) + { + inet *ip = PG_GETARG_INET_P(0); + inet *dst; + + dst = (inet *) palloc(VARHDRSZ + sizeof(inet_struct)); + /* make sure any unused bits are zeroed */ + MemSet(dst, 0, VARHDRSZ + sizeof(inet_struct)); + + if (ip_family(ip) == AF_INET) + { + /* It's an IP V4 address: */ + unsigned long mask = 0xffffffff; + + /* + * Only shift if the mask len is < 32 bits .. + */ + + if (ip_bits(ip) < 32) + mask >>= ip_bits(ip); + else + mask = 0; + + ip_v4addr(dst) = htonl(mask); + + ip_bits(dst) = 32; + } + else + /* Go for an IPV6 address here, before faulting out: */ + elog(ERROR, "unknown address family (%d)", ip_family(ip)); + + ip_family(dst) = ip_family(ip); + ip_type(dst) = 0; + VARATT_SIZEP(dst) = VARHDRSZ + + ((char *) &ip_v4addr(dst) - (char *) VARDATA(dst)) + + ip_addrsize(dst); + + PG_RETURN_INET_P(dst); + } /* * Convert a value of a network datatype to an approximate scalar value. Index: src/include/catalog/pg_proc.h =================================================================== RCS file: /cvsroot/pgsql-server/src/include/catalog/pg_proc.h,v retrieving revision 1.289 diff -c -c -r1.289 pg_proc.h *** src/include/catalog/pg_proc.h 20 Mar 2003 18:58:02 -0000 1.289 --- src/include/catalog/pg_proc.h 21 Mar 2003 21:49:42 -0000 *************** *** 2358,2363 **** --- 2358,2365 ---- DESCR("show address octets only"); DATA(insert OID = 730 ( text PGNSP PGUID 12 f f t f i 1 25 "869" network_show - _null_ )); DESCR("show all parts of inet/cidr value"); + DATA(insert OID = 1362 ( hostmask PGNSP PGUID 12 f f t f i 1 869 "869" network_hostmask - _null_ )); + DESCR("hostmask of address"); DATA(insert OID = 1713 ( inet PGNSP PGUID 12 f f t f i 1 869 "25" text_inet - _null_ )); DESCR("text to inet"); DATA(insert OID = 1714 ( cidr PGNSP PGUID 12 f f t f i 1 650 "25" text_cidr - _null_ ));
pgsql-patches by date: