Current section
Files
Jump to
Current section
Files
src/parrot@internal@sqlc.erl
-module(parrot@internal@sqlc).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch]).
-define(FILEPATH, "src/parrot/internal/sqlc.gleam").
-export([decode_sqlc/1, gen_sqlc_yaml/2, sqlc_binary_path/0, get_os/0, get_cpu/0, download_zip/1, extract_sqlc_binary/1, verify_binary/0, download_binary/0]).
-export_type([type_ref/0, table_column/0, table_ref/0, table/0, schema/0, enum/0, catalog/0, query_cmd/0, query_param/0, 'query'/0, s_q_l_c/0]).
-if(?OTP_RELEASE >= 27).
-define(MODULEDOC(Str), -moduledoc(Str)).
-define(DOC(Str), -doc(Str)).
-else.
-define(MODULEDOC(Str), -compile([])).
-define(DOC(Str), -compile([])).
-endif.
?MODULEDOC(false).
-type type_ref() :: {type_ref, binary(), binary(), binary()}.
-type table_column() :: {table_column,
binary(),
boolean(),
boolean(),
binary(),
integer(),
boolean(),
boolean(),
binary(),
binary(),
boolean(),
binary(),
boolean(),
integer(),
gleam@option:option(table_ref()),
type_ref()}.
-type table_ref() :: {table_ref, binary(), binary(), binary()}.
-type table() :: {table, table_ref(), binary(), list(table_column())}.
-type schema() :: {schema, binary(), binary(), list(table()), list(enum())}.
-type enum() :: {enum, binary(), list(binary()), binary()}.
-type catalog() :: {catalog, binary(), binary(), binary(), list(schema())}.
-type query_cmd() :: one | many | exec | exec_result.
-type query_param() :: {query_param, integer(), table_column()}.
-type 'query'() :: {'query',
binary(),
binary(),
query_cmd(),
binary(),
list(table_column()),
gleam@option:option(table_ref()),
list(binary()),
list(query_param())}.
-type s_q_l_c() :: {s_q_l_c,
binary(),
binary(),
binary(),
catalog(),
list('query'())}.
-file("src/parrot/internal/sqlc.gleam", 101).
?DOC(false).
-spec decode_sqlc(gleam@dynamic:dynamic_()) -> {ok, s_q_l_c()} |
{error, list(gleam@dynamic@decode:decode_error())}.
decode_sqlc(Data) ->
Table_ref_decoder = begin
gleam@dynamic@decode:field(
<<"name"/utf8>>,
{decoder, fun gleam@dynamic@decode:decode_string/1},
fun(Name) ->
gleam@dynamic@decode:field(
<<"schema"/utf8>>,
{decoder, fun gleam@dynamic@decode:decode_string/1},
fun(Schema) ->
gleam@dynamic@decode:field(
<<"catalog"/utf8>>,
{decoder, fun gleam@dynamic@decode:decode_string/1},
fun(Catalog) ->
gleam@dynamic@decode:success(
{table_ref, Catalog, Schema, Name}
)
end
)
end
)
end
)
end,
Type_ref_decoder = begin
gleam@dynamic@decode:field(
<<"schema"/utf8>>,
{decoder, fun gleam@dynamic@decode:decode_string/1},
fun(Schema@1) ->
gleam@dynamic@decode:field(
<<"catalog"/utf8>>,
{decoder, fun gleam@dynamic@decode:decode_string/1},
fun(Catalog@1) ->
gleam@dynamic@decode:field(
<<"name"/utf8>>,
{decoder, fun gleam@dynamic@decode:decode_string/1},
fun(Name@1) ->
gleam@dynamic@decode:success(
{type_ref, Catalog@1, Schema@1, Name@1}
)
end
)
end
)
end
)
end,
Table_col_decoder = begin
gleam@dynamic@decode:field(
<<"name"/utf8>>,
{decoder, fun gleam@dynamic@decode:decode_string/1},
fun(Name@2) ->
gleam@dynamic@decode:field(
<<"not_null"/utf8>>,
{decoder, fun gleam@dynamic@decode:decode_bool/1},
fun(Not_null) ->
gleam@dynamic@decode:field(
<<"is_array"/utf8>>,
{decoder, fun gleam@dynamic@decode:decode_bool/1},
fun(Is_array) ->
gleam@dynamic@decode:field(
<<"comment"/utf8>>,
{decoder,
fun gleam@dynamic@decode:decode_string/1},
fun(Comment) ->
gleam@dynamic@decode:field(
<<"length"/utf8>>,
{decoder,
fun gleam@dynamic@decode:decode_int/1},
fun(Length) ->
gleam@dynamic@decode:field(
<<"is_named_param"/utf8>>,
{decoder,
fun gleam@dynamic@decode:decode_bool/1},
fun(Is_named_param) ->
gleam@dynamic@decode:field(
<<"is_func_call"/utf8>>,
{decoder,
fun gleam@dynamic@decode:decode_bool/1},
fun(Is_func_call) ->
gleam@dynamic@decode:field(
<<"scope"/utf8>>,
{decoder,
fun gleam@dynamic@decode:decode_string/1},
fun(Scope) ->
gleam@dynamic@decode:field(
<<"table_alias"/utf8>>,
{decoder,
fun gleam@dynamic@decode:decode_string/1},
fun(
Table_alias
) ->
gleam@dynamic@decode:field(
<<"is_sqlc_slice"/utf8>>,
{decoder,
fun gleam@dynamic@decode:decode_bool/1},
fun(
Is_sqlc_slice
) ->
gleam@dynamic@decode:field(
<<"original_name"/utf8>>,
{decoder,
fun gleam@dynamic@decode:decode_string/1},
fun(
Original_name
) ->
gleam@dynamic@decode:field(
<<"unsigned"/utf8>>,
{decoder,
fun gleam@dynamic@decode:decode_bool/1},
fun(
Unsigned
) ->
gleam@dynamic@decode:field(
<<"array_dims"/utf8>>,
{decoder,
fun gleam@dynamic@decode:decode_int/1},
fun(
Array_dims
) ->
gleam@dynamic@decode:field(
<<"table"/utf8>>,
gleam@dynamic@decode:optional(
Table_ref_decoder
),
fun(
Table
) ->
gleam@dynamic@decode:field(
<<"type"/utf8>>,
Type_ref_decoder,
fun(
Type_ref
) ->
_pipe = {table_column,
Name@2,
Not_null,
Is_array,
Comment,
Length,
Is_named_param,
Is_func_call,
Scope,
Table_alias,
Is_sqlc_slice,
Original_name,
Unsigned,
Array_dims,
Table,
Type_ref},
gleam@dynamic@decode:success(
_pipe
)
end
)
end
)
end
)
end
)
end
)
end
)
end
)
end
)
end
)
end
)
end
)
end
)
end
)
end
)
end
)
end,
Table_decoder = begin
gleam@dynamic@decode:field(
<<"rel"/utf8>>,
Table_ref_decoder,
fun(Rel) ->
gleam@dynamic@decode:field(
<<"comment"/utf8>>,
{decoder, fun gleam@dynamic@decode:decode_string/1},
fun(Comment@1) ->
gleam@dynamic@decode:field(
<<"columns"/utf8>>,
gleam@dynamic@decode:list(Table_col_decoder),
fun(Columns) ->
gleam@dynamic@decode:success(
{table, Rel, Comment@1, Columns}
)
end
)
end
)
end
)
end,
Enum_decoder = begin
gleam@dynamic@decode:field(
<<"name"/utf8>>,
{decoder, fun gleam@dynamic@decode:decode_string/1},
fun(Name@3) ->
gleam@dynamic@decode:field(
<<"vals"/utf8>>,
gleam@dynamic@decode:list(
{decoder, fun gleam@dynamic@decode:decode_string/1}
),
fun(Vals) ->
gleam@dynamic@decode:field(
<<"comment"/utf8>>,
{decoder, fun gleam@dynamic@decode:decode_string/1},
fun(Comment@2) ->
gleam@dynamic@decode:success(
{enum, Name@3, Vals, Comment@2}
)
end
)
end
)
end
)
end,
Schema_decoder = begin
gleam@dynamic@decode:field(
<<"comment"/utf8>>,
{decoder, fun gleam@dynamic@decode:decode_string/1},
fun(Comment@3) ->
gleam@dynamic@decode:field(
<<"name"/utf8>>,
{decoder, fun gleam@dynamic@decode:decode_string/1},
fun(Name@4) ->
gleam@dynamic@decode:field(
<<"tables"/utf8>>,
gleam@dynamic@decode:list(Table_decoder),
fun(Tables) ->
gleam@dynamic@decode:field(
<<"enums"/utf8>>,
gleam@dynamic@decode:list(Enum_decoder),
fun(Enums) ->
gleam@dynamic@decode:success(
{schema,
Comment@3,
Name@4,
Tables,
Enums}
)
end
)
end
)
end
)
end
)
end,
Catalog_decoder = begin
gleam@dynamic@decode:field(
<<"comment"/utf8>>,
{decoder, fun gleam@dynamic@decode:decode_string/1},
fun(Comment@4) ->
gleam@dynamic@decode:field(
<<"default_schema"/utf8>>,
{decoder, fun gleam@dynamic@decode:decode_string/1},
fun(Default_schema) ->
gleam@dynamic@decode:field(
<<"name"/utf8>>,
{decoder, fun gleam@dynamic@decode:decode_string/1},
fun(Name@5) ->
gleam@dynamic@decode:field(
<<"schemas"/utf8>>,
gleam@dynamic@decode:list(Schema_decoder),
fun(Schemas) ->
gleam@dynamic@decode:success(
{catalog,
Comment@4,
Default_schema,
Name@5,
Schemas}
)
end
)
end
)
end
)
end
)
end,
Params_decoder = begin
gleam@dynamic@decode:field(
<<"number"/utf8>>,
{decoder, fun gleam@dynamic@decode:decode_int/1},
fun(Number) ->
gleam@dynamic@decode:field(
<<"column"/utf8>>,
Table_col_decoder,
fun(Column) ->
gleam@dynamic@decode:success(
{query_param, Number, Column}
)
end
)
end
)
end,
Cmd_decoder = begin
gleam@dynamic@decode:then(
{decoder, fun gleam@dynamic@decode:decode_string/1},
fun(Cmd) -> case Cmd of
<<":one"/utf8>> ->
gleam@dynamic@decode:success(one);
<<":many"/utf8>> ->
gleam@dynamic@decode:success(many);
<<":exec"/utf8>> ->
gleam@dynamic@decode:success(exec_result);
<<":execresult"/utf8>> ->
gleam@dynamic@decode:success(exec_result);
_ ->
gleam@dynamic@decode:failure(one, <<"QueryCmd"/utf8>>)
end end
)
end,
Query_decoder = begin
gleam@dynamic@decode:field(
<<"text"/utf8>>,
{decoder, fun gleam@dynamic@decode:decode_string/1},
fun(Text) ->
gleam@dynamic@decode:field(
<<"name"/utf8>>,
{decoder, fun gleam@dynamic@decode:decode_string/1},
fun(Name@6) ->
gleam@dynamic@decode:field(
<<"cmd"/utf8>>,
Cmd_decoder,
fun(Cmd@1) ->
gleam@dynamic@decode:field(
<<"filename"/utf8>>,
{decoder,
fun gleam@dynamic@decode:decode_string/1},
fun(Filename) ->
gleam@dynamic@decode:field(
<<"columns"/utf8>>,
gleam@dynamic@decode:list(
Table_col_decoder
),
fun(Columns@1) ->
gleam@dynamic@decode:field(
<<"insert_into_table"/utf8>>,
gleam@dynamic@decode:optional(
Table_ref_decoder
),
fun(Insert_into_table) ->
gleam@dynamic@decode:field(
<<"comments"/utf8>>,
gleam@dynamic@decode:list(
{decoder,
fun gleam@dynamic@decode:decode_string/1}
),
fun(Comments) ->
gleam@dynamic@decode:field(
<<"params"/utf8>>,
gleam@dynamic@decode:list(
Params_decoder
),
fun(Params) ->
_pipe@1 = {'query',
Text,
Name@6,
Cmd@1,
Filename,
Columns@1,
Insert_into_table,
Comments,
Params},
gleam@dynamic@decode:success(
_pipe@1
)
end
)
end
)
end
)
end
)
end
)
end
)
end
)
end
)
end,
Decoder = begin
gleam@dynamic@decode:field(
<<"sqlc_version"/utf8>>,
{decoder, fun gleam@dynamic@decode:decode_string/1},
fun(Sqlc_version) ->
gleam@dynamic@decode:field(
<<"plugin_options"/utf8>>,
{decoder, fun gleam@dynamic@decode:decode_string/1},
fun(Plugin_options) ->
gleam@dynamic@decode:field(
<<"global_options"/utf8>>,
{decoder, fun gleam@dynamic@decode:decode_string/1},
fun(Global_options) ->
gleam@dynamic@decode:field(
<<"catalog"/utf8>>,
Catalog_decoder,
fun(Catalog@2) ->
gleam@dynamic@decode:field(
<<"queries"/utf8>>,
gleam@dynamic@decode:list(
Query_decoder
),
fun(Queries) ->
_pipe@2 = {s_q_l_c,
Sqlc_version,
Plugin_options,
Global_options,
Catalog@2,
Queries},
gleam@dynamic@decode:success(
_pipe@2
)
end
)
end
)
end
)
end
)
end
)
end,
gleam@dynamic@decode:run(Data, Decoder).
-file("src/parrot/internal/sqlc.gleam", 263).
?DOC(false).
-spec engine_to_sqlc_string(parrot@internal@cli:engine()) -> binary().
engine_to_sqlc_string(Engine) ->
case Engine of
my_s_q_l ->
<<"mysql"/utf8>>;
postgre_s_q_l ->
<<"postgresql"/utf8>>;
s_qlite ->
<<"sqlite"/utf8>>
end.
-file("src/parrot/internal/sqlc.gleam", 240).
?DOC(false).
-spec gen_sqlc_yaml(parrot@internal@cli:engine(), list(binary())) -> binary().
gen_sqlc_yaml(Engine, Queries) ->
Result = <<<<<<<<"
version: \"2\"
plugins:
- name: jsonb
wasm:
url: https://github.com/daniellionel01/sqlc-gen-json/releases/download/v1.0.0/sqlc-gen-json.wasm
sha256: ffbd8cfaecc971d8cdf145591eac28731ffb50b7348131868ce66cc0e3192b7e
sql:
- schema: schema.sql
queries: ["/utf8,
(gleam@string:join(Queries, <<", "/utf8>>))/binary>>/binary,
"]
engine: "/utf8>>/binary,
(engine_to_sqlc_string(Engine))/binary>>/binary,
"
codegen:
- out: .
plugin: jsonb
options:
indent: \" \"
filename: queries.json
"/utf8>>,
gleam@string:trim(Result).
-file("src/parrot/internal/sqlc.gleam", 271).
?DOC(false).
-spec sqlc_binary_path() -> binary().
sqlc_binary_path() ->
filepath:join(parrot@internal@project:root(), <<"build/.parrot/sqlc"/utf8>>).
-file("src/parrot/internal/sqlc.gleam", 275).
?DOC(false).
-spec binary_exists(binary()) -> boolean().
binary_exists(Path) ->
case simplifile_erl:is_file(Path) of
{ok, true} ->
true;
{ok, false} ->
false;
{error, _} ->
false
end.
-file("src/parrot/internal/sqlc.gleam", 396).
?DOC(false).
-spec get_os() -> binary().
get_os() ->
parrot_ffi:get_os().
-file("src/parrot/internal/sqlc.gleam", 399).
?DOC(false).
-spec get_cpu() -> binary().
get_cpu() ->
parrot_ffi:get_cpu().
-file("src/parrot/internal/sqlc.gleam", 402).
?DOC(false).
-spec download_zip(binary()) -> {ok, bitstring()} |
{error, gleam@dynamic:dynamic_()}.
download_zip(Url) ->
parrot_ffi:download_zip(Url).
-file("src/parrot/internal/sqlc.gleam", 405).
?DOC(false).
-spec extract_sqlc_binary(bitstring()) -> {ok, bitstring()} |
{error, gleam@dynamic:dynamic_()}.
extract_sqlc_binary(Tarball) ->
parrot_ffi:extract_sqlc_binary(Tarball).
-file("src/parrot/internal/sqlc.gleam", 284).
?DOC(false).
-spec get_download_path() -> {ok, binary()} |
{error, parrot@internal@errors:parrot_error()}.
get_download_path() ->
Base = <<"https://downloads.sqlc.dev/sqlc_"/utf8, "1.29.0"/utf8>>,
Os = parrot_ffi:get_os(),
Cpu = parrot_ffi:get_cpu(),
Platform = case {Os, Cpu} of
{<<"darwin"/utf8>>, <<"arm64"/utf8>>} ->
{ok, <<"_darwin_arm64.tar.gz"/utf8>>};
{<<"darwin"/utf8>>, <<"aarch64"/utf8>>} ->
{ok, <<"_darwin_arm64.tar.gz"/utf8>>};
{<<"darwin"/utf8>>, <<"amd64"/utf8>>} ->
{ok, <<"_darwin_amd64.tar.gz"/utf8>>};
{<<"darwin"/utf8>>, <<"x86_64"/utf8>>} ->
{ok, <<"_darwin_amd64.tar.gz"/utf8>>};
{<<"darwin"/utf8>>, <<"x64"/utf8>>} ->
{ok, <<"_darwin_amd64.tar.gz"/utf8>>};
{<<"linux"/utf8>>, <<"arm64"/utf8>>} ->
{ok, <<"_linux_arm64.tar.gz"/utf8>>};
{<<"linux"/utf8>>, <<"aarch64"/utf8>>} ->
{ok, <<"_linux_arm64.tar.gz"/utf8>>};
{<<"linux"/utf8>>, <<"amd64"/utf8>>} ->
{ok, <<"_linux_amd64.tar.gz"/utf8>>};
{<<"linux"/utf8>>, <<"x86_64"/utf8>>} ->
{ok, <<"_linux_amd64.tar.gz"/utf8>>};
{<<"linux"/utf8>>, <<"x64"/utf8>>} ->
{ok, <<"_linux_amd64.tar.gz"/utf8>>};
{<<"win32"/utf8>>, <<"amd64"/utf8>>} ->
{ok, <<"_windows_amd64.tar.gz"/utf8>>};
{<<"win32"/utf8>>, <<"x86_64"/utf8>>} ->
{ok, <<"_windows_amd64.tar.gz"/utf8>>};
{<<"win32"/utf8>>, <<"x64"/utf8>>} ->
{ok, <<"_windows_amd64.tar.gz"/utf8>>};
{_, _} ->
{error, <<""/utf8>>}
end,
given:ok(
Platform,
fun(_) ->
{error,
{sqlc_download_error,
<<<<<<"unsupported platform: "/utf8, Os/binary>>/binary,
", "/utf8>>/binary,
Cpu/binary>>}}
end,
fun(Platform@1) -> {ok, <<Base/binary, Platform@1/binary>>} end
).
-file("src/parrot/internal/sqlc.gleam", 319).
?DOC(false).
-spec verify_binary() -> {ok, nil} |
{error, parrot@internal@errors:parrot_error()}.
verify_binary() ->
gleam@result:'try'(
get_download_path(),
fun(Download) ->
Path = sqlc_binary_path(),
Dir = filepath:directory_name(Path),
Gen_res = parrot@internal@shellout:command(
<<"./sqlc"/utf8>>,
[<<"version"/utf8>>],
Dir,
[]
),
case Gen_res of
{error, _} ->
Information = begin
_pipe = [<<"download path: "/utf8, Download/binary>>,
<<"os: "/utf8, (parrot_ffi:get_os())/binary>>,
<<"cpu: "/utf8, (parrot_ffi:get_cpu())/binary>>,
<<"sqlc binary path: "/utf8, Path/binary>>],
gleam@string:join(_pipe, <<"\n"/utf8>>)
end,
{error,
{sqlc_download_error,
<<"could not verify sqlc binary. information:\n"/utf8,
Information/binary>>}};
{ok, V} ->
Sqlc_version = <<"v"/utf8, "1.29.0"/utf8>>,
V@1 = gleam@string:trim(V),
case V@1 =:= Sqlc_version of
true ->
{ok, nil};
false ->
{error,
{sqlc_download_error,
<<<<<<"Could not match sqlc version. Wanted "/utf8,
Sqlc_version/binary>>/binary,
". Received "/utf8>>/binary,
V@1/binary>>}}
end
end
end
).
-file("src/parrot/internal/sqlc.gleam", 358).
?DOC(false).
-spec download_binary() -> {ok, nil} |
{error, parrot@internal@errors:parrot_error()}.
download_binary() ->
Path = sqlc_binary_path(),
Dir = filepath:directory_name(Path),
case simplifile:create_directory_all(Dir) of
{ok, _} -> nil;
_assert_fail ->
erlang:error(#{gleam_error => let_assert,
message => <<"Pattern match failed, no pattern matched the value."/utf8>>,
file => <<?FILEPATH/utf8>>,
module => <<"parrot/internal/sqlc"/utf8>>,
function => <<"download_binary"/utf8>>,
line => 361,
value => _assert_fail,
start => 9612,
'end' => 9667,
pattern_start => 9623,
pattern_end => 9628})
end,
Binary_exists = binary_exists(Path),
given:that(
Binary_exists,
fun() -> {ok, nil} end,
fun() ->
gleam@result:'try'(
get_download_path(),
fun(Download) ->
gleam@result:'try'(
begin
_pipe = parrot_ffi:download_zip(Download),
gleam@result:map_error(
_pipe,
fun(_) ->
{sqlc_download_error,
<<"could not curl the sqlc binary"/utf8>>}
end
)
end,
fun(Tarball) ->
gleam@result:'try'(
begin
_pipe@1 = parrot_ffi:extract_sqlc_binary(
Tarball
),
gleam@result:map_error(
_pipe@1,
fun(_) ->
{sqlc_download_error,
<<"could not unzip the sqlc binary"/utf8>>}
end
)
end,
fun(Bin) ->
case simplifile_erl:write_bits(Path, Bin) of
{ok, _} -> nil;
_assert_fail@1 ->
erlang:error(
#{gleam_error => let_assert,
message => <<"Pattern match failed, no pattern matched the value."/utf8>>,
file => <<?FILEPATH/utf8>>,
module => <<"parrot/internal/sqlc"/utf8>>,
function => <<"download_binary"/utf8>>,
line => 382,
value => _assert_fail@1,
start => 10161,
'end' => 10212,
pattern_start => 10172,
pattern_end => 10177}
)
end,
Permissions = {file_permissions,
gleam@set:from_list(
[read, write, execute]
),
gleam@set:from_list([read, execute]),
gleam@set:from_list([read, execute])},
_ = simplifile:set_permissions(
Path,
Permissions
),
{ok, nil}
end
)
end
)
end
)
end
).