diff options
| -rw-r--r-- | libglusterfs/src/dict.c | 146 | ||||
| -rw-r--r-- | libglusterfs/src/dict.h | 12 | ||||
| -rw-r--r-- | libglusterfs/src/libglusterfs.sym | 2 | 
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  | 
