"Lars L. Christensen" <lars_christesen@ieee.org> wrote in
news:Xns96D6C3B0C29FBlarsperseusdkmaybefo@217.74.208.69:
> Hej grupper
>
> Jeg har et kæmpe problem, som enten kan klares i sql eller også er jeg
> nødsaget til at klare det i php.
>
> Mit setup kører på en MySQL 4.1 og så ellers php4.
>
> I sql har jeg følgende 2 tabeller:
>
> allocations (ip, prefix)
> assignments (ip, prefix)
>
> For begge gælder, at ip er en long og prefix angiver CIDR prefixet for
> den pågældende IP adresse.
>
> Allocation indeholder et antal IP-blokke, der er til rådighed.
> Assignment indeholder et antal IP-blokke, der allerede er brugt.
>
> For begge gælder, at en IP-blok starter med "ip" og slutter med "ip+2^
> (32-prefix)-1"
>
> Mit projekt er nu (og her er jeg gået i stå):
>
> Med udgangspunkt i "allocation", find alle IP-blokke af længden "x",
> som ikke allede er brug af en IP-blok fra "assignment".
>
>
> eksempel i grafik:
>
>
>
>| |XXXX| |DDDD|YYYY| |
Z|
Z|WWWW| | | | | |
> +----+----+----+----+----+----+----+----+----+----+----+----+----+----+
> 0 4 8 12 16 20 24 28 32 36 40 44 48 52
> 56
> +---------+---------+---------+---------+---------+---------+---------+
>| | | | | |888888888|888888888|
>| | | |
>
> Hvis jeg skal finde en IP-blok på 8 adresser i ovenstående, vil jeg
> kun kunne bruge 40-47 og 48-55. For en blok på 4 vil der være 8 blokke
> til rådighed.
>
>
> Kan det lade sig gøre at lave ovenstående i ren sql eller skal jeg
> lave det hele i php?
>
> Hvis php, er der nogen gode bud på en konkret løsning?
Ok, jeg har forsøgt mig lidt med følgende kode, men uden helt at den
funker perfekt...
/* For each IP-block of size x fitting into allocations, do a loop to
find out if the block is free. */
while($value = current($allocations)) {
$as = $value['ip'];
$ae = $value['ip'];
/* foreach of the former assigned assignments, find out if the IP-
block is already assigned */
foreach($assignments as $ass){
$us = $ass['ip'];
$ue = $ass['prefix'];
if(($as >= $us && $as <= $ue) || ($ae >= $us && $ae <= $ue)) {
array_splice($allocations,key($allocations),1);
break;
}
}
next($allocations);
}
Problemet er imidlertid, at det kun virker som om, det er hvert andet
element i arrayen $allocations, der reelt bliver kigget på. Hvis jeg
fjerner "next($allocations)", timer scriptet ud pga. for lang runtime :(
Nogen der har ideer eller løsninger til problemet?
mvh
Lars