/ Forside / Teknologi / Udvikling / SQL / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
SQL
#NavnPoint
pmbruun 1704
niller 962
fehaar 730
Interkril.. 701
ellebye 510
pawel 510
rpje 405
pete 350
gibson 320
10  smorch 260
Finde frie IP-blokke med php/sql
Fra : Lars L. Christensen


Dato : 19-09-05 18:14

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:

allocation (ip, prefix)
assignment (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?

mvh
Lars Christensen









 
 
Lars L. Christensen (23-09-2005)
Kommentar
Fra : Lars L. Christensen


Dato : 23-09-05 20:14

"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

Søg
Reklame
Statistik
Spørgsmål : 177580
Tips : 31968
Nyheder : 719565
Indlæg : 6409083
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste