Skip to content

Instantly share code, notes, and snippets.

@caike
Created May 14, 2024 16:48
Show Gist options
  • Save caike/cd7f4425551a2965a1c46be397423b5a to your computer and use it in GitHub Desktop.
Save caike/cd7f4425551a2965a1c46be397423b5a to your computer and use it in GitHub Desktop.
use gen_tcp to connect to postgresql
Mix.install([
{:binpp, "~> 1.1"}
])
# version_number taken from docs:
# https://postgrespro.com/docs/postgresql/9.4/protocol-message-formats
version_number = 196_608
version = <<version_number::signed-32>>
whoami = System.cmd("whoami", []) |> elem(0) |> String.trim()
params = [
{"user", whoami}
]
message =
for {key, value} <- params do
[key, <<0>>, value, <<0>>]
end
|> List.flatten()
|> List.insert_at(-1, <<0>>)
length =
<<byte_size(version) + Enum.sum(for item <- message, do: byte_size(item)) + 4::signed-32>>
msg_startup =
[length, version, message]
|> List.flatten()
|> IO.iodata_to_binary()
{:ok, socket} =
:gen_tcp.connect(~c"localhost", 5432, [:binary, active: false], 5000)
:ok = :gen_tcp.send(socket, msg_startup)
{:ok, data} = :gen_tcp.recv(socket, 0, 2000)
:binpp.pprint(data)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment