0) throw 'Cislo '.$cislo.' nelze zapsat na '.$nakolik.' bajtu!'; return $navrat; } function ObnovOperatora($operator,$jmenosouboru) { if (@FileCTime($operator.'.csv') > Time()-60*60 && @FileCTime($jmenosouboru) > Time()-60*60) { NapisHlasku('Soubor uz je v cache.'); while (@FileCTime($jmenosouboru) > Time()-5) Sleep(1); //pockam, dokud se do nej neprestane zapisovat return; } NapisHlasku('Nacitam operatora '.$operator.'...'); if (!@Copy('http://www.gsmweb.cz/stat/'.$operator.'.csv',$operator.'.csv')) Die('Spatny operator! (oskar, paegas, eurotel, ufon)'); $radky = File($operator.'.csv'); $r = Array(); for ($i = 1; IsSet($radky[$i]); $i++) { $data = Explode(';',iconv('windows-1250','utf-8',RTrim($radky[$i]))); if (!EReg('^[0-9a-f]{1,4}$',$data[1]) || !EReg('^[0-9]{3,5}$',$data[2]) || !EReg('^[A-Z]{2}$',$data[5])) { NapisHlasku('CHYBA V DATECH: '.Implode(';',$data).' - BTSka vynechana.'); } else $r[] = $data; if (SETRENI_PAMETI) UnSet($radky[$i]); } $radky = $r; UnSet($r); NapisHlasku('Tridim...'); USort($radky,'SetridBTS'); $indexy = Array(); $popisy = Array(); $popisy_uz_byly = Array(); $posun_popisu = 0; for ($i = 0; IsSet($radky[$i]); $i++) { $data = &$radky[$i]; if (!EReg('^[0-9a-f]{1,4}$',$data[1]) || !EReg('^[0-9]{3,5}$',$data[2]) || !EReg('^[A-Z]{2}$',$data[5])) Die('Chyba v datech (mela byt odchycena uz pri nacitani radku)!'); else { while (StrLen($data[1]) != 4) $data[1] = '0'.$data[1]; if (StrPos($data[6],'(CID') !== false) { $data[6] = RTrim(SubStr($data[6],0,StrPos($data[6],'(CID'))); } $popis = $data[5].$data[6]; if (Array_Key_Exists($popis,$popisy_uz_byly)) $cislopopisu = $popisy_uz_byly[$popis]; else $cislopopisu = Count($popisy); list($cid_cis1) = SScanf(StrToUpper($data[1]),'%X'); $cid_cis2 = $data[2]+0; $cid_bin = ZapisCisloNa8Bitu($cid_cis1,2).ZapisCisloNa8Bitu($cid_cis2,2); $indexy[] = Array('index' => $cid_bin, 'cislopopisu' => $cislopopisu); if (!Array_Key_Exists($popis,$popisy_uz_byly)) { $popisy_uz_byly[$popis] = Count($popisy); $popisy[] = Array('popis' => $popis,'posun_popisu' => $posun_popisu); $posun_popisu += 1+StrLen($popis); //1 bajt na zapsani delky } } if (SETRENI_PAMETI) UnSet($radky[$i]); } $fp = @FOpen($jmenosouboru,'r'); if ($fp !== false) { FRead($fp,1); //preskocim cislo verze $puvodni_pocet_bts = Ord(FRead($fp,1))*256; $puvodni_pocet_bts += Ord(FRead($fp,1)); FClose($fp); } else $puvodni_pocet_bts = 0; NapisHlasku('Pocet zaznamu: '.$puvodni_pocet_bts.' => '.Count($indexy).', popisu: '.Count($popisy).', velikost popisu: '.$posun_popisu); $fp = FOpen($jmenosouboru,'w'); FPutS($fp,ZapisCisloNa8Bitu(1,1)); //verze 1 FPutS($fp,ZapisCisloNa8Bitu(Count($indexy),2)); //pocet BTSek foreach ($indexy as $i => $index) { if (!SETRENI_PAMETI && $popisy[$index['cislopopisu']]['popis'] != $radky[$i][5].$radky[$i][6]) { Die("\n".'Chyba: '.$i.' '.$popisy[$index['cislopopisu']]['popis'].' != '.$radky[$i][5].$radky[$i][6]."\n"); } FPutS($fp,$index['index']); //co se bude hledat (CID+LAC) FPutS($fp,ZapisCisloNa8Bitu($popisy[$index['cislopopisu']]['posun_popisu'],3)); //kde je popis } foreach($popisy as $popis) { FPutS($fp,ZapisCisloNa8Bitu(MB_StrLen($popis['popis'],'utf-8'),1)); FPutS($fp,$popis['popis']); } FClose($fp); NapisHlasku('Databaze zapsana.'); } $jmenosouboru = 'seznambts-'.$operator.'.dat'; ObnovOperatora($operator,$jmenosouboru); if ($GLOBALS['rovnouvratit']) { Header("Cache-Control: public"); Header("Content-Description: File Transfer"); Header('Content-Type: application/force-download'); Header("Content-Transfer-Encoding: binary"); Header('Content-Disposition: attachment; filename="seznambts.dat"'); Header('Content-Length: '.FileSize($jmenosouboru)); echo File_Get_Contents($jmenosouboru); } ?>