Current section
Files
Jump to
Current section
Files
lib/postgrex/extensions/bit_string.ex
defmodule Postgrex.Extensions.BitString do
@moduledoc false
import Postgrex.BinaryUtils, warn: false
use Postgrex.BinaryExtension, [send: "bit_send",send: "varbit_send"]
def init(opts), do: Keyword.fetch!(opts, :decode_binary)
def encode(_) do
quote location: :keep do
val when is_binary(val) ->
[<<(byte_size(val) + 4)::int32, bit_size(val)::uint32>> | val]
val when is_bitstring(val) ->
bin_size = byte_size(val)
last_pos = bin_size - 1
<<binary::binary-size(last_pos), last::bits>> = val
pad = 8 - bit_size(last)
bit_count = bit_size(val)
[<<(bin_size+4)::int32, bit_count::uint32>>, binary |
<<last::bits, 0::size(pad)>>]
val ->
raise ArgumentError, Postgrex.Utils.encode_msg(val, "a bitstring")
end
end
def decode(:copy) do
quote location: :keep do
<<len :: int32, value :: binary-size(len)>> ->
copy = :binary.copy(value)
<<len::unsigned-32, bits::bits-size(len), _::bits>> = copy
bits
end
end
def decode(:reference) do
quote location: :keep do
<<len :: int32, value :: binary-size(len)>> ->
<<len :: int32, bits :: bits-size(len), _::bits>> = value
bits
end
end
end