forked from joey/godottest
132 lines
3.9 KiB
GDScript
132 lines
3.9 KiB
GDScript
extends RefCounted
|
|
class_name GedisHashes
|
|
|
|
var _gedis
|
|
|
|
func _init(gedis):
|
|
_gedis = gedis
|
|
|
|
# ------
|
|
# Hashes
|
|
# ------
|
|
func hset(key: String, field: String, value) -> int:
|
|
_gedis._core._touch_type(key, _gedis._core._hashes)
|
|
var d: Dictionary = _gedis._core._hashes.get(key, {})
|
|
var existed := int(d.has(field))
|
|
d[field] = value
|
|
_gedis._core._hashes[key] = d
|
|
_gedis.publish("gedis:keyspace:" + key, "set")
|
|
return 1 - existed
|
|
|
|
func hget(key: String, field: String, default_value: Variant = null):
|
|
if _gedis._expiry._is_expired(key):
|
|
return default_value
|
|
var d: Dictionary = _gedis._core._hashes.get(key, {})
|
|
return d.get(field, default_value)
|
|
|
|
# Gets the values of multiple fields in a hash.
|
|
# ---
|
|
# @param key: The key of the hash.
|
|
# @param fields: An array of fields to get the values of.
|
|
# @return: An array of values for the given fields. If a field does not exist, the corresponding value in the array will be null.
|
|
func hmget(key: String, fields: Array) -> Array:
|
|
if _gedis._expiry._is_expired(key):
|
|
return fields.map(func(_field): return null)
|
|
var d: Dictionary = _gedis._core._hashes.get(key, {})
|
|
var result: Array = []
|
|
for field in fields:
|
|
result.append(d.get(field, null))
|
|
return result
|
|
|
|
# Sets multiple fields and their values in a hash.
|
|
# ---
|
|
# @param key: The key of the hash.
|
|
# @param field_value_pairs: A dictionary of field-value pairs to set.
|
|
func hmset(key: String, field_value_pairs: Dictionary) -> void:
|
|
_gedis._core._touch_type(key, _gedis._core._hashes)
|
|
var d: Dictionary = _gedis._core._hashes.get(key, {})
|
|
for field in field_value_pairs:
|
|
d[field] = field_value_pairs[field]
|
|
_gedis._core._hashes[key] = d
|
|
_gedis.publish("gedis:keyspace:" + key, "set")
|
|
|
|
func hincrby(key: String, field: String, amount: int) -> Variant:
|
|
_gedis._core._touch_type(key, _gedis._core._hashes)
|
|
var d: Dictionary = _gedis._core._hashes.get(key, {})
|
|
var value = d.get(field, 0)
|
|
if not typeof(value) in [TYPE_INT, TYPE_FLOAT]:
|
|
push_error("WRONGTYPE Operation against a key holding the wrong kind of value")
|
|
return null
|
|
value += amount
|
|
d[field] = value
|
|
_gedis._core._hashes[key] = d
|
|
_gedis.publish("gedis:keyspace:" + key, "set")
|
|
return value
|
|
|
|
func hincrbyfloat(key: String, field: String, amount: float) -> Variant:
|
|
_gedis._core._touch_type(key, _gedis._core._hashes)
|
|
var d: Dictionary = _gedis._core._hashes.get(key, {})
|
|
var value = d.get(field, 0.0)
|
|
if not typeof(value) in [TYPE_INT, TYPE_FLOAT]:
|
|
push_error("WRONGTYPE Operation against a key holding the wrong kind of value")
|
|
return null
|
|
value += amount
|
|
d[field] = value
|
|
_gedis._core._hashes[key] = d
|
|
_gedis.publish("gedis:keyspace:" + key, "set")
|
|
return value
|
|
|
|
func hdel(key: String, fields) -> int:
|
|
# Accept single field (String) or Array of fields
|
|
if _gedis._expiry._is_expired(key):
|
|
return 0
|
|
if not _gedis._core._hashes.has(key):
|
|
return 0
|
|
var d: Dictionary = _gedis._core._hashes[key]
|
|
var removed = 0
|
|
if typeof(fields) == TYPE_ARRAY:
|
|
for f in fields:
|
|
if d.has(str(f)):
|
|
d.erase(str(f))
|
|
removed += 1
|
|
else:
|
|
var f = str(fields)
|
|
if d.has(f):
|
|
d.erase(f)
|
|
removed = 1
|
|
if d.is_empty():
|
|
_gedis._core._hashes.erase(key)
|
|
_gedis.publish("gedis:keyspace:" + key, "del")
|
|
else:
|
|
_gedis._core._hashes[key] = d
|
|
return removed
|
|
|
|
func hgetall(key: String) -> Dictionary:
|
|
if _gedis._expiry._is_expired(key):
|
|
return {}
|
|
return _gedis._core._hashes.get(key, {}).duplicate(true)
|
|
|
|
func hexists(key: String, field = null) -> bool:
|
|
if _gedis._expiry._is_expired(key):
|
|
return false
|
|
|
|
if field == null:
|
|
return _gedis._core._hashes.has(key)
|
|
|
|
var d: Dictionary = _gedis._core._hashes.get(key, {})
|
|
return d.has(field)
|
|
|
|
func hkeys(key: String) -> Array:
|
|
if _gedis._expiry._is_expired(key):
|
|
return []
|
|
return _gedis._core._hashes.get(key, {}).keys()
|
|
|
|
func hvals(key: String) -> Array:
|
|
if _gedis._expiry._is_expired(key):
|
|
return []
|
|
return _gedis._core._hashes.get(key, {}).values()
|
|
|
|
func hlen(key: String) -> int:
|
|
if _gedis._expiry._is_expired(key):
|
|
return 0
|
|
return _gedis._core._hashes.get(key, {}).size() |