Added tests for the backup calls
This commit is contained in:
@@ -1745,7 +1745,7 @@ static ErlNifFunc nif_funcs[] = {
|
|||||||
{"backup_init", 6, esqlite_backup_init},
|
{"backup_init", 6, esqlite_backup_init},
|
||||||
{"backup_step", 5, esqlite_backup_step},
|
{"backup_step", 5, esqlite_backup_step},
|
||||||
{"backup_remaining", 4, esqlite_backup_remaining},
|
{"backup_remaining", 4, esqlite_backup_remaining},
|
||||||
{"backup_pagecount", 4, esqlite_backup_remaining},
|
{"backup_pagecount", 4, esqlite_backup_pagecount},
|
||||||
{"backup_finish", 4, esqlite_backup_finish},
|
{"backup_finish", 4, esqlite_backup_finish},
|
||||||
|
|
||||||
{"interrupt", 1, esqlite_interrupt, ERL_NIF_DIRTY_JOB_IO_BOUND},
|
{"interrupt", 1, esqlite_interrupt, ERL_NIF_DIRTY_JOB_IO_BOUND},
|
||||||
|
|||||||
@@ -36,6 +36,7 @@
|
|||||||
column_names/1, column_names/2,
|
column_names/1, column_names/2,
|
||||||
column_types/1, column_types/2,
|
column_types/1, column_types/2,
|
||||||
backup_init/4, backup_init/5,
|
backup_init/4, backup_init/5,
|
||||||
|
backup_finish/1, backup_finish/2,
|
||||||
backup_remaining/1, backup_remaining/2,
|
backup_remaining/1, backup_remaining/2,
|
||||||
backup_pagecount/1, backup_pagecount/2,
|
backup_pagecount/1, backup_pagecount/2,
|
||||||
backup_step/2, backup_step/3,
|
backup_step/2, backup_step/3,
|
||||||
@@ -507,6 +508,17 @@ backup_init(#connection{raw_connection=Dest}, DestName, #connection{raw_connecti
|
|||||||
end.
|
end.
|
||||||
|
|
||||||
|
|
||||||
|
%% @doc Release the resources held by the backup.
|
||||||
|
-spec backup_finish(backup()) -> ok | {error, _}.
|
||||||
|
backup_finish(Backup) ->
|
||||||
|
backup_finish(Backup, ?DEFAULT_TIMEOUT).
|
||||||
|
%% @doc Like backup_finish/1, but with an extra timeout.
|
||||||
|
-spec backup_finish(backup(), timeout()) -> ok | {error, _}.
|
||||||
|
backup_finish(#backup{raw_connection=Conn, raw_backup=Back}, Timeout) ->
|
||||||
|
Ref = make_ref(),
|
||||||
|
ok = esqlite3_nif:backup_finish(Conn, Back, Ref, self()),
|
||||||
|
receive_answer(Conn, Ref, Timeout).
|
||||||
|
|
||||||
%% @doc Do a backup step.
|
%% @doc Do a backup step.
|
||||||
-spec backup_step(backup(), integer()) -> ok | {error, _}.
|
-spec backup_step(backup(), integer()) -> ok | {error, _}.
|
||||||
backup_step(Backup, NPage) ->
|
backup_step(Backup, NPage) ->
|
||||||
|
|||||||
@@ -10,7 +10,8 @@
|
|||||||
-define(DB2, "./test/dbs/temp_db2.db").
|
-define(DB2, "./test/dbs/temp_db2.db").
|
||||||
|
|
||||||
open_single_database_test() ->
|
open_single_database_test() ->
|
||||||
{ok, _C1} = esqlite3:open("test.db"),
|
cleanup(),
|
||||||
|
{ok, _C1} = esqlite3:open(?DB1),
|
||||||
ok.
|
ok.
|
||||||
|
|
||||||
close_test() ->
|
close_test() ->
|
||||||
@@ -29,13 +30,19 @@ close_test() ->
|
|||||||
ok.
|
ok.
|
||||||
|
|
||||||
open_multiple_same_databases_test() ->
|
open_multiple_same_databases_test() ->
|
||||||
|
cleanup(),
|
||||||
|
|
||||||
{ok, _C1} = esqlite3:open(?DB1),
|
{ok, _C1} = esqlite3:open(?DB1),
|
||||||
{ok, _C2} = esqlite3:open(?DB1),
|
{ok, _C2} = esqlite3:open(?DB1),
|
||||||
|
|
||||||
|
cleanup(),
|
||||||
ok.
|
ok.
|
||||||
|
|
||||||
open_multiple_different_databases_test() ->
|
open_multiple_different_databases_test() ->
|
||||||
|
cleanup(),
|
||||||
{ok, _C1} = esqlite3:open(?DB1),
|
{ok, _C1} = esqlite3:open(?DB1),
|
||||||
{ok, _C2} = esqlite3:open(?DB2),
|
{ok, _C2} = esqlite3:open(?DB2),
|
||||||
|
cleanup(),
|
||||||
ok.
|
ok.
|
||||||
|
|
||||||
get_autocommit_test() ->
|
get_autocommit_test() ->
|
||||||
@@ -444,6 +451,8 @@ prepare_and_close_connection_test() ->
|
|||||||
ok.
|
ok.
|
||||||
|
|
||||||
backup_test() ->
|
backup_test() ->
|
||||||
|
cleanup(),
|
||||||
|
|
||||||
{ok, Dest} = esqlite3:open(?DB1),
|
{ok, Dest} = esqlite3:open(?DB1),
|
||||||
{ok, Source} = esqlite3:open(?DB2),
|
{ok, Source} = esqlite3:open(?DB2),
|
||||||
|
|
||||||
@@ -452,6 +461,51 @@ backup_test() ->
|
|||||||
{ok, 0} = esqlite3:backup_pagecount(Backup),
|
{ok, 0} = esqlite3:backup_pagecount(Backup),
|
||||||
done = esqlite3:backup_step(Backup, 1),
|
done = esqlite3:backup_step(Backup, 1),
|
||||||
|
|
||||||
|
cleanup(),
|
||||||
|
|
||||||
|
ok.
|
||||||
|
|
||||||
|
backup1_test() ->
|
||||||
|
cleanup(),
|
||||||
|
|
||||||
|
{ok, Dest} = esqlite3:open(?DB1),
|
||||||
|
{ok, Source} = esqlite3:open(?DB2),
|
||||||
|
|
||||||
|
[] = esqlite3:q("create table test(one, two)", Source),
|
||||||
|
[] = esqlite3:q("begin;", Source),
|
||||||
|
[] = esqlite3:q("insert into test values(randomblob(10000), randomblob(10000));", Source),
|
||||||
|
[] = esqlite3:q("insert into test values(randomblob(10000), randomblob(10000));", Source),
|
||||||
|
[] = esqlite3:q("insert into test values(randomblob(10000), randomblob(10000));", Source),
|
||||||
|
[] = esqlite3:q("insert into test values(randomblob(10000), randomblob(10000));", Source),
|
||||||
|
[] = esqlite3:q("insert into test values(randomblob(10000), randomblob(10000));", Source),
|
||||||
|
[] = esqlite3:q("commit;", Source),
|
||||||
|
|
||||||
|
[{5}] = esqlite3:q("select count(*) from test", Source),
|
||||||
|
{error, {sqlite_error, "no such table: test"}} = esqlite3:q("select count(*) from test", Dest),
|
||||||
|
|
||||||
|
{ok, Backup} = esqlite3:backup_init(Dest, "main", Source, "main"),
|
||||||
|
|
||||||
|
{ok, 0} = esqlite3:backup_remaining(Backup),
|
||||||
|
{ok, 0} = esqlite3:backup_pagecount(Backup),
|
||||||
|
|
||||||
|
%% Backup 1 page.
|
||||||
|
ok = esqlite3:backup_step(Backup, 1),
|
||||||
|
|
||||||
|
{ok, 26} = esqlite3:backup_remaining(Backup),
|
||||||
|
{ok, 27} = esqlite3:backup_pagecount(Backup),
|
||||||
|
|
||||||
|
%% Do all the remaining pages.
|
||||||
|
done = esqlite3:backup_step(Backup, -1),
|
||||||
|
|
||||||
|
{ok, 0} = esqlite3:backup_remaining(Backup),
|
||||||
|
{ok, 27} = esqlite3:backup_pagecount(Backup),
|
||||||
|
|
||||||
|
ok = esqlite3:backup_finish(Backup),
|
||||||
|
|
||||||
|
[{5}] = esqlite3:q("select count(*) from test", Dest),
|
||||||
|
|
||||||
|
cleanup(),
|
||||||
|
|
||||||
ok.
|
ok.
|
||||||
|
|
||||||
|
|
||||||
@@ -510,5 +564,20 @@ garbage_collect_test() ->
|
|||||||
receive after 500 -> ok end,
|
receive after 500 -> ok end,
|
||||||
erlang:garbage_collect(),
|
erlang:garbage_collect(),
|
||||||
|
|
||||||
|
|
||||||
ok.
|
ok.
|
||||||
|
|
||||||
|
%%
|
||||||
|
%% Helpers
|
||||||
|
%%
|
||||||
|
|
||||||
|
cleanup() ->
|
||||||
|
rm_rf(?DB1),
|
||||||
|
rm_rf(?DB2).
|
||||||
|
|
||||||
|
rm_rf(Filename) ->
|
||||||
|
case file:delete(Filename) of
|
||||||
|
ok -> ok;
|
||||||
|
{error, _} -> ok
|
||||||
|
end.
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user