Browse Source

Ticket #47608 - change slapi_entry_attr_get_bool to handle "on"/"off" values, support default value

Description: Adding an API slapi_entry_attr_get_bool_ext, which is an
extension of slapi_entry_attr_get_bool.  The difference is slapi_
entry_attr_get_bool_ext returns the given default value if the type
is not found in the entry.

https://fedorahosted.org/389/ticket/47608

Reviewed by [email protected] (Thank you, Rich!!)
Noriko Hosoi 11 years ago
parent
commit
57af562233
2 changed files with 31 additions and 4 deletions
  1. 12 2
      ldap/servers/slapd/entry.c
  2. 19 2
      ldap/servers/slapd/slapi-plugin.h

+ 12 - 2
ldap/servers/slapd/entry.c

@@ -2973,9 +2973,9 @@ slapi_entry_attr_get_ulonglong( const Slapi_Entry* e, const char *type)
 
 /* returned value: attribute value as a boolean type */
 PRBool
-slapi_entry_attr_get_bool( const Slapi_Entry* e, const char *type)
+slapi_entry_attr_get_bool_ext(const Slapi_Entry* e, const char *type, PRBool default_value)
 {
-    PRBool r = PR_FALSE; /* default if no attr */
+    PRBool r = default_value; /* default if no attr */
     Slapi_Attr* attr = NULL;
     if ((0 == slapi_entry_attr_find(e, type, &attr)) && attr) {
         Slapi_Value *v;
@@ -2997,6 +2997,10 @@ slapi_entry_attr_get_bool( const Slapi_Entry* e, const char *type)
             r = PR_TRUE;
         } else if (!PL_strncasecmp(bvp->bv_val, "no", bvp->bv_len)) {
             r = PR_FALSE;
+        } else if (!PL_strncmp(bvp->bv_val, "1", bvp->bv_len)) {
+            r = PR_TRUE;
+        } else if (!PL_strncmp(bvp->bv_val, "0", bvp->bv_len)) {
+            r = PR_FALSE;
         } else { /* assume numeric: 0 - false: non-zero - true */
             r = (PRBool)slapi_value_get_ulong(v);
         }
@@ -3004,6 +3008,12 @@ slapi_entry_attr_get_bool( const Slapi_Entry* e, const char *type)
     return r;
 }
 
+PRBool
+slapi_entry_attr_get_bool(const Slapi_Entry* e, const char *type)
+{
+    return slapi_entry_attr_get_bool_ext(e, type, PR_FALSE);
+}
+
 void
 slapi_entry_attr_set_charptr( Slapi_Entry* e, const char *type, const char *value)
 {

+ 19 - 2
ldap/servers/slapd/slapi-plugin.h

@@ -1872,14 +1872,31 @@ unsigned long long slapi_entry_attr_get_ulonglong( const Slapi_Entry* e, const c
  *
  * Comparisons are case-insensitive (\c TRUE, \c trUe, and \c true are all the
  * same), and unique substrings can be matched (\c t and \c tr will be interpreted
- * as \c true). If the attribute value is a number, then non-zero numbers are
+ * as \c true).  In addition, \c on, \c off, \c yes, \c no are supported.
+ * If the attribute value is a number, then non-zero numbers are
  * interpreted as \c true, and \c 0 is interpreted as \c false.
  *
  * \param e Entry from which you want to get the boolean value.
  * \param type Attribute type from which you want to get the value.
  * \return \c PR_TRUE | \c PR_FALSE
  */
-PRBool slapi_entry_attr_get_bool( const Slapi_Entry* e, const char *type);
+PRBool slapi_entry_attr_get_bool(const Slapi_Entry* e, const char *type);
+
+/**
+ * Gets the value of a given attribute of a given entry as a boolean value.
+ *
+ * Comparisons are case-insensitive (\c TRUE, \c trUe, and \c true are all the
+ * same), and unique substrings can be matched (\c t and \c tr will be interpreted
+ * as \c true).  In addition, \c on, \c off, \c yes, \c no are supported.
+ * If the attribute value is a number, then non-zero numbers are
+ * interpreted as \c true, and \c 0 is interpreted as \c false.
+ * If the attribute type is not found in the entry, the given default value is returned.
+ *
+ * \param e Entry from which you want to get the boolean value.
+ * \param type Attribute type from which you want to get the value.
+ * \return \c PR_TRUE | \c PR_FALSE
+ */
+PRBool slapi_entry_attr_get_bool_ext(const Slapi_Entry* e, const char *type, PRBool default_value);
 
 /**
  * Replaces the value or values of an attribute in an entry with a specified string