Packages
electric
1.4.7
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.
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 :prim_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))
def exists?(path), do: match?({:ok, _}, :prim_file.read_file_info(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
def delete(path) do
:prim_file.delete(path)
end
end