summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--libglusterfs/src/dict.c146
-rw-r--r--libglusterfs/src/dict.h12
-rw-r--r--libglusterfs/src/libglusterfs.sym2
3 files changed, 152 insertions, 8 deletions
diff --git a/libglusterfs/src/dict.c b/libglusterfs/src/dict.c
index 0554ee20d79..57be4e76d63 100644
--- a/libglusterfs/src/dict.c
+++ b/libglusterfs/src/dict.c
@@ -491,6 +491,16 @@ dict_set (dict_t *this,
char *key,
data_t *value)
{
+ const int keylen = strlen(key);
+ return dict_setn(this, key, keylen, value);
+}
+
+int32_t
+dict_setn (dict_t *this,
+ char *key,
+ const int keylen,
+ data_t *value)
+{
int32_t ret;
uint32_t key_hash = 0;
@@ -502,7 +512,7 @@ dict_set (dict_t *this,
}
if (key) {
- key_hash = SuperFastHash (key, strlen(key));
+ key_hash = SuperFastHash (key, keylen);
}
LOCK (&this->lock);
@@ -518,6 +528,13 @@ dict_set (dict_t *this,
int32_t
dict_add (dict_t *this, char *key, data_t *value)
{
+ const int keylen = strlen (key);
+ return dict_addn(this, key, keylen, value);
+}
+
+int32_t
+dict_addn (dict_t *this, char *key, const int keylen, data_t *value)
+{
int32_t ret;
uint32_t key_hash = 0;
@@ -529,7 +546,7 @@ dict_add (dict_t *this, char *key, data_t *value)
}
if (key) {
- key_hash = SuperFastHash (key, strlen(key));
+ key_hash = SuperFastHash (key, keylen);
}
LOCK (&this->lock);
@@ -545,6 +562,13 @@ dict_add (dict_t *this, char *key, data_t *value)
data_t *
dict_get (dict_t *this, char *key)
{
+ const int keylen = strlen(key);
+ return dict_getn(this, key, keylen);
+}
+
+data_t *
+dict_getn (dict_t *this, char *key, const int keylen)
+{
data_pair_t *pair;
uint32_t hash;
@@ -555,7 +579,7 @@ dict_get (dict_t *this, char *key)
return NULL;
}
- hash = SuperFastHash (key, strlen (key));
+ hash = SuperFastHash (key, keylen);
LOCK (&this->lock);
{
@@ -592,6 +616,13 @@ dict_key_count (dict_t *this)
void
dict_del (dict_t *this, char *key)
{
+ const int keylen = strlen(key);
+ return dict_deln(this, key, keylen);
+}
+
+void
+dict_deln (dict_t *this, char *key, const int keylen)
+{
int hashval = 0;
uint32_t hash;
@@ -601,7 +632,7 @@ dict_del (dict_t *this, char *key)
return;
}
- hash = SuperFastHash (key, strlen (key));
+ hash = SuperFastHash (key, keylen);
LOCK (&this->lock);
@@ -1002,6 +1033,28 @@ str_to_data (char *value)
}
data_t *
+strn_to_data (char *value, const int vallen)
+{
+ if (!value) {
+ gf_msg_callingfn ("dict", GF_LOG_WARNING, EINVAL,
+ LG_MSG_INVALID_ARG, "value is NULL");
+ return NULL;
+ }
+ data_t *data = get_new_data ();
+
+ if (!data) {
+ return NULL;
+ }
+ data->len = vallen + 1;
+ data->data_type = GF_DATA_TYPE_STR;
+
+ data->data = value;
+ data->is_static = 1;
+
+ return data;
+}
+
+static data_t *
data_from_dynstr (char *value)
{
if (!value) {
@@ -1507,6 +1560,13 @@ fail:
int
dict_get_with_ref (dict_t *this, char *key, data_t **data)
{
+ const int keylen = strlen(key);
+ return dict_get_with_refn(this, key, keylen, data);
+}
+
+int
+dict_get_with_refn (dict_t *this, char *key, const int keylen, data_t **data)
+{
data_pair_t * pair = NULL;
int ret = -ENOENT;
uint32_t hash;
@@ -1519,7 +1579,7 @@ dict_get_with_ref (dict_t *this, char *key, data_t **data)
goto err;
}
- hash = SuperFastHash (key, strlen (key));
+ hash = SuperFastHash (key, keylen);
LOCK (&this->lock);
{
@@ -2465,6 +2525,31 @@ err:
return ret;
}
+/* Get string - with known key length */
+int
+dict_get_strn (dict_t *this, char *key, const int keylen, char **str)
+{
+ data_t * data = NULL;
+ int ret = -EINVAL;
+
+ if (!this || !key || !str) {
+ goto err;
+ }
+ ret = dict_get_with_refn (this, key, keylen, &data);
+ if (ret < 0) {
+ goto err;
+ }
+
+ VALIDATE_DATA_AND_LOG(data, GF_DATA_TYPE_STR, key, -EINVAL);
+
+ *str = data->data;
+
+err:
+ if (data)
+ data_unref (data);
+
+ return ret;
+}
int
dict_get_str (dict_t *this, char *key, char **str)
@@ -2511,6 +2596,48 @@ err:
return ret;
}
+/* Set string - with known key length */
+int
+dict_set_strn (dict_t *this, char *key, const int keylen, char *str)
+{
+ data_t * data = NULL;
+ int ret = 0;
+
+ data = str_to_data (str);
+ if (!data) {
+ ret = -EINVAL;
+ goto err;
+ }
+
+ ret = dict_setn (this, key, keylen, data);
+ if (ret < 0)
+ data_destroy (data);
+
+err:
+ return ret;
+}
+
+/* Set string - with known key length and known value length */
+int
+dict_set_nstrn (dict_t *this, char *key, const int keylen, char *str, const int vallen)
+{
+ data_t * data = NULL;
+ int ret = 0;
+
+ data = strn_to_data (str, vallen);
+ if (!data) {
+ ret = -EINVAL;
+ goto err;
+ }
+
+ ret = dict_setn (this, key, keylen, data);
+ if (ret < 0)
+ data_destroy (data);
+
+err:
+ return ret;
+}
+
int
dict_set_dynstr_with_alloc (dict_t *this, char *key, const char *str)
{
@@ -2531,6 +2658,13 @@ dict_set_dynstr_with_alloc (dict_t *this, char *key, const char *str)
int
dict_set_dynstr (dict_t *this, char *key, char *str)
{
+ const int keylen = strlen(key);
+ return dict_set_dynstrn(this, key, keylen, str);
+}
+
+int
+dict_set_dynstrn (dict_t *this, char *key, const int keylen, char *str)
+{
data_t * data = NULL;
int ret = 0;
@@ -2540,7 +2674,7 @@ dict_set_dynstr (dict_t *this, char *key, char *str)
goto err;
}
- ret = dict_set (this, key, data);
+ ret = dict_setn (this, key, keylen, data);
if (ret < 0)
data_destroy (data);
diff --git a/libglusterfs/src/dict.h b/libglusterfs/src/dict.h
index 4c204d6c037..83cfd9c0827 100644
--- a/libglusterfs/src/dict.h
+++ b/libglusterfs/src/dict.h
@@ -110,12 +110,16 @@ void data_destroy (data_t *data);
/* function to set a key/value pair (overwrite existing if matches the key */
int32_t dict_set (dict_t *this, char *key, data_t *value);
+int32_t dict_setn (dict_t *this, char *key, const int keylen, data_t *value);
/* function to set a new key/value pair (without checking for duplicate) */
int32_t dict_add (dict_t *this, char *key, data_t *value);
-
+int32_t dict_addn (dict_t *this, char *key, const int keylen, data_t *value);
int dict_get_with_ref (dict_t *this, char *key, data_t **data);
+int dict_get_with_refn (dict_t *this, char *key, const int keylen, data_t **data);
data_t *dict_get (dict_t *this, char *key);
+data_t *dict_getn (dict_t *this, char *key, const int keylen);
void dict_del (dict_t *this, char *key);
+void dict_deln (dict_t *this, char *key, const int keylen);
int dict_reset (dict_t *dict);
int dict_key_count (dict_t *this);
@@ -137,7 +141,7 @@ int32_t dict_lookup (dict_t *this, char *key, data_t **data);
*/
data_t *int_to_data (int64_t value);
data_t *str_to_data (char *value);
-data_t *data_from_dynstr (char *value);
+data_t *strn_to_data (char *value, const int vallen);
data_t *data_from_dynptr (void *value, int32_t len);
data_t *bin_to_data (void *value, int32_t len);
data_t *static_str_to_data (char *value);
@@ -250,10 +254,14 @@ GF_MUST_CHECK int dict_set_static_bin (dict_t *this, char *key, void *ptr, size_
GF_MUST_CHECK int dict_set_option (dict_t *this, char *key, char *str);
GF_MUST_CHECK int dict_set_str (dict_t *this, char *key, char *str);
+GF_MUST_CHECK int dict_set_strn (dict_t *this, char *key, const int keylen, char *str);
+GF_MUST_CHECK int dict_set_nstrn (dict_t *this, char *key, const int keylen, char *str, const int vallen);
GF_MUST_CHECK int dict_set_dynstr (dict_t *this, char *key, char *str);
+GF_MUST_CHECK int dict_set_dynstrn (dict_t *this, char *key, const int keylen, char *str);
GF_MUST_CHECK int dict_set_dynstr_with_alloc (dict_t *this, char *key, const char *str);
GF_MUST_CHECK int dict_add_dynstr_with_alloc (dict_t *this, char *key, char *str);
GF_MUST_CHECK int dict_get_str (dict_t *this, char *key, char **str);
+GF_MUST_CHECK int dict_get_strn (dict_t *this, char *key, const int keylen, char **str);
GF_MUST_CHECK int dict_get_str_boolean (dict_t *this, char *key, int default_val);
GF_MUST_CHECK int dict_rename_key (dict_t *this, char *key, char *replace_key);
diff --git a/libglusterfs/src/libglusterfs.sym b/libglusterfs/src/libglusterfs.sym
index ca952d51942..2da3e701ef9 100644
--- a/libglusterfs/src/libglusterfs.sym
+++ b/libglusterfs/src/libglusterfs.sym
@@ -410,6 +410,8 @@ dict_set_int8
dict_set_static_bin
dict_set_static_ptr
dict_set_str
+dict_set_strn
+dict_set_nstrn
dict_set_uint32
dict_set_uint64
dict_set_flag