Don't parse comma separated pool names in attr-sql
We now handle multiple pools at a deeper level, making that special handling obsolete. Comma separated pools are parsed in stroke.
This commit is contained in:
@@ -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*,
|
||||
|
||||
Reference in New Issue
Block a user