/test/batch.erl

https://gitlab.com/barrel-db/erlang-rocksdb · Erlang · 169 lines · 127 code · 42 blank · 0 comment · 0 complexity · f99859280df568c7ba0e512699ad2e00 MD5 · raw file

  1. -module(batch).
  2. -compile([export_all/1]).
  3. -include_lib("eunit/include/eunit.hrl").
  4. destroy_reopen(DbName, Options) ->
  5. _ = rocksdb:destroy(DbName, []),
  6. {ok, Db} = rocksdb:open(DbName, Options),
  7. Db.
  8. close_destroy(Db, DbName) ->
  9. rocksdb:close(Db),
  10. rocksdb:destroy(DbName, []).
  11. basic_test() ->
  12. Db = destroy_reopen("test.db", [{create_if_missing, true}]),
  13. {ok, Batch} = rocksdb:batch(),
  14. ok = rocksdb:batch_put(Batch, <<"a">>, <<"v1">>),
  15. ok = rocksdb:batch_put(Batch, <<"b">>, <<"v2">>),
  16. ?assertEqual(2, rocksdb:batch_count(Batch)),
  17. ?assertEqual(not_found, rocksdb:get(Db, <<"a">>, [])),
  18. ?assertEqual(not_found, rocksdb:get(Db, <<"b">>, [])),
  19. ok = rocksdb:write_batch(Db, Batch, []),
  20. ?assertEqual({ok, <<"v1">>}, rocksdb:get(Db, <<"a">>, [])),
  21. ?assertEqual({ok, <<"v2">>}, rocksdb:get(Db, <<"b">>, [])),
  22. ok = rocksdb:release_batch(Batch),
  23. close_destroy(Db, "test.db"),
  24. ok.
  25. delete_test() ->
  26. Db = destroy_reopen("test.db", [{create_if_missing, true}]),
  27. {ok, Batch} = rocksdb:batch(),
  28. ok = rocksdb:batch_put(Batch, <<"a">>, <<"v1">>),
  29. ok = rocksdb:batch_put(Batch, <<"b">>, <<"v2">>),
  30. ok = rocksdb:batch_delete(Batch, <<"b">>),
  31. ?assertEqual(3, rocksdb:batch_count(Batch)),
  32. ?assertEqual(not_found, rocksdb:get(Db, <<"a">>, [])),
  33. ?assertEqual(not_found, rocksdb:get(Db, <<"b">>, [])),
  34. ok = rocksdb:write_batch(Db, Batch, []),
  35. ?assertEqual({ok, <<"v1">>}, rocksdb:get(Db, <<"a">>, [])),
  36. ?assertEqual(not_found, rocksdb:get(Db, <<"b">>, [])),
  37. ok = rocksdb:release_batch(Batch),
  38. close_destroy(Db, "test.db"),
  39. ok.
  40. single_delete_test() ->
  41. Db = destroy_reopen("test.db", [{create_if_missing, true}]),
  42. {ok, Batch} = rocksdb:batch(),
  43. ok = rocksdb:batch_put(Batch, <<"a">>, <<"v1">>),
  44. ok = rocksdb:write_batch(Db, Batch, []),
  45. ?assertEqual({ok, <<"v1">>}, rocksdb:get(Db, <<"a">>, [])),
  46. ok = rocksdb:release_batch(Batch),
  47. {ok, Batch1} = rocksdb:batch(),
  48. ok = rocksdb:batch_single_delete(Batch1, <<"a">>),
  49. ok = rocksdb:write_batch(Db, Batch1, []),
  50. ok = rocksdb:release_batch(Batch1),
  51. ?assertEqual(not_found, rocksdb:get(Db, <<"a">>, [])),
  52. close_destroy(Db, "test.db"),
  53. ok.
  54. delete_with_notfound_test() ->
  55. Db = destroy_reopen("test.db", [{create_if_missing, true}]),
  56. {ok, Batch} = rocksdb:batch(),
  57. ok = rocksdb:batch_put(Batch, <<"a">>, <<"v1">>),
  58. ok = rocksdb:batch_put(Batch, <<"b">>, <<"v2">>),
  59. ok = rocksdb:batch_delete(Batch, <<"c">>),
  60. ?assertEqual(3, rocksdb:batch_count(Batch)),
  61. ?assertEqual(not_found, rocksdb:get(Db, <<"a">>, [])),
  62. ?assertEqual(not_found, rocksdb:get(Db, <<"b">>, [])),
  63. ok = rocksdb:write_batch(Db, Batch, []),
  64. ?assertEqual({ok, <<"v1">>}, rocksdb:get(Db, <<"a">>, [])),
  65. ?assertEqual({ok, <<"v2">>}, rocksdb:get(Db, <<"b">>, [])),
  66. ok = rocksdb:release_batch(Batch),
  67. close_destroy(Db, "test.db"),
  68. ok.
  69. tolist_test() ->
  70. {ok, Batch} = rocksdb:batch(),
  71. ok = rocksdb:batch_put(Batch, <<"a">>, <<"v1">>),
  72. ok = rocksdb:batch_put(Batch, <<"b">>, <<"v2">>),
  73. ?assertEqual(2, rocksdb:batch_count(Batch)),
  74. ?assertEqual([{put, <<"a">>, <<"v1">>}, {put, <<"b">>, <<"v2">>}], rocksdb:batch_tolist(Batch)),
  75. ok = rocksdb:release_batch(Batch),
  76. ok.
  77. rollback_test() ->
  78. {ok, Batch} = rocksdb:batch(),
  79. ok = rocksdb:batch_put(Batch, <<"a">>, <<"v1">>),
  80. ok = rocksdb:batch_put(Batch, <<"b">>, <<"v2">>),
  81. ok = rocksdb:batch_savepoint(Batch),
  82. ok = rocksdb:batch_put(Batch, <<"c">>, <<"v3">>),
  83. ?assertEqual(3, rocksdb:batch_count(Batch)),
  84. ?assertEqual([{put, <<"a">>, <<"v1">>},
  85. {put, <<"b">>, <<"v2">>},
  86. {put, <<"c">>, <<"v3">>}], rocksdb:batch_tolist(Batch)),
  87. ok = rocksdb:batch_rollback(Batch),
  88. ?assertEqual(2, rocksdb:batch_count(Batch)),
  89. ?assertEqual([{put, <<"a">>, <<"v1">>},
  90. {put, <<"b">>, <<"v2">>}], rocksdb:batch_tolist(Batch)),
  91. ok = rocksdb:release_batch(Batch).
  92. rollback_over_savepoint_test() ->
  93. {ok, Batch} = rocksdb:batch(),
  94. ok = rocksdb:batch_put(Batch, <<"a">>, <<"v1">>),
  95. ok = rocksdb:batch_put(Batch, <<"b">>, <<"v2">>),
  96. ok = rocksdb:batch_savepoint(Batch),
  97. ok = rocksdb:batch_put(Batch, <<"c">>, <<"v3">>),
  98. ?assertEqual(3, rocksdb:batch_count(Batch)),
  99. ?assertEqual([{put, <<"a">>, <<"v1">>},
  100. {put, <<"b">>, <<"v2">>},
  101. {put, <<"c">>, <<"v3">>}], rocksdb:batch_tolist(Batch)),
  102. ok = rocksdb:batch_rollback(Batch),
  103. ?assertEqual(2, rocksdb:batch_count(Batch)),
  104. ?assertEqual([{put, <<"a">>, <<"v1">>},
  105. {put, <<"b">>, <<"v2">>}], rocksdb:batch_tolist(Batch)),
  106. ?assertMatch({error, _}, rocksdb:batch_rollback(Batch)),
  107. ok = rocksdb:release_batch(Batch).
  108. merge_test() ->
  109. Db = destroy_reopen("test.db", [{create_if_missing, true}, {merge_operator, erlang_merge_operator}]),
  110. ok = rocksdb:put(Db, <<"i">>, term_to_binary(0), []),
  111. {ok, IBin0} = rocksdb:get(Db, <<"i">>, []),
  112. 0 = binary_to_term(IBin0),
  113. {ok, Batch} = rocksdb:batch(),
  114. ok = rocksdb:batch_merge(Batch, <<"i">>, term_to_binary({int_add, 1})),
  115. {ok, IBin0} = rocksdb:get(Db, <<"i">>, []),
  116. 0 = binary_to_term(IBin0),
  117. ok = rocksdb:batch_merge(Batch, <<"i">>, term_to_binary({int_add, 2})),
  118. {ok, IBin0} = rocksdb:get(Db, <<"i">>, []),
  119. 0 = binary_to_term(IBin0),
  120. ok = rocksdb:batch_merge(Batch, <<"i">>, term_to_binary({int_add, -1})),
  121. {ok, IBin0} = rocksdb:get(Db, <<"i">>, []),
  122. 0 = binary_to_term(IBin0),
  123. ok = rocksdb:write_batch(Db, Batch, []),
  124. {ok, IBin1} = rocksdb:get(Db, <<"i">>, []),
  125. 2 = binary_to_term(IBin1),
  126. ok = rocksdb:release_batch(Batch),
  127. close_destroy(Db, "test.db").