Don't parse comma separated pool names in attr-sql
authorMartin Willi <martin@revosec.ch>
Mon, 27 Aug 2012 14:01:16 +0000 (16:01 +0200)
committerMartin Willi <martin@revosec.ch>
Thu, 30 Aug 2012 14:43:44 +0000 (16:43 +0200)
We now handle multiple pools at a deeper level, making that special
handling obsolete. Comma separated pools are parsed in stroke.

src/libhydra/plugins/attr_sql/sql_attribute.c

index e5a4cdc..8055be7 100644 (file)
@@ -233,7 +233,7 @@ static host_t* get_lease(private_sql_attribute_t *this, char *name,
 }
 
 METHOD(attribute_provider_t, acquire_address, host_t*,
-       private_sql_attribute_t *this, char *names, identification_t *id,
+       private_sql_attribute_t *this, char *name, identification_t *id,
        host_t *requested)
 {
        host_t *address = NULL;
@@ -242,59 +242,17 @@ METHOD(attribute_provider_t, acquire_address, host_t*,
        identity = get_identity(this, id);
        if (identity)
        {
-               /* check for a single pool first (no concatenation and enumeration) */
-               if (strchr(names, ',') == NULL)
+               pool = get_pool(this, name, &timeout);
+               if (pool)
                {
-                       pool = get_pool(this, names, &timeout);
-                       if (pool)
+                       /* check for an existing lease */
+                       address = check_lease(this, name, pool, identity);
+                       if (address == NULL)
                        {
-                               /* check for an existing lease */
-                               address = check_lease(this, names, pool, identity);
-                               if (address == NULL)
-                               {
-                                       /* get an unallocated address or expired lease */
-                                       address = get_lease(this, names, pool, timeout, identity);
-                               }
+                               /* get an unallocated address or expired lease */
+                               address = get_lease(this, name, pool, timeout, identity);
                        }
                }
-               else
-               {
-                       enumerator_t *enumerator;
-                       char *name;
-
-                       /* in a first step check for an existing lease over all pools */
-                       enumerator = enumerator_create_token(names, ",", " ");
-                       while (enumerator->enumerate(enumerator, &name))
-                       {
-                               pool = get_pool(this, name, &timeout);
-                               if (pool)
-                               {
-                                       address = check_lease(this, name, pool, identity);
-                                       if (address)
-                                       {
-                                               enumerator->destroy(enumerator);
-                                               return address;
-                                       }
-                               }
-                       }
-                       enumerator->destroy(enumerator);
-
-                       /* in a second step get an unallocated address or expired lease */
-                       enumerator = enumerator_create_token(names, ",", " ");
-                       while (enumerator->enumerate(enumerator, &name))
-                       {
-                               pool = get_pool(this, name, &timeout);
-                               if (pool)
-                               {
-                                       address = get_lease(this, name, pool, timeout, identity);
-                                       if (address)
-                                       {
-                                               break;
-                                       }
-                               }
-                       }
-                       enumerator->destroy(enumerator);
-               }
        }
        return address;
 }
@@ -303,39 +261,30 @@ METHOD(attribute_provider_t, release_address, bool,
        private_sql_attribute_t *this, char *name, host_t *address,
        identification_t *id)
 {
-       enumerator_t *enumerator;
-       bool found = FALSE;
+       u_int pool, timeout;
        time_t now = time(NULL);
 
-       enumerator = enumerator_create_token(name, ",", " ");
-       while (enumerator->enumerate(enumerator, &name))
+       pool = get_pool(this, name, &timeout);
+       if (pool)
        {
-               u_int pool, timeout;
-
-               pool = get_pool(this, name, &timeout);
-               if (pool)
+               if (this->history)
                {
-                       if (this->history)
-                       {
-                               this->db->execute(this->db, NULL,
-                                       "INSERT INTO leases (address, identity, acquired, released)"
-                                       " SELECT id, identity, acquired, ? FROM addresses "
-                                       " WHERE pool = ? AND address = ?",
-                                       DB_UINT, now, DB_UINT, pool,
-                                       DB_BLOB, address->get_address(address));
-                       }
-                       if (this->db->execute(this->db, NULL,
-                                       "UPDATE addresses SET released = ? WHERE "
-                                       "pool = ? AND address = ?", DB_UINT, time(NULL),
-                                       DB_UINT, pool, DB_BLOB, address->get_address(address)) > 0)
-                       {
-                               found = TRUE;
-                               break;
-                       }
+                       this->db->execute(this->db, NULL,
+                               "INSERT INTO leases (address, identity, acquired, released)"
+                               " SELECT id, identity, acquired, ? FROM addresses "
+                               " WHERE pool = ? AND address = ?",
+                               DB_UINT, now, DB_UINT, pool,
+                               DB_BLOB, address->get_address(address));
+               }
+               if (this->db->execute(this->db, NULL,
+                               "UPDATE addresses SET released = ? WHERE "
+                               "pool = ? AND address = ?", DB_UINT, time(NULL),
+                               DB_UINT, pool, DB_BLOB, address->get_address(address)) > 0)
+               {
+                       return TRUE;
                }
        }
-       enumerator->destroy(enumerator);
-       return found;
+       return FALSE;
 }
 
 METHOD(attribute_provider_t, create_attribute_enumerator, enumerator_t*,