From 325d032564e7be9b7f6bdd27f955de1b41f24343 Mon Sep 17 00:00:00 2001 From: Jake Cattrall Date: Thu, 25 Sep 2025 16:38:10 +0100 Subject: [PATCH 1/4] a start --- .../debugger/gedis_queue_debugger_panel.gd | 54 +++++++++++++++ .../gedis_queue_debugger_panel.gd.uid | 1 + .../debugger/gedis_queue_debugger_panel.tscn | 43 ++++++++++++ addons/GedisQueue/plugin.gd | 65 +++++++++++++++++++ 4 files changed, 163 insertions(+) create mode 100644 addons/GedisQueue/debugger/gedis_queue_debugger_panel.gd create mode 100644 addons/GedisQueue/debugger/gedis_queue_debugger_panel.gd.uid create mode 100644 addons/GedisQueue/debugger/gedis_queue_debugger_panel.tscn diff --git a/addons/GedisQueue/debugger/gedis_queue_debugger_panel.gd b/addons/GedisQueue/debugger/gedis_queue_debugger_panel.gd new file mode 100644 index 0000000..c78df07 --- /dev/null +++ b/addons/GedisQueue/debugger/gedis_queue_debugger_panel.gd @@ -0,0 +1,54 @@ +@tool +extends VBoxContainer + +# UI references will be set from the scene +@export var queues_tree: Tree +@export var jobs_tree: Tree +@export var job_details_text: TextEdit +@export var refresh_button: Button + +var plugin + +func _ready() -> void: + if refresh_button: + refresh_button.pressed.connect(_on_refresh_pressed) + +func set_plugin(p) -> void: + plugin = p + +func _on_refresh_pressed() -> void: + if plugin: + # This assumes the main dashboard has an instance selector + var selected_id = get_parent().get_parent().instance_selector.get_item_id(get_parent().get_parent().instance_selector.selected) + var session_id = plugin.get_current_session_id() + if session_id != -1: + var session = plugin.get_session(session_id) + if session and session.is_active(): + session.send_message("gedis_queue:request_instance_data", [selected_id, "queues"]) + +func update_queues(data: Dictionary) -> void: + queues_tree.clear() + var root = queues_tree.create_item() + queues_tree.hide_root = true + + for queue_name in data: + var queue_item = queues_tree.create_item(root) + queue_item.set_text(0, queue_name) + queue_item.set_text(1, str(data[queue_name].size())) + +func update_jobs(jobs: Array) -> void: + jobs_tree.clear() + var root = jobs_tree.create_item() + jobs_tree.hide_root = true + + for job in jobs: + var job_item = jobs_tree.create_item(root) + job_item.set_text(0, job.id) + job_item.set_text(1, job.type) + job_item.set_text(2, job.status) + job_item.set_meta("details", job.details) + +func _on_jobs_tree_item_selected() -> void: + var selected_item = jobs_tree.get_selected() + if selected_item: + job_details_text.text = selected_item.get_meta("details") diff --git a/addons/GedisQueue/debugger/gedis_queue_debugger_panel.gd.uid b/addons/GedisQueue/debugger/gedis_queue_debugger_panel.gd.uid new file mode 100644 index 0000000..cb05b85 --- /dev/null +++ b/addons/GedisQueue/debugger/gedis_queue_debugger_panel.gd.uid @@ -0,0 +1 @@ +uid://c5fv5yw1cok24 diff --git a/addons/GedisQueue/debugger/gedis_queue_debugger_panel.tscn b/addons/GedisQueue/debugger/gedis_queue_debugger_panel.tscn new file mode 100644 index 0000000..3ad5145 --- /dev/null +++ b/addons/GedisQueue/debugger/gedis_queue_debugger_panel.tscn @@ -0,0 +1,43 @@ +[gd_scene load_steps=2 format=3 uid="uid://b5h5h5h5h5h5"] + +[ext_resource type="Script" uid="uid://c5fv5yw1cok24" path="res://addons/GedisQueue/debugger/gedis_queue_debugger_panel.gd" id="1_abcde"] + +[node name="GedisQueueDebuggerPanel" type="VBoxContainer" node_paths=PackedStringArray("queues_tree", "jobs_tree", "job_details_text", "refresh_button")] +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +script = ExtResource("1_abcde") +queues_tree = NodePath("HSplitContainer/QueuesTree") +jobs_tree = NodePath("HSplitContainer/JobsVBox/JobsTree") +job_details_text = NodePath("HSplitContainer/JobsVBox/JobDetailsText") +refresh_button = NodePath("RefreshButton") + +[node name="RefreshButton" type="Button" parent="."] +layout_mode = 2 +text = "Refresh Queues" + +[node name="HSplitContainer" type="HSplitContainer" parent="."] +layout_mode = 2 +size_flags_vertical = 3 + +[node name="QueuesTree" type="Tree" parent="HSplitContainer"] +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_stretch_ratio = 0.3 +columns = 2 +column_titles_visible = true + +[node name="JobsVBox" type="VBoxContainer" parent="HSplitContainer"] +layout_mode = 2 +size_flags_horizontal = 3 + +[node name="JobsTree" type="Tree" parent="HSplitContainer/JobsVBox"] +layout_mode = 2 +size_flags_vertical = 3 +columns = 3 +column_titles_visible = true + +[node name="JobDetailsText" type="TextEdit" parent="HSplitContainer/JobsVBox"] +layout_mode = 2 +size_flags_vertical = 3 +editable = false diff --git a/addons/GedisQueue/plugin.gd b/addons/GedisQueue/plugin.gd index 5af87f6..30c7526 100644 --- a/addons/GedisQueue/plugin.gd +++ b/addons/GedisQueue/plugin.gd @@ -1,2 +1,67 @@ @tool extends EditorPlugin + +const GedisQueueDebuggerPanel = preload("res://addons/GedisQueue/debugger/gedis_queue_debugger_panel.tscn") + +var queue_debugger_plugin + +func _enter_tree(): + queue_debugger_plugin = GedisQueueDebuggerPlugin.new() + add_debugger_plugin(queue_debugger_plugin) + + var timer = Timer.new() + timer.wait_time = 1 + timer.one_shot = false # Check periodically + timer.timeout.connect(_on_timer_timeout) + add_child(timer) + timer.start() + +func _on_timer_timeout(): + var editor_node = EditorInterface.get_base_control() + var dashboard = editor_node.find_child("Gedis", true, false) + + if dashboard and not dashboard.find_child("Queue", true, false): + var debugger = dashboard.plugin + if debugger: + var tab_container = dashboard.find_child("TabContainer", true, false) + if tab_container: + var queue_panel = GedisQueueDebuggerPanel.instantiate() + queue_panel.name = "Queue" + tab_container.add_child(queue_panel) + queue_panel.set_plugin(debugger) + + var session_id = debugger.get_current_session_id() + if session_id != -1: + queue_debugger_plugin.set_queue_panel(session_id, queue_panel) + + +func _exit_tree(): + if queue_debugger_plugin: + remove_debugger_plugin(queue_debugger_plugin) + queue_debugger_plugin = null + +class GedisQueueDebuggerPlugin extends EditorDebuggerPlugin: + var queue_panels = {} + + func set_queue_panel(session_id, panel): + queue_panels[session_id] = panel + + func _has_capture(capture): + return capture == "gedis_queue" + + func _capture(message, data, session_id): + var parts = message.split(":") + var kind = parts[1] if parts.size() > 1 else "" + + if session_id in queue_panels: + var queue_panel = queue_panels[session_id] + match kind: + "queue_data": + if queue_panel: + queue_panel.update_queues(data[0]) + return true + "job_data": + if queue_panel: + queue_panel.update_jobs(data[0]) + return true + return false From 40367b50de822580598823e2b2200247138b0f3c Mon Sep 17 00:00:00 2001 From: Jake Cattrall <623463+krazyjakee@users.noreply.github.com> Date: Thu, 25 Sep 2025 21:33:59 +0100 Subject: [PATCH 2/4] data is showing on the queue tab --- .../debugger/gedis_queue_debugger_panel.gd | 2 +- addons/GedisQueue/plugin.gd | 38 ++++++++++++------- project.godot | 4 +- 3 files changed, 28 insertions(+), 16 deletions(-) diff --git a/addons/GedisQueue/debugger/gedis_queue_debugger_panel.gd b/addons/GedisQueue/debugger/gedis_queue_debugger_panel.gd index c78df07..9b24ff1 100644 --- a/addons/GedisQueue/debugger/gedis_queue_debugger_panel.gd +++ b/addons/GedisQueue/debugger/gedis_queue_debugger_panel.gd @@ -24,7 +24,7 @@ func _on_refresh_pressed() -> void: if session_id != -1: var session = plugin.get_session(session_id) if session and session.is_active(): - session.send_message("gedis_queue:request_instance_data", [selected_id, "queues"]) + session.send_message("gedis:request_instance_data", [selected_id]) func update_queues(data: Dictionary) -> void: queues_tree.clear() diff --git a/addons/GedisQueue/plugin.gd b/addons/GedisQueue/plugin.gd index 30c7526..25e55a6 100644 --- a/addons/GedisQueue/plugin.gd +++ b/addons/GedisQueue/plugin.gd @@ -11,7 +11,6 @@ func _enter_tree(): var timer = Timer.new() timer.wait_time = 1 - timer.one_shot = false # Check periodically timer.timeout.connect(_on_timer_timeout) add_child(timer) timer.start() @@ -20,15 +19,17 @@ func _on_timer_timeout(): var editor_node = EditorInterface.get_base_control() var dashboard = editor_node.find_child("Gedis", true, false) - if dashboard and not dashboard.find_child("Queue", true, false): + if dashboard: var debugger = dashboard.plugin if debugger: var tab_container = dashboard.find_child("TabContainer", true, false) if tab_container: - var queue_panel = GedisQueueDebuggerPanel.instantiate() - queue_panel.name = "Queue" - tab_container.add_child(queue_panel) - queue_panel.set_plugin(debugger) + var queue_panel = dashboard.find_child("Queue", true, false) + if !queue_panel: + queue_panel = GedisQueueDebuggerPanel.instantiate() + queue_panel.name = "Queue" + tab_container.add_child(queue_panel) + queue_panel.set_plugin(debugger) var session_id = debugger.get_current_session_id() if session_id != -1: @@ -47,7 +48,7 @@ class GedisQueueDebuggerPlugin extends EditorDebuggerPlugin: queue_panels[session_id] = panel func _has_capture(capture): - return capture == "gedis_queue" + return capture == "gedis" func _capture(message, data, session_id): var parts = message.split(":") @@ -56,12 +57,23 @@ class GedisQueueDebuggerPlugin extends EditorDebuggerPlugin: if session_id in queue_panels: var queue_panel = queue_panels[session_id] match kind: - "queue_data": + "snapshot_data": if queue_panel: - queue_panel.update_queues(data[0]) - return true - "job_data": - if queue_panel: - queue_panel.update_jobs(data[0]) + var snapshot = data[0] + var queues = {} + var jobs = [] + + for key in snapshot: + var value = snapshot[key] + if "job" in key: + jobs.append(value["value"]) + else: + var queue_name = key.replace("gedis_queue:", "").replace(":waiting", "").replace(":active", "") + if not queue_name in queues: + queues[queue_name] = [] + queues[queue_name].append_array(value["value"]) + + queue_panel.update_queues(queues) + queue_panel.update_jobs(jobs) return true return false diff --git a/project.godot b/project.godot index b9fa840..8ee90d3 100644 --- a/project.godot +++ b/project.godot @@ -13,10 +13,10 @@ config_version=5 config/name="GedisQueue" config/description="A BullMQ-like queue system for Godot, backed by Gedis." config/version="0.1.8" +run/main_scene="res://game/game.tscn" config/features=PackedStringArray("4.5") config/icon="uid://48jxifffcg1y" -run/main_scene="res://game/game.tscn" [editor_plugins] -enabled=PackedStringArray("res://addons/GedisQueue/plugin.cfg", "res://addons/gut/plugin.cfg") +enabled=PackedStringArray("res://addons/Gedis/plugin.cfg", "res://addons/GedisQueue/plugin.cfg", "res://addons/gut/plugin.cfg") From 648f3f0ee317521ff7a0fcb28c2fb41f7cd29e28 Mon Sep 17 00:00:00 2001 From: Jake Cattrall <623463+krazyjakee@users.noreply.github.com> Date: Thu, 25 Sep 2025 22:15:54 +0100 Subject: [PATCH 3/4] more info --- .../debugger/gedis_queue_debugger_panel.gd | 25 ++++++++++++++----- .../debugger/gedis_queue_debugger_panel.tscn | 5 ++++ addons/GedisQueue/plugin.gd | 14 ++++++++--- game/game.gd | 4 +++ game/game.tscn | 12 +++++++-- 5 files changed, 49 insertions(+), 11 deletions(-) diff --git a/addons/GedisQueue/debugger/gedis_queue_debugger_panel.gd b/addons/GedisQueue/debugger/gedis_queue_debugger_panel.gd index 9b24ff1..3e1795c 100644 --- a/addons/GedisQueue/debugger/gedis_queue_debugger_panel.gd +++ b/addons/GedisQueue/debugger/gedis_queue_debugger_panel.gd @@ -13,6 +13,17 @@ func _ready() -> void: if refresh_button: refresh_button.pressed.connect(_on_refresh_pressed) + # Set column titles for the queues tree + queues_tree.set_column_titles_visible(true) + queues_tree.set_column_title(0, "Queue") + queues_tree.set_column_title(1, "Jobs") + + # Set column titles for the jobs tree + jobs_tree.set_column_titles_visible(true) + jobs_tree.set_column_title(0, "ID") + jobs_tree.set_column_title(1, "Queue") + jobs_tree.set_column_title(2, "Status") + func set_plugin(p) -> void: plugin = p @@ -22,9 +33,7 @@ func _on_refresh_pressed() -> void: var selected_id = get_parent().get_parent().instance_selector.get_item_id(get_parent().get_parent().instance_selector.selected) var session_id = plugin.get_current_session_id() if session_id != -1: - var session = plugin.get_session(session_id) - if session and session.is_active(): - session.send_message("gedis:request_instance_data", [selected_id]) + plugin._fetch_keys_for_selected_instance(session_id) func update_queues(data: Dictionary) -> void: queues_tree.clear() @@ -44,11 +53,15 @@ func update_jobs(jobs: Array) -> void: for job in jobs: var job_item = jobs_tree.create_item(root) job_item.set_text(0, job.id) - job_item.set_text(1, job.type) + job_item.set_text(1, job.queue_name) job_item.set_text(2, job.status) - job_item.set_meta("details", job.details) + job_item.set_meta("data", job.data) func _on_jobs_tree_item_selected() -> void: var selected_item = jobs_tree.get_selected() if selected_item: - job_details_text.text = selected_item.get_meta("details") + job_details_text.text = selected_item.get_meta("data") + +func _on_queues_tree_item_selected() -> void: + # TODO: should filter out jobs not the selected queue + pass diff --git a/addons/GedisQueue/debugger/gedis_queue_debugger_panel.tscn b/addons/GedisQueue/debugger/gedis_queue_debugger_panel.tscn index 3ad5145..7c2b9c7 100644 --- a/addons/GedisQueue/debugger/gedis_queue_debugger_panel.tscn +++ b/addons/GedisQueue/debugger/gedis_queue_debugger_panel.tscn @@ -26,6 +26,7 @@ size_flags_horizontal = 3 size_flags_stretch_ratio = 0.3 columns = 2 column_titles_visible = true +select_mode = 1 [node name="JobsVBox" type="VBoxContainer" parent="HSplitContainer"] layout_mode = 2 @@ -36,8 +37,12 @@ layout_mode = 2 size_flags_vertical = 3 columns = 3 column_titles_visible = true +select_mode = 1 [node name="JobDetailsText" type="TextEdit" parent="HSplitContainer/JobsVBox"] layout_mode = 2 size_flags_vertical = 3 editable = false + +[connection signal="item_selected" from="HSplitContainer/QueuesTree" to="." method="_on_queues_tree_item_selected"] +[connection signal="item_selected" from="HSplitContainer/JobsVBox/JobsTree" to="." method="_on_jobs_tree_item_selected"] diff --git a/addons/GedisQueue/plugin.gd b/addons/GedisQueue/plugin.gd index 25e55a6..8f3c3e6 100644 --- a/addons/GedisQueue/plugin.gd +++ b/addons/GedisQueue/plugin.gd @@ -4,6 +4,8 @@ extends EditorPlugin const GedisQueueDebuggerPanel = preload("res://addons/GedisQueue/debugger/gedis_queue_debugger_panel.tscn") var queue_debugger_plugin +var queue_panel +var dashboard func _enter_tree(): queue_debugger_plugin = GedisQueueDebuggerPlugin.new() @@ -17,14 +19,14 @@ func _enter_tree(): func _on_timer_timeout(): var editor_node = EditorInterface.get_base_control() - var dashboard = editor_node.find_child("Gedis", true, false) + dashboard = editor_node.find_child("Gedis", true, false) if dashboard: var debugger = dashboard.plugin if debugger: var tab_container = dashboard.find_child("TabContainer", true, false) if tab_container: - var queue_panel = dashboard.find_child("Queue", true, false) + queue_panel = dashboard.find_child("Queue", true, false) if !queue_panel: queue_panel = GedisQueueDebuggerPanel.instantiate() queue_panel.name = "Queue" @@ -40,6 +42,8 @@ func _exit_tree(): if queue_debugger_plugin: remove_debugger_plugin(queue_debugger_plugin) queue_debugger_plugin = null + if queue_panel: + queue_panel.queue_free() class GedisQueueDebuggerPlugin extends EditorDebuggerPlugin: var queue_panels = {} @@ -66,7 +70,11 @@ class GedisQueueDebuggerPlugin extends EditorDebuggerPlugin: for key in snapshot: var value = snapshot[key] if "job" in key: - jobs.append(value["value"]) + var job_data = value["value"] + var key_parts = key.split(":") + if key_parts.size() > 2: + job_data["queue_name"] = key_parts[1] + jobs.append(job_data) else: var queue_name = key.replace("gedis_queue:", "").replace(":waiting", "").replace(":active", "") if not queue_name in queues: diff --git a/game/game.gd b/game/game.gd index 25228a2..6e19f5f 100644 --- a/game/game.gd +++ b/game/game.gd @@ -34,6 +34,10 @@ func _on_add_job_button_pressed(): jobs_container.add_child(progress_bar) job_nodes[job.id] = progress_bar +func _on_add_100_job_button_pressed() -> void: + for i in range(100): + _on_add_job_button_pressed() + func _on_job_completed(job: GedisJob, return_value): if job_nodes.has(job.id): var progress_bar = job_nodes[job.id] diff --git a/game/game.tscn b/game/game.tscn index 24eda9f..cbe8e36 100644 --- a/game/game.tscn +++ b/game/game.tscn @@ -34,10 +34,17 @@ offset_bottom = 20.0 grow_horizontal = 2 grow_vertical = 2 -[node name="AddJobButton" type="Button" parent="VBoxContainer"] +[node name="HBoxContainer2" type="HBoxContainer" parent="VBoxContainer"] +layout_mode = 2 + +[node name="AddJobButton" type="Button" parent="VBoxContainer/HBoxContainer2"] layout_mode = 2 text = "Add Job" +[node name="Add100JobButton" type="Button" parent="VBoxContainer/HBoxContainer2"] +layout_mode = 2 +text = "Add 100 Jobs" + [node name="HBoxContainer" type="HBoxContainer" parent="VBoxContainer"] layout_mode = 2 alignment = 1 @@ -56,6 +63,7 @@ allow_greater = true layout_mode = 2 text = "Clear Queue" -[connection signal="pressed" from="VBoxContainer/AddJobButton" to="." method="_on_add_job_button_pressed"] +[connection signal="pressed" from="VBoxContainer/HBoxContainer2/AddJobButton" to="." method="_on_add_job_button_pressed"] +[connection signal="pressed" from="VBoxContainer/HBoxContainer2/Add100JobButton" to="." method="_on_add_100_job_button_pressed"] [connection signal="value_changed" from="VBoxContainer/HBoxContainer/BatchSizeSpinBox" to="." method="_on_batch_size_spin_box_value_changed"] [connection signal="pressed" from="VBoxContainer/ClearQueueButton" to="." method="_on_clear_queue_button_pressed"] From 49c66228822d5a1547ba85967a944698ea82093b Mon Sep 17 00:00:00 2001 From: Jake Cattrall Date: Mon, 6 Oct 2025 16:10:01 +0100 Subject: [PATCH 4/4] update gedis --- addons/Gedis/core/gedis_core.gd | 8 ++++++-- addons/Gedis/core/gedis_lists.gd | 17 +++++++++++------ addons/Gedis/core/gedis_sets.gd | 5 +++++ addons/Gedis/core/gedis_sorted_sets.gd | 12 ++++++++++++ addons/Gedis/gedis.gd | 18 +++++++++++++++++- addons/Gedis/plugin.cfg | 2 +- addons/GedisQueue/plugin.cfg | 2 +- 7 files changed, 53 insertions(+), 11 deletions(-) diff --git a/addons/Gedis/core/gedis_core.gd b/addons/Gedis/core/gedis_core.gd index c38783e..1dbf591 100644 --- a/addons/Gedis/core/gedis_core.gd +++ b/addons/Gedis/core/gedis_core.gd @@ -6,7 +6,7 @@ var _hashes: Dictionary = {} var _lists: Dictionary = {} var _sets: Dictionary = {} var _sorted_sets: Dictionary = {} -var _expiry: Dictionary[String, float] = {} +var _expiry: Dictionary = {} # Pub/Sub registries var _subscribers: Dictionary[String, Array] = {} @@ -205,4 +205,8 @@ func ks(key: String) -> String: return "gedis:keyspace:" + key func rks(key: String) -> String: - return key.substr("gedis:keyspace:".length()) + var prefix = "gedis:keyspace:" + if key.begins_with(prefix): + return key.substr(prefix.length()) + else: + return key diff --git a/addons/Gedis/core/gedis_lists.gd b/addons/Gedis/core/gedis_lists.gd index 816df10..e336b47 100644 --- a/addons/Gedis/core/gedis_lists.gd +++ b/addons/Gedis/core/gedis_lists.gd @@ -36,7 +36,7 @@ func lpop(key: String): return null if not _gedis._core._lists.has(key): return null - var a: Array = _gedis._core._lists[key] + var a: Array = _gedis._core._lists[key].duplicate() if a.is_empty(): return null var v = a.pop_front() @@ -53,7 +53,7 @@ func rpop(key: String): return null if not _gedis._core._lists.has(key): return null - var a: Array = _gedis._core._lists[key] + var a: Array = _gedis._core._lists[key].duplicate() if a.is_empty(): return null var v = a.pop_back() @@ -71,10 +71,15 @@ func llen(key: String) -> int: var a: Array = _gedis._core._lists.get(key, []) return a.size() +func lexists(key: String) -> bool: + if _gedis._expiry._is_expired(key): + return false + return _gedis._core._lists.has(key) + func lget(key: String) -> Array: if _gedis._expiry._is_expired(key): return [] - return _gedis._core._lists.get(key, []) + return _gedis._core._lists.get(key, []).duplicate() func lrange(key: String, start: int, stop: int) -> Array: if _gedis._expiry._is_expired(key): @@ -114,7 +119,7 @@ func lset(key: String, index: int, value) -> bool: return false if not _gedis._core._lists.has(key): return false - var a: Array = _gedis._core._lists[key] + var a: Array = _gedis._core._lists[key].duplicate() var n = a.size() if index < 0: index = n + index @@ -227,7 +232,7 @@ func ltrim(key: String, start: int, stop: int) -> bool: if not _gedis._core._lists.has(key): return false - var a: Array = _gedis._core._lists[key] + var a: Array = _gedis._core._lists[key].duplicate() var n = a.size() if start < 0: @@ -264,7 +269,7 @@ func linsert(key: String, position: String, pivot: Variant, value: Variant) -> i if not _gedis._core._lists.has(key): return 0 - var a: Array = _gedis._core._lists[key] + var a: Array = _gedis._core._lists[key].duplicate() var n = a.size() var index = -1 diff --git a/addons/Gedis/core/gedis_sets.gd b/addons/Gedis/core/gedis_sets.gd index f2811e0..060ce6e 100644 --- a/addons/Gedis/core/gedis_sets.gd +++ b/addons/Gedis/core/gedis_sets.gd @@ -50,6 +50,11 @@ func scard(key: String) -> int: return 0 return _gedis._core._sets.get(key, {}).size() +func sexists(key: String) -> bool: + if _gedis._expiry._is_expired(key): + return false + return _gedis._core._sets.has(key) + func spop(key: String): if _gedis._expiry._is_expired(key): return null diff --git a/addons/Gedis/core/gedis_sorted_sets.gd b/addons/Gedis/core/gedis_sorted_sets.gd index 197579b..00addc1 100644 --- a/addons/Gedis/core/gedis_sorted_sets.gd +++ b/addons/Gedis/core/gedis_sorted_sets.gd @@ -83,6 +83,18 @@ func remove(key: String, member: String) -> int: return 1 return 0 +func zexists(key: String) -> bool: + if _gedis._expiry._is_expired(key): + return false + return _gedis._core._sorted_sets.has(key) + +func zcard(key: String) -> int: + if _gedis._expiry._is_expired(key): + return 0 + if not _gedis._core._sorted_sets.has(key): + return 0 + return _gedis._core._sorted_sets[key].sorted_set.size() + # Returns a range of members from the sorted set, ordered by score. # # @param start: The starting index of the range. diff --git a/addons/Gedis/gedis.gd b/addons/Gedis/gedis.gd index 23df6d1..e0dd7b0 100644 --- a/addons/Gedis/gedis.gd +++ b/addons/Gedis/gedis.gd @@ -162,7 +162,7 @@ func dbsize() -> int: func ks(key: String) -> String: return _core.ks(key) -## Removes the keyspace prefix of a key +## Removes the keyspace prefix from a key if present, otherwise returns the key unchanged func rks(key: String) -> String: return _core.rks(key) @@ -236,6 +236,10 @@ func rpop(key: String): func llen(key: String) -> int: return _lists.llen(key) +## Checks if a list exists. +func lexists(key: String) -> bool: + return _lists.lexists(key) + ## Gets all elements from a list. func lget(key: String) -> Array: return _lists.lget(key) @@ -289,6 +293,10 @@ func sismember(key: String, member) -> bool: func scard(key: String) -> int: return _sets.scard(key) +## Checks if a set exists. +func sexists(key: String) -> bool: + return _sets.sexists(key) + ## Removes and returns a random member from a set. func spop(key: String): return _sets.spop(key) @@ -330,6 +338,14 @@ func srandmember(key: String, count: int = 1) -> Variant: func zadd(key: String, member: String, score: int): return _sorted_sets.add(key, member, score) +## Checks if a sorted set exists. +func zexists(key: String) -> bool: + return _sorted_sets.zexists(key) + +## Gets the number of members in a sorted set. +func zcard(key: String) -> int: + return _sorted_sets.zcard(key) + ## Removes a member from a sorted set. func zrem(key: String, member: String): return _sorted_sets.remove(key, member) diff --git a/addons/Gedis/plugin.cfg b/addons/Gedis/plugin.cfg index 7ee6848..ea4a265 100644 --- a/addons/Gedis/plugin.cfg +++ b/addons/Gedis/plugin.cfg @@ -2,6 +2,6 @@ name="Gedis" description="Redis-like in-memory key-value store for Godot" author="NodotProject" -version="0.1.8" +version="0.1.9" script="plugin.gd" icon="icon.png" diff --git a/addons/GedisQueue/plugin.cfg b/addons/GedisQueue/plugin.cfg index 0baefe7..8968b1b 100644 --- a/addons/GedisQueue/plugin.cfg +++ b/addons/GedisQueue/plugin.cfg @@ -3,5 +3,5 @@ name="GedisQueue" description="A BullMQ-like queue system for Godot, backed by Gedis." author="NodotProject" -version="0.1.8" +version="0.1.9" script="plugin.gd" \ No newline at end of file