Packages
exosql
0.2.87
0.2.88
0.2.87
0.2.86
0.2.85
0.2.84
0.2.83
0.2.82
0.2.81
0.2.80
0.2.79
0.2.78
0.2.77
0.2.76
0.2.75
0.2.74
0.2.73
0.2.72
0.2.71
0.2.70
0.2.69
0.2.68
0.2.67
0.2.65
0.2.64
0.2.63
0.2.62
0.2.60
0.2.59
0.2.58
0.2.57
0.2.56
0.2.55
0.2.54
0.2.53
0.2.51
0.2.50
0.2.49
0.2.48
0.2.47
0.2.46
0.2.45
0.2.44
0.2.43
0.2.42
0.2.41
0.2.40
0.2.39
0.2.38
0.2.37
0.2.36
0.2.35
0.2.33
0.2.32
0.2.31
0.2.30
0.2.29
0.2.28
0.2.26
0.2.25
0.2.24
0.2.23
0.2.22
0.2.21
0.2.20
0.2.19
0.2.18
0.2.17
0.2.16
0.2.15
0.2.14
0.2.13
0.2.12
0.2.11
0.2.10
0.2.9
0.2.8
0.2.7
0.2.6
0.2.5
0.2.4
0.2.3
0.2.2
0.2.1
0.2.0
0.1.1
0.1.0
Universal SQL engine for Elixir. This library implements the SQL logic to perform queries on user provided databases using a simple interface based on Foreign Data Wrappers from PostgreSQL.
Current section
Files
Jump to
Current section
Files
lib/extractors/node.ex
defmodule ExoSQL.Node do
@moduledoc """
Example extractor that gather information from the system
Currently only supports the `passwd` table.
"""
def schema(_db), do: {:ok, ["passwd", "proc"]}
def schema(_db, "passwd") do
{:ok,
%{
columns: [
"user",
"x",
"uid",
"gid",
"name",
"home",
"shell"
]
}}
end
def schema(_db, "proc") do
{:ok,
%{
columns: [
"pid",
"cmd",
"args"
]
}}
end
def execute(_db, "passwd", _quals, _columns) do
csv_data = File.stream!("/etc/passwd") |> CSV.decode(separator: ?:)
rows =
for l <- csv_data do
{:ok, l} = l
l
end
{:ok,
%{
columns: [
"user",
"x",
"uid",
"gid",
"name",
"home",
"shell"
],
rows: rows
}}
end
def execute(_config, "proc", _quals, columns) do
known_columns = ["pid", "cmd", "args"]
for c <- columns do
if not (c in known_columns) do
raise MatchError, {:unknown_column, c}
end
end
{:ok, proc} = File.ls("/proc/")
# Keep only numeric procs
proc =
Enum.flat_map(proc, fn n ->
case Integer.parse(n) do
{n, ""} -> [n]
_ -> []
end
end)
rows =
Enum.map(proc, &{File.open("/proc/#{&1}/cmdline"), &1})
|> Enum.flat_map(fn
{{:ok, fd}, pid} ->
case IO.read(fd, 1024) do
:eof ->
[]
data ->
[cmd | args] = String.split(data, "\0")
[[pid, cmd, args]]
end
_ ->
[]
end)
{:ok,
%{
columns: known_columns,
rows: rows
}}
end
end