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