mauricio / postgresql-async

Async, Netty based, database drivers for PostgreSQL and MySQL written in Scala
Apache License 2.0
1.43k stars 222 forks source link

Add (or document) way to handle the postgres `inet` and/or `cidr` data types #221

Open emanresusername opened 7 years ago

emanresusername commented 7 years ago

possibly related to https://github.com/mauricio/postgresql-async/pull/57 and i'm getting to this from quill, so i'm not 100% sure if there's a way to get around it at that level, but i don't see any quill lines in the stacktrace I can't get inet values like 192.168.2.0/24 to work i get the following error

java.net.UnknownHostException: addr is of illegal length
    at java.net.InetAddress.getByAddress(InetAddress.java:1042)
    at java.net.InetAddress.getByAddress(InetAddress.java:1439)
    at com.github.mauricio.async.db.column.InetAddressEncoderDecoder$.decode(InetAddressEncoderDecoder.scala:28)
    at com.github.mauricio.async.db.column.ColumnDecoder$class.decode(ColumnDecoder.scala:28)
    at com.github.mauricio.async.db.column.InetAddressEncoderDecoder$.decode(InetAddressEncoderDecoder.scala:22)
    at com.github.mauricio.async.db.postgresql.column.PostgreSQLColumnDecoderRegistry.decode(PostgreSQLColumnDecoderRegistry.scala:52)
    at com.github.mauricio.async.db.postgresql.PostgreSQLConnection.onDataRow(PostgreSQLConnection.scala:203)
    at com.github.mauricio.async.db.postgresql.codec.PostgreSQLConnectionHandler.channelRead0(PostgreSQLConnectionHandler.scala:203)
    at io.netty.channel.SimpleChannelInboundHandler.channelRead(SimpleChannelInboundHandler.java:105)
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:373)
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:359)
    at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:351)
    at io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:293)
    at io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:280)
    at io.netty.handler.codec.ByteToMessageDecoder.callDecode(ByteToMessageDecoder.java:396)
    at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:248)
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:373)
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:359)
    at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:351)
    at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1334)
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:373)
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:359)
    at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:926)
    at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:129)
    at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:651)
    at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:574)
    at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:488)
    at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:450)
    at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:873)
    at java.lang.Thread.run(Thread.java:745)
mirabout commented 7 years ago

The 192.168.2.0/24 string does not have a vaild format for an InetAddress.

https://docs.oracle.com/javase/8/docs/api/java/net/InetAddress.html https://docs.oracle.com/javase/8/docs/api/java/net/Inet4Address.html#format

Its really represents not a single InetAddress but some tuple like (InetAddress, subnet mask length). You might try selecting the address bits itself and the mask as two separate columns and expect these columns in a result set.

emanresusername commented 7 years ago

yeah, i guess i should rephrase the title there to clarify i'm mean the format for the inet postgres keyword as opposed to the java InetAddress

mirabout commented 7 years ago

From https://www.postgresql.org/docs/9.3/static/datatype-net-types.html

Tip: If you do not like the output format for inet or cidr values, try the functions host, text, and abbrev

I suggest selecting the host bits and the subnet mask as two separate columns (not sure how it should be done in your ORM though)