Skip to content
This repository was archived by the owner on Dec 17, 2018. It is now read-only.

Commit a8553fb

Browse files
connor rigbyConnorRigby
authored andcommitted
1 parent 538085f commit a8553fb

File tree

7 files changed

+84
-4
lines changed

7 files changed

+84
-4
lines changed

c_src/esqlite3_nif.c

Lines changed: 42 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,8 @@ typedef enum {
6060
cmd_column_types,
6161
cmd_close,
6262
cmd_stop,
63-
cmd_insert
63+
cmd_insert,
64+
cmd_enable_load_extension
6465
} command_type;
6566

6667
typedef struct {
@@ -625,6 +626,14 @@ do_column_types(ErlNifEnv *env, sqlite3_stmt *stmt)
625626
enif_free(array);
626627
return column_types;
627628
}
629+
static ERL_NIF_TERM
630+
do_enable_extension(ErlNifEnv *env, esqlite_connection *conn, const ERL_NIF_TERM arg)
631+
{
632+
int rc = sqlite3_enable_load_extension(conn->db, 1);
633+
if(rc != SQLITE_OK)
634+
return make_sqlite3_error_tuple(env, rc, conn->db);
635+
return make_atom(env, "ok");
636+
}
628637

629638
static ERL_NIF_TERM
630639
do_close(ErlNifEnv *env, esqlite_connection *conn, const ERL_NIF_TERM arg)
@@ -673,6 +682,8 @@ evaluate_command(esqlite_command *cmd, esqlite_connection *conn)
673682
return do_close(cmd->env, conn, cmd->arg);
674683
case cmd_insert:
675684
return do_insert(cmd->env, conn, cmd->arg);
685+
case cmd_enable_load_extension:
686+
return do_enable_extension(cmd->env, conn, cmd->arg);
676687
default:
677688
return make_error_tuple(cmd->env, "invalid_command");
678689
}
@@ -1144,6 +1155,34 @@ esqlite_column_types(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[])
11441155
return push_command(env, conn, cmd);
11451156
}
11461157

1158+
/*
1159+
* Enable extension loading
1160+
*/
1161+
static ERL_NIF_TERM
1162+
esqlite_enable_load_extension(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[])
1163+
{
1164+
esqlite_connection *conn;
1165+
esqlite_command *cmd = NULL;
1166+
ErlNifPid pid;
1167+
1168+
if(!enif_get_resource(env, argv[0], esqlite_connection_type, (void **) &conn))
1169+
return enif_make_badarg(env);
1170+
if(!enif_is_ref(env, argv[1]))
1171+
return make_error_tuple(env, "invalid_ref");
1172+
if(!enif_get_local_pid(env, argv[2], &pid))
1173+
return make_error_tuple(env, "invalid_pid");
1174+
1175+
cmd = command_create();
1176+
if(!cmd)
1177+
return make_error_tuple(env, "command_create_failed");
1178+
1179+
cmd->type = cmd_enable_load_extension;
1180+
cmd->ref = enif_make_copy(cmd->env, argv[1]);
1181+
cmd->pid = pid;
1182+
1183+
return push_command(env, conn, cmd);
1184+
}
1185+
11471186
/*
11481187
* Close the database
11491188
*/
@@ -1220,7 +1259,8 @@ static ErlNifFunc nif_funcs[] = {
12201259
{"bind", 5, esqlite_bind},
12211260
{"column_names", 4, esqlite_column_names},
12221261
{"column_types", 4, esqlite_column_types},
1223-
{"close", 3, esqlite_close}
1262+
{"close", 3, esqlite_close},
1263+
{"enable_load_extension", 3, esqlite_enable_load_extension}
12241264
};
12251265

12261266
ERL_NIF_INIT(Elixir.Esqlite3Nif, nif_funcs, on_load, on_reload, on_upgrade, NULL);

erl_test/esqlite_test.erl

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -299,6 +299,17 @@ map_test() ->
299299

300300
ok.
301301

302+
enable_load_extension_test() ->
303+
{ok, Db} = esqlite3:open(":memory:"),
304+
?assertEqual(ok, esqlite3:enable_load_extension(Db)),
305+
ok.
306+
307+
extension_use_test() ->
308+
{ok, Db} = esqlite3:open(":memory:"),
309+
ok = esqlite3:exec("create virtual table test_table using fts3(content text);", Db),
310+
ok.
311+
312+
302313
error1_msg_test() ->
303314
{ok, Db} = esqlite3:open(":memory:"),
304315

erl_test/test_helper.exs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,5 @@
11
:code.ensure_loaded(:esqlite_test)
2-
:esqlite_test.test()
2+
case :esqlite_test.test() do
3+
:error -> System.halt(1)
4+
other -> other
5+
end

lib/esqlite3/esqlite3.ex

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -201,6 +201,19 @@ defmodule Esqlite3 do
201201
receive_answer(ref, timeout)
202202
end
203203

204+
@doc "Enable the database to load extensions"
205+
@spec enable_load_extension(connection) :: :ok | error_tup2
206+
def enable_load_extension(connection), do: enable_load_extension(connection, @default_timeout)
207+
208+
@doc "Enable the database to load extensions"
209+
@spec enable_load_extension(connection, timeout) :: :ok | error_tup2
210+
def enable_load_extension(connection, timeout)
211+
def enable_load_extension({:connection, _ref, connection}, timeout) do
212+
ref = make_ref()
213+
:ok = Esqlite3Nif.enable_load_extension(connection, ref, self())
214+
receive_answer(ref, timeout)
215+
end
216+
204217
@doc "Execute a sql statement, returns a list with tuples."
205218
def q(sql, connection), do: q(sql, [], connection)
206219

lib/esqlite3/esqlite3_nif.ex

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,10 @@ defmodule Esqlite3Nif do
8383
@spec insert(connection, reference, pid, sql) :: :ok | error_tup2
8484
def insert(_db, _ref, _dest, _sql), do: :erlang.nif_error(:nif_library_not_loaded)
8585

86+
@doc "Enable extension loading."
87+
@spec enable_load_extension(connection, reference, pid) :: :ok | error_tup2
88+
def enable_load_extension(_db, _ref, _dest), do: :erlang.nif_error(:nif_library_not_loaded)
89+
8690
@on_load :load_nif
8791
@doc false
8892
def load_nif do

lib/esqlite3/esqlite_erlang_def.ex

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
defmodule :esqlite3 do
22
defdelegate open(filename), to: Esqlite3
3-
defdelegate open(filename, timeout), to: Esqlite3
3+
defdelegate open(filename, flags), to: Esqlite3
4+
defdelegate open(filename, flags, timeout), to: Esqlite3
45
defdelegate exec(sql, connection), to: Esqlite3
56
defdelegate exec(sql, params, connection), to: Esqlite3
67
defdelegate changes(connection), to: Esqlite3
@@ -19,6 +20,8 @@ defmodule :esqlite3 do
1920
defdelegate column_names(statement, timeout), to: Esqlite3
2021
defdelegate column_types(statement), to: Esqlite3
2122
defdelegate column_types(statement, timeout), to: Esqlite3
23+
defdelegate enable_load_extension(connection), to: Esqlite3
24+
defdelegate enable_load_extension(connection, timeout), to: Esqlite3
2225
defdelegate close(connection), to: Esqlite3
2326
defdelegate close(connection, timeout), to: Esqlite3
2427
defdelegate fetchone(statement), to: Esqlite3

test/esqlite3/esqlite3_test.exs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,12 @@ defmodule Esqlite3Test do
2323
Esqlite3.exec("create table test_table(one varchar(10), two int);", db)
2424
end
2525

26+
test "enable loadable extensions" do
27+
{:ok, db} = Esqlite3.open(":memory:")
28+
assert match?(:ok, Esqlite3.enable_load_extension(db))
29+
:ok = Esqlite3.exec("create virtual table test_table using fts3(content text);", db)
30+
end
31+
2632
test "simple query" do
2733
{:ok, db} = Esqlite3.open(":memory:")
2834
:ok = Esqlite3.exec("begin;", db)

0 commit comments

Comments
 (0)