Skip to content

Commit 63f3d31

Browse files
committed
renamenx work
1 parent ab9594f commit 63f3d31

File tree

5 files changed

+193
-145
lines changed

5 files changed

+193
-145
lines changed

lib/datastructures/list.ex

Lines changed: 38 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
alias Remixdb.ETSHelpers, as: ETSHelpers
2+
13
defmodule Remixdb.List do
24
use GenServer
35

@@ -297,6 +299,18 @@ defmodule Remixdb.List do
297299
GenServer.call(@name, {:rename, old_name, new_name})
298300
end
299301

302+
def del(list_names) do
303+
GenServer.call(@name, {:del, list_names})
304+
end
305+
306+
def exists?(key) do
307+
GenServer.call(@name, {:exists, key})
308+
end
309+
310+
def renamenx(old_name, new_name) do
311+
GenServer.call(@name, {:renamenx, old_name, new_name})
312+
end
313+
300314

301315
# Example implementation adjustments for ETS
302316

@@ -312,12 +326,10 @@ defmodule Remixdb.List do
312326
end
313327

314328
def handle_call({:llen, list_name}, _from, table) do
315-
size =
316-
:ets.lookup(table, list_name)
317-
|> case do
318-
[] -> 0
319-
[{_, list}] -> length(list)
320-
end
329+
size = case :ets.lookup(table, list_name) do
330+
[] -> 0
331+
[{_, list}] -> length(list)
332+
end
321333

322334
{:reply, size, table}
323335
end
@@ -405,20 +417,6 @@ defmodule Remixdb.List do
405417
{:noreply, table}
406418
end
407419

408-
def handle_call({:rename, old_name, new_name}, _from, table) do
409-
case :ets.lookup(table, old_name) do
410-
[] ->
411-
# Old list does not exist
412-
{:reply, false, table}
413-
414-
[{^old_name, list}] ->
415-
# Insert under the new name and delete the old one
416-
true = :ets.insert(table, {new_name, list})
417-
true = :ets.delete(table, old_name)
418-
{:reply, true, table}
419-
end
420-
end
421-
422420
def handle_call({:rpop, list_name}, _from, table) do
423421
case :ets.lookup(table, list_name) do
424422
[] ->
@@ -504,6 +502,25 @@ defmodule Remixdb.List do
504502
end
505503
end
506504

505+
def handle_call({:renamenx, old_name, new_name}, _from, table) do
506+
{:reply, ETSHelpers.renamenx(table, old_name, new_name), table}
507+
end
508+
509+
def handle_call({:rename, old_name, new_name}, _from, table) do
510+
{:reply, ETSHelpers.rename(table, old_name, new_name), table}
511+
end
512+
513+
def handle_call({:exists, key}, _from, table) do
514+
{:reply, ETSHelpers.exists?(table, key), table}
515+
end
516+
517+
# del
518+
def handle_call({:del, keys}, _from, table) do
519+
:ok = ETSHelpers.del_keys(table, keys)
520+
{:reply, "OK", table}
521+
end
522+
523+
507524
# Implement other operations similarly, using ETS functions for state management
508525

509526
# Helper function adjustments for ETS...
@@ -528,4 +545,5 @@ defmodule Remixdb.List do
528545
Enum.slice(list, norm_start, norm_stop - norm_start + 1)
529546
end
530547
end
548+
531549
end

lib/datastructures/string.ex

Lines changed: 19 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
alias Remixdb.Counter, as: Counter
2+
alias Remixdb.ETSHelpers, as: ETSHelpers
23

34
defmodule Remixdb.String do
45
@moduledoc """
@@ -301,6 +302,11 @@ defmodule Remixdb.String do
301302
GenServer.call(@name, {:incrby, key, val * -1})
302303
end
303304

305+
def del(list_names) do
306+
GenServer.call(@name, {:del, list_names})
307+
end
308+
309+
304310
def handle_call(:flushall, _from, table) do
305311
:ets.delete(table)
306312
new_table = :ets.new(@name, [:named_table, :set, :public])
@@ -313,7 +319,7 @@ defmodule Remixdb.String do
313319
end
314320

315321
def handle_call({:append, key, val}, _from, table) do
316-
old_val = get_val(table, key)
322+
old_val = ETSHelpers.get_val(table, key)
317323

318324
new_val =
319325
case old_val do
@@ -327,82 +333,46 @@ defmodule Remixdb.String do
327333
end
328334

329335
def handle_call({:incrby, key, incrby}, _from, table) do
330-
new_val = Counter.incrby(get_val(table, key), incrby)
336+
new_val = Counter.incrby(ETSHelpers.get_val(table, key), incrby)
331337
set_val(table, key, new_val)
332338
{:reply, new_val, table}
333339
end
334340

335341
def handle_call({:get, key}, _from, table) do
336-
val = get_val(table, key)
342+
val = ETSHelpers.get_val(table, key)
337343
{:reply, val, table}
338344
end
339345

340346
def handle_call({:getset, key, val}, _from, table) do
341-
old_val = get_val(table, key)
347+
old_val = ETSHelpers.get_val(table, key)
342348
set_val(table, key, val)
343349
{:reply, old_val, table}
344350
end
345351

346352
def handle_call({:set, key, val}, _from, table) do
347-
set_val(table, key, val)
353+
:ok = set_val(table, key, val)
348354
{:reply, :ok, table}
349355
end
350356

351357
def handle_call({:renamenx, old_name, new_name}, _from, table) do
352-
case get_val(table, old_name) do
353-
nil ->
354-
response = {:error, "ERR no such key"}
355-
{:reply, response, table}
356-
_ ->
357-
case get_val(table, new_name) do
358-
nil ->
359-
private_rename(old_name, new_name, table)
360-
{:reply, "1", table}
361-
_ ->
362-
{:reply, "0", table}
363-
end
364-
end
358+
{:reply, ETSHelpers.renamenx(table, old_name, new_name), table}
365359
end
366360

367361
def handle_call({:rename, old_name, new_name}, _from, table) do
368-
result = private_rename(old_name, new_name, table)
369-
{:reply, result, table}
362+
{:reply, ETSHelpers.rename(table, old_name, new_name), table}
370363
end
371364

372365
def handle_call({:exists, key}, _from, table) do
373-
case get_val(table, key) do
374-
nil -> false
375-
_ -> true
376-
end
377-
end
378-
379-
defp private_rename(old_name, new_name, table) do
380-
old_value =
381-
case :ets.lookup(table, old_name) do
382-
[{^old_name, value}] -> value
383-
[] -> nil
384-
end
385-
386-
case old_value do
387-
nil ->
388-
false
389-
390-
_ ->
391-
true = :ets.insert(table, {new_name, old_value})
392-
true = :ets.delete(table, old_name)
393-
true
394-
end
366+
{:reply, ETSHelpers.exists?(table, key), table}
395367
end
396-
397368

398-
defp get_val(table, key) do
399-
case :ets.lookup(table, key) do
400-
[{^key, value}] -> value
401-
[] -> nil
402-
end
369+
def handle_call({:del, keys}, _from, table) do
370+
:ok = ETSHelpers.del_keys(table, keys)
371+
{:reply, "OK", table}
403372
end
404373

405374
defp set_val(table, key, val) do
406-
:ets.insert(table, {key, val})
375+
:ok = ETSHelpers.put_val(table, key, val)
376+
:ok
407377
end
408378
end

lib/parsers/redis_parser.ex

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,7 @@ defmodule Remixdb.Parsers.RedisParser do
129129
"HEXISTS" -> {:hexists, args}
130130
"HSTRLEN" -> {:hstrlen, args}
131131
"HINCRBY" -> {:hincrby, args}
132+
"DEL" -> {:del, args}
132133
end
133134
end
134135
end

0 commit comments

Comments
 (0)