-
-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathworker.ex
More file actions
81 lines (68 loc) · 1.84 KB
/
Copy pathworker.ex
File metadata and controls
81 lines (68 loc) · 1.84 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
defmodule Csv2sql.Worker do
use GenServer
alias Csv2sql.{MainServer, Observer}
def start_link(_) do
GenServer.start_link(__MODULE__, :no_args)
end
def init(_) do
Process.send_after(
self(),
{:start_new_work, Application.get_env(:csv2sql, Csv2sql.Worker)},
0
)
{:ok, nil}
end
def handle_info(
{:start_new_work,
work_config = [
set_make_schema: set_make_schema,
set_insert_schema: set_insert_schema,
set_insert_data: set_insert_data
]},
_
) do
{file, row_count} = Observer.next_file()
if file do
if set_make_schema do
Observer.update_file_status(file, :infer_schema)
result = make_schema(file)
if set_insert_schema do
Observer.update_file_status(file, :insert_schema)
insert_schema(result)
end
end
if set_insert_data && row_count != 0 do
Observer.update_file_status(file, :insert_data)
insert_data(file)
end
if set_insert_data && row_count == 0, do: handle_empty_file(file)
send(self(), {:start_new_work, work_config})
{:noreply, nil}
else
MainServer.work_done()
{:noreply, nil}
end
end
defp make_schema(file) do
queries = Csv2sql.SchemaMaker.make_schema(file)
{file, queries}
end
defp insert_schema({file, queries}) do
Csv2sql.Database.make_db_schema(queries)
file
end
defp insert_data(file) do
Csv2sql.DataTransfer.process_file(file)
file
end
# Handle csvs having 0 rows, change status to finish and move to imported directory
defp handle_empty_file(file) do
Observer.update_file_status(file, :finish)
File.rename!(
file,
"#{Application.get_env(:csv2sql, MainServer)[:imported_csv_directory]}/#{
Path.basename(file)
}"
)
end
end