Packages
electric
1.1.6
1.7.8
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.
Retired package: Release invalid - Has a critical bug in replication stream handling. Please upgrade to >= 1.1.7
Current section
Files
Jump to
Current section
Files
lib/electric/shape_cache/pure_file_storage/file_info.ex
defmodule Electric.ShapeCache.PureFileStorage.FileInfo do
require Record
alias Electric.ShapeCache.Storage
Record.defrecord(:file_info, Record.extract(:file_info, from_lib: "kernel/include/file.hrl"))
def file_size(path) do
with {:ok, info} <- :prim_file.read_file_info(path) do
{:ok, file_info(info, :size)}
end
end
def get_file_size!(path) do
case file_size(path) do
{:ok, result} ->
result
{:error, :enoent} ->
nil
{:error, reason} ->
raise Storage.Error, message: inspect(reason)
end
end
defdelegate stat(path), to: :prim_file, as: :read_file_info
def ls(path) do
with {:ok, list} <- :prim_file.list_dir(path) do
{:ok, Enum.map(list, &to_string/1)}
end
end
def mkdir_p(path) do
if match?({:ok, file_info(type: :directory)}, stat(path)) do
:ok
else
parent = Path.dirname(path)
if parent == path do
{:error, :einval}
else
_ = mkdir_p(parent)
case :file.make_dir(path) do
{:error, :eexist} = error ->
if dir?(path), do: :ok, else: error
other ->
other
end
end
end
end
def dir?(path), do: match?({:ok, file_info(type: :directory)}, stat(path))
defdelegate rename(old, new), to: :prim_file
def recursive_disk_usage(path, acc \\ 0) do
case stat(path) do
{:ok, file_info(size: size, type: :regular)} ->
size + acc
{:ok, file_info(type: :directory)} ->
case ls(path) do
{:ok, files} ->
Enum.reduce(files, acc, &recursive_disk_usage(Path.join(path, &1), &2))
{:error, _} ->
0
end
{:ok, _} ->
0
{:error, _} ->
0
end
end
def truncate(path, size) do
File.open!(path, [:read, :write, :raw], fn file ->
:file.position(file, size)
:file.truncate(file)
end)
end
end