Packages
electric
1.6.3
1.7.7
1.7.6
1.7.5
1.7.4
1.7.3
1.7.2
1.7.1
1.7.0
1.6.10
1.6.9
1.6.8
1.6.7
1.6.6
1.6.5
1.6.4
1.6.3
1.6.2
1.6.1
1.6.0
1.5.1
1.5.0
1.4.16
1.4.16-beta-1
1.4.15
1.4.14
1.4.13
1.4.12
1.4.11
1.4.10
1.4.8
1.4.7
1.4.6
1.4.5
1.4.4
1.4.3
1.4.2
1.4.1
1.4.0
1.3.4
1.3.3
1.3.2
1.2.4
1.2.3
1.2.2
1.2.1
1.2.0
1.1.14
1.1.13
1.1.12
1.1.11
1.1.10
1.1.9
1.1.8
1.1.7
1.1.6
retired
1.1.5
retired
1.1.4
retired
1.1.3
retired
1.1.2
1.1.1
1.1.0
1.0.24
1.0.23
1.0.22
1.0.21
1.0.20
1.0.19
1.0.18
1.0.17
1.0.15
1.0.13
1.0.12
1.0.11
1.0.10
1.0.9
1.0.5
1.0.4
1.0.3
1.0.2
1.0.1
1.0.0
1.0.0-beta.23
1.0.0-beta.22
1.0.0-beta.20
1.0.0-beta.19
1.0.0-beta.18
1.0.0-beta.17
1.0.0-beta.16
1.0.0-beta.15
1.0.0-beta.14
1.0.0-beta.13
1.0.0-beta.12
1.0.0-beta.11
1.0.0-beta.10
1.0.0-beta.9
1.0.0-beta.8
1.0.0-beta.7
1.0.0-beta.6
1.0.0-beta.5
1.0.0-beta.4
1.0.0-beta.3
1.0.0-beta.2
1.0.0-beta.1
0.9.5
0.9.4
0.9.3
0.9.2
0.9.1
0.9.0
0.8.1
0.8.0
0.7.7
0.7.6
0.7.5
0.7.4
0.7.3
0.7.2
0.7.1
0.7.0
0.6.3
0.6.2
0.6.1
0.5.2
0.4.4
Postgres sync engine. Sync little subsets of your Postgres data into local apps and services.
Current section
Files
Jump to
Current section
Files
lib/electric/replication/eval.ex
defmodule Electric.Replication.Eval do
@moduledoc """
Utilities for evaluating and converting replication-related types.
"""
@doc """
Converts a type specification to a PostgreSQL cast string.
## Parameters
- `type` - A type specification, which can be:
- An atom representing a basic PostgreSQL type
- A tuple `{:array, type}` for array types
- A tuple `{:enum, name}` for enum types
## Returns
A string representation of the PostgreSQL cast type.
## Examples
Basic types:
iex> Electric.Replication.Eval.type_to_pg_cast(:int4)
"int4"
iex> Electric.Replication.Eval.type_to_pg_cast(:text)
"text"
iex> Electric.Replication.Eval.type_to_pg_cast(:bool)
"bool"
Array types:
iex> Electric.Replication.Eval.type_to_pg_cast({:array, :int4})
"int4[]"
iex> Electric.Replication.Eval.type_to_pg_cast({:array, :text})
"text[]"
Nested array types:
iex> Electric.Replication.Eval.type_to_pg_cast({:array, {:array, :int4}})
"int4[]"
Enum types:
iex> Electric.Replication.Eval.type_to_pg_cast({:enum, :my_enum})
"my_enum"
iex> Electric.Replication.Eval.type_to_pg_cast({:enum, "custom_enum"})
"custom_enum"
Unsupported types raise errors:
iex> Electric.Replication.Eval.type_to_pg_cast({:row, []})
** (RuntimeError) Unsupported type: row
iex> Electric.Replication.Eval.type_to_pg_cast({:internal, :something})
** (RuntimeError) Unsupported type: internal
"""
def type_to_pg_cast(type, is_in_array? \\ false)
def type_to_pg_cast({:array, type}, true), do: "#{type_to_pg_cast(type, true)}"
def type_to_pg_cast({:array, type}, false), do: "#{type_to_pg_cast(type, true)}[]"
def type_to_pg_cast({:enum, name}, _), do: to_string(name)
def type_to_pg_cast({:row, _}, _), do: raise("Unsupported type: row")
def type_to_pg_cast({:internal, _}, _), do: raise("Unsupported type: internal")
def type_to_pg_cast(type, _) when is_atom(type), do: to_string(type)
@doc """
Convert a value from the eval representation to the format Postgrex expects
for binary protocol encoding.
Most types (integers, floats, booleans, dates, times, etc.) use native Elixir
types that Postgrex handles directly. UUID is a notable exception: the eval
system stores UUIDs as human-readable strings, but Postgrex expects 16-byte
raw binaries.
"""
def value_to_postgrex(value, :uuid) when is_binary(value) do
{:ok, bin} = Ecto.UUID.dump(value)
bin
end
def value_to_postgrex(value, _type), do: value
end