file,1); return @ord($data [0]);} function Read24(&$hsdb){ $data=fread($hsdb->file,3); $num=(@ord($data [2])<<16)|(@ord($data [1])<<8)| @ord($data [0]); return $num;} function Read32(&$hsdb){ $data=fread($hsdb->file,4); $num=(@ord($data [3])<<24)|(@ord($data [2])<<16)|(@ord($data [1])<<8)| @ord($data [0]); return $num;} function Read16(&$hsdb){ $data=fread($hsdb->file,2); $num=(@ord($data [1])<<8)|(@ord($data [0])); return $num;} function SDBGet(&$hsdb,&$record){ switch($hsdb->recordType){ case RECORD_CHAR: $record=chr(Read8($hsdb)); break; case RECORD_24_32: $record=new Bitfield24_32Record; $record->data24=Read24($hsdb); Read8($hsdb); $record->data32=Read32($hsdb); break; case RECORD_24_8: $record=new Bitfield24_8Record; $record->data24=Read24($hsdb); $record->data8=Read8($hsdb); break; case RECORD_URLINDEX: $record=new URLIndexRecord; $record->data24=Read24($hsdb); $dat8=Read8($hsdb); $record->sizeFlags=($dat8&0x03); $record->sizeFraction=($dat8&0x3C)>>2; $record->data32=Read32($hsdb); $dat16_1=Read16($hsdb); $dat16_2=Read16($hsdb); $record->dateYear=($dat16_1&0x0FFF); $record->dateMonth=($dat16_1&0xF000)>>12; $record->dateDay=($dat16_2&0x001F); $record->sizeMain=($dat16_2&0xFFE0)>>5; break;} $hsdb->pos=$hsdb->pos+1; return TRUE;} function SDBSeek(&$hsdb,$pos){ if($pos>$hsdb->size || $pos<0) return FALSE; fseek($hsdb->file,$hsdb->recordSize*$pos,SEEK_SET); $hsdb->pos=$pos; return TRUE;} function SDBGetAt(&$hsdb,$pos,&$record){ if(SDBSeek($hsdb,$pos)==FALSE) return FALSE; return SDBGet($hsdb,$record);} function CompareRecords(&$value,&$record,$compareFunc){ if(SDBSeek($value->stringDB,$record->data32)){ $searchCh=0; $searchStr=$value->searchString; $searchStr .=chr(0); while(TRUE){ SDBGet($value->stringDB,$ch); $dif=ord(strtolower($searchStr [$searchCh]))-ord(strtolower($ch)); if($dif<0) return-1; else if($dif>0) return 1; if(ord($ch)==0 || ord($searchStr [$searchCh])==0 || $searchCh>=MAXSTR) break; $searchCh=$searchCh+1;} if(ord($ch)==0&&ord($searchStr [$searchCh])!=0){ return 1;} if(ord($ch)!=0&&ord($searchStr [$searchCh])==0){ return-1;} return 0;} return-1;} function SDBBinarySearchInt24_32(&$hsdb,&$value,&$record,$first,$last,&$insertPos){ $record=new Bitfield24_32Record; $mid=0; while($first<=$last){ $mid=(int)($first+($last-$first)/2); fseek($hsdb->file,8*$mid,SEEK_SET); $record->data24=Read24($hsdb); $res=$value-$record->data24; if($res==0){ Read8($hsdb); $record->data32=Read32($hsdb); $insertPos=$mid; $hsdb->pos=$mid+1; return $mid;} if($res<0){ $last=$mid-1;} else{ $first=$mid+1;}} Read8($hsdb); $record->data32=Read32($hsdb); $insertPos=$first; $hsdb->pos=$mid+1; return-1;} function SDBBinarySearchIntURLIndex(&$hsdb,&$value,&$record,$first,$last,&$insertPos){ $record=new URLIndexRecord; $mid=0; while($first<=$last){ $mid=(int)($first+($last-$first)/2); fseek($hsdb->file,12*$mid,SEEK_SET); $record->data24=Read24($hsdb); $res=$value-$record->data24; if($res==0){ $dat8=Read8($hsdb); $record->sizeFlags=($dat8&0x03); $record->sizeFraction=($dat8&0x3C)>>2; $record->data32=Read32($hsdb); $dat16_1=Read16($hsdb); $dat16_2=Read16($hsdb); $record->dateYear=($dat16_1&0x0FFF); $record->dateMonth=($dat16_1&0xF000)>>12; $record->dateDay=($dat16_2&0x001F); $record->sizeMain=($dat16_2&0xFFE0)>>5; $insertPos=$mid; $hsdb->pos=$mid+1; return $mid;} if($res<0){ $last=$mid-1;} else{ $first=$mid+1;}} $dat8=Read8($hsdb); $record->sizeFlags=($dat8&0x03); $record->sizeFraction=($dat8&0x3C)>>2; $record->data32=Read32($hsdb); $dat16_1=Read16($hsdb); $dat16_2=Read16($hsdb); $record->dateYear=($dat16_1&0x0FFF); $record->dateMonth=($dat16_1&0xF000)>>12; $record->dateDay=($dat16_2&0x001F); $record->sizeMain=($dat16_2&0xFFE0)>>5; $insertPos=$first; $hsdb->pos=$mid+1; return-1;} function SDBBinarySearchInt24_8(&$hsdb,&$value,&$record,$first,$last,&$insertPos){ $record=new Bitfield24_8Record; $mid=0; while($first<=$last){ $mid=(int)($first+($last-$first)/2); fseek($hsdb->file,4*$mid,SEEK_SET); $record->data24=Read24($hsdb); $res=$value-$record->data24; if($res==0){ $record->data8=Read8($hsdb); $insertPos=$mid; $hsdb->pos=$mid+1; return $mid;} if($res<0){ $last=$mid-1;} else{ $first=$mid+1;}} $record->data8=Read8($hsdb); $insertPos=$first; $hsdb->pos=$mid+1; return-1;} function SDBBinarySearch(&$hsdb,&$value,&$record,$first,$last,&$insertPos,$compareFunc){ while($first<=$last){ $mid=(int)($first+($last-$first)/2); SDBGetAt($hsdb,$mid,$record); $res=CompareRecords($value,$record,$compareFunc); if($res==0){ $insertPos=$mid; return $mid;} if($res<0){ $last=$mid-1;} else{ $first=$mid+1;}} $insertPos=$first; return-1;} function IsTerminatingCharacter($char){ $ch=ord($char); if(($ch>=0&&$ch<=38)|| ($ch>=39&&$ch<=47)||($ch>=58&&$ch<=64)|| ($ch>=91&&$ch<=95)|| $ch==96 ||($ch>=123&&$ch<=126)|| $ch==160 || $ch==169 || $ch==167 || $ch==174 ||($ch>=145&&$ch<=151)) return TRUE; return FALSE;} function CheckSpecialCharacter($ch,&$translatedText,&$specialChars){ for($i=0;$iMAXKEYWORD-1)|| $keywords [$i]==' ' || IsTerminatingCharacter($keywords [$i]))){ if($wordlen>=$minKeywordLength){ $newKeyword=new KeywordInfo; $newKeyword->keyword=$word; $newKeyword->ID=0; $newKeyword->currentFilePos=0; $newKeyword->endFilePos=-1; $keywordList []=$newKeyword;} $word='';} else{ if($special) $word .=$special; else $word .=$keywords [$i];}}} function SearchFindStringIdFromName($searchString,&$id,&$indexDB,&$stringDB){ $searchInfo=new SearchIndex_StrInfo; $searchInfo->stringDB=$stringDB; $searchInfo->searchString=$searchString; $pos=SDBBinarySearch($indexDB,$searchInfo,$record,0,$indexDB->size-1,$dummy,SEARCHINDEX_STRFUNC); if($pos==-1){ return FALSE;} $id=$record->data24; return TRUE;} function SearchFindPosIn24_32Index(&$info,&$hsdb,$ID){ $info=new IndexPosInfo; $pos=SDBBinarySearchInt24_32($hsdb,$ID,$record,0,$hsdb->size-1,$dummy); if($pos==-1){ $info->startPos=-1; return FALSE;} $info->startPos=$record->data32; if($hsdb->pos==$hsdb->size){ $info->endPos=-1; return TRUE;} SDBGet($hsdb,$record); $info->endPos=$record->data32; return TRUE;} function SearchFindPosInURLIndex(&$info,&$hsdb,$ID){ $info=new URLIndexInfo; $pos=SDBBinarySearchIntURLIndex($hsdb,$ID,$record,0,$hsdb->size-1,$dummy); if($pos==-1){ $info->startPos=-1; return FALSE;} $info->startPos=$record->data32; $info->dateYear=$record->dateYear; $info->dateMonth=$record->dateMonth; $info->dateDay=$record->dateDay; $info->sizeFlags=$record->sizeFlags; $info->sizeFraction=$record->sizeFraction; $info->sizeMain=$record->sizeMain; if($hsdb->pos==$hsdb->size){ $info->endPos=-1; return TRUE;} SDBGet($hsdb,$record); $info->endPos=$record->data32; return TRUE;} function ReadStringFromCache(&$hsdb,&$outputString,$startPos){ if($startPos>=$hsdb->cacheStart&&$startPos<$hsdb->cacheStart+$hsdb->cacheSize){ $pos=$startPos-$hsdb->cacheStart; $ch=$hsdb->cache [$pos]; $endpos=strpos($hsdb->cache,chr(0),$pos); if($endpos !==FALSE){ $outputString=substr($hsdb->cache,$pos,$endpos-$pos); return TRUE;} else{ return FALSE;}} return FALSE;} function SetCache(&$hsdb,$startPos){ SDBSeek($hsdb,$startPos); $hsdb->cache=fread($hsdb->file,STRCACHESIZE); $hsdb->cacheStart=$startPos; $hsdb->cacheSize=strlen($hsdb->cache);} function SearchReadString(&$hsdb,&$outputString,$startPos){ if(ReadStringFromCache($hsdb,$outputString,$startPos)==FALSE){ SetCache($hsdb,$startPos); ReadStringFromCache($hsdb,$outputString,$startPos);}} function strposi($haystack,$needle,$offset=0){ $haylen=strlen($haystack); $haystack=substr($haystack,$offset,$haylen); $temp=stristr($haystack,$needle); $pos=$haylen-strlen($temp); if($pos==$haylen) $pos=FALSE; else $pos+=$offset; return $pos;} function FindStringInList(&$str,&$list,$sep){ $chunks=explode($sep,$list); foreach($chunks as $chunk){ $foundPos=strposi($str,$chunk); if($foundPos !==FALSE&&$foundPos==0){ return TRUE;}} return FALSE;} function SearchCheckFilter(&$si,&$result,&$searchFilter){ if($searchFilter->prevValidDayCount){ if(IsDocumentRecent($result->dateYear,$result->dateMonth,$result->dateDay,$searchFilter->prevValidDayCount)==FALSE){ return FALSE;}} if($searchFilter->validDocTypes){ $type=$result->docType; if(($searchFilter->validDocTypes&$type)==0){ return FALSE;}} if(is_string($searchFilter->URLGroup)&&strlen($searchFilter->URLGroup)>0){ $url=$result->URL; if($si->bDemoVersion){ $desPos=strpos($result->URL,'url='); if($desPos !==FALSE)$url=substr($result->URL,4);} if(FindStringInList($url,$searchFilter->URLGroup,'*')==FALSE){ return FALSE;}} return TRUE;} function SearchAddResult(&$si,$URLID,$score,&$searchFilter){ if(SearchFindPosInURLIndex($indexInfo,$si->URLIndexDB,$URLID)==FALSE){ return FALSE;} $result=new ResultInfo; $result->dateYear=$indexInfo->dateYear; $result->dateMonth=$indexInfo->dateMonth; $result->dateDay=$indexInfo->dateDay; $result->sizeFlags=$indexInfo->sizeFlags; $result->sizeFraction=$indexInfo->sizeFraction; $result->sizeMain=$indexInfo->sizeMain; SearchReadString($si->URLDB,$result->URL,$indexInfo->startPos); $result->URLID=$URLID; $result->score=$score; $result->docType=SearchGetDocTypeFromURL($result->URL,$si->bDemoVersion==FALSE); if(SearchCheckFilter($si,$result,$searchFilter)){ $si->resultList []=$result;} return TRUE;} function GetCombinedSize($sizeMain,$sizeFraction,$sizeFlags){ $size=$sizeMain*10+$sizeFraction; switch($sizeFlags){ case SIZE_FLAG_BYTES: return $size/10; case SIZE_FLAG_KBYTES: return $size*100; case SIZE_FLAG_MBYTES: return $size*100000; case SIZE_FLAG_GBYTES: return $size*100000000;} return 0;} function CompareDates($dateYear1,$dateMonth1,$dateDay1,$dateYear2,$dateMonth2,$dateDay2){ if($dateYear1==$dateYear2){ if($dateMonth1==$dateMonth2){ if($dateDay1==$dateDay2){ return 0;} return $dateDay1-$dateDay2;} return $dateMonth1-$dateMonth2;} return $dateYear1-$dateYear2;} function ResultSortByScore($a,$b){ if($a->score==$b->score)return 0; return($a->score>$b->score)?-1 : 1;} function ResultSortByType($a,$b){ $res=$a->docType-$b->docType; if($res==0) return ResultSortByScore($a,$b); return $res;} function ResultSortBySize($a,$b){ $res=GetCombinedSize($b->sizeMain,$b->sizeFraction,$b->sizeFlags)- GetCombinedSize($a->sizeMain,$a->sizeFraction,$a->sizeFlags); if($res==0) return ResultSortByScore($a,$b); return $res;} function ResultSortByDate($a,$b){ $res=CompareDates($b->dateYear,$b->dateMonth,$b->dateDay,$a->dateYear,$a->dateMonth,$a->dateDay); if($res==0) return ResultSortByScore($a,$b); return $res;} function ResultSortByURLName($a,$b){ $res=strcasecmp($a->URL,$b->URL); if($res==0) return ResultSortByScore($a,$b); return $res;} function SearchStart(&$si,$keywords,$maxResults,$minKeywordLength,&$specialChars,&$searchFilter,$sortFunc){ $minHits=0; $minHitsKeyword=NULL; SearchParseKeywords($keywords,$si->keywordList,$minKeywordLength,$specialChars); for($i=0;$ikeywordList);$i++){ $keyword=&$si->keywordList [$i]; if(SearchFindStringIdFromName($keyword->keyword,$keywordId,$si->keywordIndexDB,$si->keywordDB)){ $keyword->ID=$keywordId; $bSearchRecord=SearchFindPosIn24_32Index($indexPosInfo,$si->searchByKeywordIndexDB,$keywordId); $dbSize=$si->searchByKeywordDB->size; if($bSearchRecord){ $keyword->currentFilePos=$indexPosInfo->startPos; $keyword->endFilePos=$indexPosInfo->endPos; if($keyword->endFilePos==-1){ $tempLong=$dbSize-$keyword->currentFilePos;} else{ $tempLong=$keyword->endFilePos-$keyword->currentFilePos;} if($minHits==0 || $tempLong<$minHits){ $minHits=$tempLong; $minHitsKeyword=&$keyword;}} else{ return FALSE;}} else{ return FALSE;}} if($minHitsKeyword==NULL){ return FALSE;} $minHitsEndPos=$minHitsKeyword->endFilePos; if($minHitsEndPos==-1){ $minHitsEndPos=$dbSize;} do{ if(SDBGetAt($si->searchByKeywordDB,$minHitsKeyword->currentFilePos,$URLRecord)==FALSE){ return FALSE;} $currentScore=$URLRecord->data8; $bSearchRecord=TRUE; for($i=0;$ikeywordList);$i++){ $keyword=&$si->keywordList [$i]; if($keyword->ID !=$minHitsKeyword->ID){ if(-1==SDBBinarySearchInt24_8($si->searchByKeywordDB,$URLRecord->data24, $tempURLRecord,$keyword->currentFilePos, ($keyword->endFilePos==-1)? $si->searchByKeywordDB->size-1 : $keyword->endFilePos-1, $tempLong)){ if($tempLong<$keyword->endFilePos){ $keyword->currentFilePos=$tempLong;} $bSearchRecord=FALSE; break;} else{ if($tempLong<$keyword->endFilePos){ $keyword->currentFilePos=$tempLong;} $currentScore+=$tempURLRecord->data8;}}} if($bSearchRecord){ if(SearchAddResult($si,$URLRecord->data24,$currentScore,$searchFilter)==FALSE) return FALSE; if(count($si->resultList)>=$maxResults) break;} $minHitsKeyword->currentFilePos=$minHitsKeyword->currentFilePos+1; }while($minHitsKeyword->currentFilePos<$minHitsEndPos); if(count($si->resultList)>1){ usort($si->resultList,$sortFunc);} return TRUE;} function SDBInitialize(&$hsdb,$fname,$recordSize,$recordType){ $hsdb=new SDBInfo; $hsdb->pos=0; $hsdb->file=@fopen($fname,"rb"); if($hsdb->file==NULL){ return FALSE;} fseek($hsdb->file,0,SEEK_END); $hsdb->size=(int)(ftell($hsdb->file)/$recordSize); fseek($hsdb->file,0,SEEK_SET); $hsdb->recordType=$recordType; $hsdb->recordSize=$recordSize; $hsdb->cacheStart=0; $hsdb->cacheSize=0; return TRUE;} function SDBIsInitialized(&$hsdb){ return $hsdb&&$hsdb->file;} function SearchInitialize(&$si,$prefixString){ SDBInitialize($si->settingsDB,SETTINGS_FILENAME,1,RECORD_CHAR); if(SDBInitialize($si->keywordDB,$prefixString . KEYWORDDBNAME,1,RECORD_CHAR)==FALSE || SDBInitialize($si->searchByKeywordIndexDB,$prefixString . SEARCHBYKEYWORDINDEXDBNAME,8,RECORD_24_32)==FALSE || SDBInitialize($si->searchByKeywordDB,$prefixString . SEARCHBYKEYWORDDBNAME,4,RECORD_24_8)==FALSE || SDBInitialize($si->URLDB,$prefixString . URLDBNAME,1,RECORD_CHAR)==FALSE || SDBInitialize($si->URLIndexDB,$prefixString . URLINDEXDBNAME,12,RECORD_URLINDEX)==FALSE || SDBInitialize($si->keywordIndexDB,$prefixString . KEYWORDINDEXDBNAME,8,RECORD_24_32)==FALSE){ return FALSE;} SDBInitialize($si->contentsIndexDB,$prefixString . CONTENTSINDEXDBNAME,8,RECORD_24_32); SDBInitialize($si->contentsDB,$prefixString . CONTENTSDBNAME,4,RECORD_24_8); SDBInitialize($si->keywordIndex2DB,$prefixString . KEYWORDINDEX2DBNAME,8,RECORD_24_32); return TRUE;} function SearchCleanup(&$si){ fclose($si->settingsDB->file); fclose($si->keywordDB->file); fclose($si->searchByKeywordIndexDB->file); fclose($si->searchByKeywordDB->file); fclose($si->URLDB->file); fclose($si->URLIndexDB->file); fclose($si->keywordIndexDB->file); fclose($si->contentsIndexDB->file); fclose($si->contentsDB->file); fclose($si->keywordIndex2DB->file);} function FindKeywordsInContents(&$si,$startPos,$keywordCount,&$keywordLocationList){ $insertedCount=0; $keywordLocation=new KeywordLocationInfo; if(SDBSeek($si->contentsDB,$startPos)){ $data=fread($si->contentsDB->file,min($keywordCount,CONTENTS_KEYWORD_LIMIT_SOURCE)*4); $dataSize=strlen($data)/4; for($i=0;$i<$dataSize;$i++){ $keywordID=(@ord($data [$i*4+2])<<16)|(@ord($data [$i*4+1])<<8)| @ord($data [$i*4]); $bKeyword=@ord($data [$i*4+3]); for($j=0;$jkeywordList);$j++){ $keywordInfo=&$si->keywordList [$j]; if(($bKeyword&1)==1&&$keywordInfo->ID==$keywordID){ if($keywordID !=0){ $keywordLocation->ID=$keywordID; $keywordLocation->position=$startPos+$i; $keywordLocation->score=0; $keywordLocation->bDisplayed=FALSE; $keywordLocationList []=$keywordLocation; $insertedCount++; if($insertedCount>=CONTENTS_KEYWORD_LIMIT_TARGET){ return TRUE;} break;}}}} if(count($keywordLocationList)==0){ $keywordLocation->ID=0; $keywordLocation->position=$startPos; $keywordLocation->score=0; $keywordLocation->bDisplayed=FALSE; $keywordLocationList []=$keywordLocation;} return TRUE;} return FALSE;} function FilterKeywordsInContents($maxDescriptionLength,&$keywordLocationList){ global $contentPreviewBlockSize; $maxScore=0; $wordsLeft=$maxDescriptionLength; $markNextKeywords=0; $prevInfo=NULL; for($i=count($keywordLocationList)-1;$i>=0;$i--){ $keywordInfo=&$keywordLocationList [$i]; if($prevInfo !=NULL){ if($prevInfo->position-$keywordInfo->position<=$contentPreviewBlockSize){ $keywordInfo->score=$prevInfo->score+1; if($prevInfo->position-$keywordInfo->position==1) $keywordInfo->score+=CONTENTS_NEIGHBORING_KEYWORDS_BOOST;} else{ $keywordInfo->score=1;}} else{ $keywordInfo->score=1;} if($keywordInfo->score>$maxScore){ $maxScore=$keywordInfo->score;} $prevInfo=&$keywordInfo;} for($i=$maxScore;$i>=1;$i--){ if($wordsLeft<=0){ break;} for($j=0;$jscore==$i || $markNextKeywords>0)&& $keywordInfo->bDisplayed==FALSE){ $keywordInfo->bDisplayed=TRUE; $markNextKeywords=$keywordInfo->score-1; $wordsLeft-=$contentPreviewBlockSize; if($wordsLeft<=0){ break;}}}} return TRUE;} function SearchFindStringNameFromId($id,&$searchString,&$indexDB,&$stringDB){ if(SearchFindPosIn24_32Index($indexInfo,$indexDB,$id)==FALSE){ return FALSE;} $searchString=''; $pos=$indexInfo->startPos; SearchReadString($stringDB,$searchString,$indexInfo->startPos); return TRUE;} function FixWordCase($wordCase,&$word){ if($wordCase==3 || $wordCase==2){ $word=strtolower($word); if($wordCase==2){ $word [0]=strtoupper($word [0]);}} if($wordCase==1){ $word=strtoupper($word);}} function AddContentWordsToDescription(&$si,&$keywordLocationList,$pos,$count,&$charsLeft,&$buffer){ $bNonKeywordMode=FALSE; if(SDBSeek($si->contentsDB,$pos)){ for($i=0;$i<$count;){ SDBGet($si->contentsDB,$record); $keywordID=$record->data24; $keywordBuffer=''; $bSpaceBefore=($record->data8&(0x1<<3))? FALSE : TRUE; $wordCase=(($record->data8&0x6)>>1); if(($record->data8&1)!=1){ $bNonKeywordMode=TRUE;} if($charsLeft<=0){ break;} if($bNonKeywordMode){ for($j=0;$j<3&&$charsLeft>1;$j++){ $str=chr(($record->data24&(0xFF<<(8*$j)))>>(8*$j)); if($j==0&&$bSpaceBefore){ $buffer .=' '; $charsLeft--;} if(ord($str)==0){ $bNonKeywordMode=FALSE; break;} if($str=='<'){ $buffer .='<'; $charsLeft-=4;} else if($str=='>'){ $buffer .='>'; $charsLeft-=4;} else{ $buffer .=$str; $charsLeft--;}}} else{ if($keywordID==0){ $bNonKeywordMode=TRUE;} else{ if(SearchFindStringNameFromId($keywordID,$keywordBuffer,$si->keywordIndex2DB,$si->keywordDB)){ $keywordLength=strlen($keywordBuffer)+($bSpaceBefore ? 1 : 0); FixWordCase($wordCase,$keywordBuffer); $bMakeBold=FALSE; if($si->keywordList){ for($j=0;$jkeywordList);$j++){ $info=&$si->keywordList [$j]; if($info->ID==$keywordID){ $bMakeBold=TRUE;}}} if($bMakeBold){ if($charsLeft>3){ $buffer .=''; $charsLeft-=3;}} if($keywordLength<$charsLeft){ if($bSpaceBefore)$buffer .=' '; $buffer .=$keywordBuffer; $charsLeft-=$keywordLength;} else{ $charsLeft=0; break;} if($bMakeBold){ if($charsLeft>4){ $buffer .=''; $charsLeft-=4;}}}}} $i++;} return TRUE;} return FALSE;} function CreateContentsDescription(&$si,$maxDescriptionLength,&$keywordLocationList,$startPos,$keywordCount,&$buffer){ global $contentPreviewBlockSize; $lastPos=-1; $charsLeft=MAXSTR-1; $updatedBlockSize=$contentPreviewBlockSize; if(count($keywordLocationList)>0&&count($keywordLocationList)*$contentPreviewBlockSize<$maxDescriptionLength){ $updatedBlockSize=$maxDescriptionLength/count($keywordLocationList);} $lastCount=$updatedBlockSize; for($i=0;$ibDisplayed){ $pos=$keywordInfo->position-(int)($updatedBlockSize/2); if($pos<$startPos){ $pos=$startPos;} if($lastPos !=-1&&($pos-$lastPos<$lastCount)){ $pos=$lastPos+$lastCount; $count=$keywordInfo->position+(int)($updatedBlockSize/2)+1-$pos;} else{ $count=$updatedBlockSize;} if($count>0){ if($pos+$count>$startPos+$keywordCount){ $count=$startPos+$keywordCount-$pos;} if($lastPos==-1 ||($pos-$lastPos>$lastCount)){ $buffer .=' ...'; if(4<$charsLeft){ $charsLeft-=4;}} AddContentWordsToDescription($si,$keywordLocationList,$pos,$count,$charsLeft,$buffer); $lastPos=$pos; $lastCount=$count;}}} return TRUE;} function GetDescriptionFromContents(&$si,$URLID,&$buffer){ global $contentPreviewBlockCount; global $contentPreviewBlockSize; $retval=FALSE; $bSearchRecord=SearchFindPosIn24_32Index($indexPosInfo,$si->contentsIndexDB,$URLID); if($bSearchRecord){ if($indexPosInfo->endPos==-1){ $count=$si->contentsDB->size-$indexPosInfo->startPos;} else{ $count=$indexPosInfo->endPos-$indexPosInfo->startPos;} if(FindKeywordsInContents($si,$indexPosInfo->startPos,$count,$keywordLocationList)){ if(FilterKeywordsInContents($contentPreviewBlockCount*$contentPreviewBlockSize,$keywordLocationList)){ $buffer=''; CreateContentsDescription($si,$contentPreviewBlockCount*$contentPreviewBlockSize,$keywordLocationList,$indexPosInfo->startPos,$count,$buffer); $retval=TRUE;}}} return $retval;} function GetTitleAndDescriptionFromURLID(&$si,$URLID,&$title,&$description,$bDesc){ $pos=0; $length=0; if(SearchFindPosInURLIndex($indexInfo,$si->URLIndexDB,$URLID)==FALSE){ return FALSE;} SearchReadString($si->URLDB,$URL,$indexInfo->startPos); $off=strlen($URL)+1; SearchReadString($si->URLDB,$title,$indexInfo->startPos+$off); $off+=strlen($title)+1; if($bDesc){ SearchReadString($si->URLDB,$description,$indexInfo->startPos+$off); $description .='...';} return TRUE;} function GetSettingStringValue(&$hsdb,$off){ SearchReadString($hsdb,$val,$off); return $val;} function GetSettingByteValue(&$hsdb,$off){ SDBSeek($hsdb,$off); SDBGet($hsdb,$byte); return ord($byte);} function GetSettingSpecialChars(&$hsdb,$off){ SDBSeek($hsdb,$off); return fread($hsdb->file,CSPECIALCHARS*CSPECIALCHARSIZE);} function GetSettingDoubleByteValue(&$hsdb,$off){ SDBSeek($hsdb,$off); SDBGet($hsdb,$lowerByte); SDBGet($hsdb,$higherByte); return(ord($higherByte)<<8)| ord($lowerByte);} function GetURLWithoutParams(&$URL,&$URLNoParams){ $newLength=-1; $qmPos=strpos($URL,'?'); if($qmPos !==FALSE){ $newLength=$qmPos;} $hashPos=strpos($URL,'#'); if($hashPos !==FALSE&&($newLength==-1 || $hashPos<$newLength)){ $newLength=$hashPos;} if($newLength !=-1){ $URLNoParams=substr($URL,0,$newLength);} else{ $URLNoParams=$URL;}} function GetExtensionFromPath(&$path,&$extension){ $dot=strrpos($path,'.'); if($dot !==FALSE){ $slash=strrpos($path,'/'); if($slash===FALSE || $slash<$dot){ $extension=strtolower(substr($path,$dot+1)); return TRUE;}} $extension=''; return FALSE;} function GetExtensionFromURL(&$URL,&$extension,$bStripParams){ $URLNoParams=''; if($bStripParams){ GetURLWithoutParams($URL,$URLNoParams); return GetExtensionFromPath($URLNoParams,$extension);} else{ return GetExtensionFromPath($URL,$extension);}} function SearchGetDocTypeFromURL(&$URL,$bStripParams){ $documentType=DOC_OTHER; $documentExtension=''; if(GetExtensionFromURL($URL,$documentExtension,$bStripParams)){ if($documentExtension=='pdf'){ $documentType=DOC_PDF;} else if($documentExtension=='doc' || $documentExtension=='rtf'){ $documentType=DOC_DOC;} else if($documentExtension=='xls'){ $documentType=DOC_XLS;} else if($documentExtension=='ppt' || $documentExtension=='pps'){ $documentType=DOC_PPT;}} return $documentType;} function IsDocumentRecent($year,$month,$day,$prevValidDayCount){ $firstValidTimeRaw=time()-60*60*24*$prevValidDayCount; $filterTime=localtime($firstValidTimeRaw,TRUE); if($year<1900+$filterTime ['tm_year']){ return FALSE;} if($year==1900+$filterTime ['tm_year']){ if($month<$filterTime ['tm_mon']+1){ return FALSE;} if($month==$filterTime ['tm_mon']+1){ if($day<$filterTime ['tm_mday']){ return FALSE;}}} return TRUE;} function ResultResolveConditionalCommands($docKind,&$resultTemplate,&$currentResult){ while(TRUE){ $tempInt=strpos($resultTemplate,'{{IF'); if($tempInt===FALSE){ break;} $tempInt2=strpos($resultTemplate,'|',$tempInt); if($tempInt2===FALSE){ break;} $tempInt3=strpos($resultTemplate,'}}',$tempInt); $tempInt4=strpos($resultTemplate,'{{IF',$tempInt+4); if($tempInt4 !==FALSE&&$tempInt3 !==FALSE&&$tempInt4<$tempInt3){ $tempInt4=$tempInt3+2-$tempInt; $tempInt3=strpos($resultTemplate,'}}',$tempInt+$tempInt4);} if($tempInt3===FALSE || $tempInt3<=$tempInt2){ break;} $tempInt+=6; $bInclude=FALSE; if($resultTemplate [$tempInt-2]=='D'){ $tempBool=($resultTemplate [$tempInt-1]=='-'); $tempInt4=(int)substr($resultTemplate,$tempInt,$tempInt2-$tempInt); $bInclude=IsDocumentRecent($currentResult->dateYear,$currentResult->dateMonth,$currentResult->dateDay, $tempInt4); if($tempBool){ $bInclude=!$bInclude;}} else{ $tempInt4=(int)substr($resultTemplate,$tempInt,$tempInt2-$tempInt); $bInclude=(($tempInt4&$docKind)!=0);} $includedCode=''; if($bInclude){ $includedCode=substr($resultTemplate,$tempInt2+1,$tempInt3-$tempInt2-1);} $remainingCode=substr($resultTemplate,$tempInt3+2); $resultTemplate=substr($resultTemplate,0,$tempInt-6). $includedCode . $remainingCode;}} function GetMonthString($month){ $buf=''; switch($month){ case 1: $buf='Jan'; break; case 2: $buf='Feb'; break; case 3: $buf='Mar'; break; case 4: $buf='Apr'; break; case 5: $buf='May'; break; case 6: $buf='Jun'; break; case 7: $buf='Jul'; break; case 8: $buf='Aug'; break; case 9: $buf='Sep'; break; case 10: $buf='Oct'; break; case 11: $buf='Nov'; break; case 12: $buf='Dec'; break;} return $buf;} function ResultReplaceDateString(&$resultTemplate,&$currentResult){ $tempInt=-1; while(TRUE){ $tempInt3=$tempInt; $tempInt=strpos($resultTemplate,'(docdate'); if($tempInt===FALSE || $tempInt<=$tempInt3){ break;} $tempInt2=strpos($resultTemplate,')',$tempInt); if($tempInt2===FALSE){ break;} $tempInt+=8; if($currentResult->dateYear>0){ $buf=substr($resultTemplate,$tempInt,$tempInt2-$tempInt); $buf=str_replace('DD',$currentResult->dateDay,$buf); $buf=str_replace('YYYY',$currentResult->dateYear,$buf); $buf=str_replace('MMM',GetMonthString($currentResult->dateMonth),$buf); $buf=str_replace('MM',$currentResult->dateMonth,$buf);} else{ $buf='';} $resultTemplate=str_replace(substr($resultTemplate,$tempInt-8,$tempInt2-$tempInt+8+1),$buf,$resultTemplate);}} function ResultReplaceSizeString(&$resultTemplate,&$currentResult){ $sizeFr=(string)($currentResult->sizeFraction<10 ? $currentResult->sizeFraction : 0); $size=(string)$currentResult->sizeMain; if($currentResult->sizeFlags !=SIZE_FLAG_BYTES&&$currentResult->sizeFlags !=SIZE_FLAG_KBYTES){ $size .='.' . $sizeFr;} if($currentResult->sizeFlags==SIZE_FLAG_KBYTES){ $size .='KB';} if($currentResult->sizeFlags==SIZE_FLAG_MBYTES){ $size .='MB';} if($currentResult->sizeFlags==SIZE_FLAG_GBYTES){ $size .='GB';} $resultTemplate=str_replace('(docsize)',$size,$resultTemplate);} function GetFilenameFromPath(&$path){ $lastChar=strrpos($path,'\\'); if($lastChar===FALSE){ $lastChar=strrpos($path,'/');} if($lastChar !==FALSE){ return substr($path,$lastChar+1);} else{ return $path;}} function str_replace_no_case(&$src,&$trg,&$string){ $pos=0; $retstr=''; while(TRUE){ $newpos=strposi($string,$src,$pos); if($newpos===FALSE){ break;} if($newpos-$pos>0) $retstr .=substr($string,$pos,$newpos-$pos); $retstr .=$trg; $pos=$newpos+strlen($src);} $retstr .=substr($string,$pos); return $retstr;} function MakeSearchKeywordsBold(&$si,&$string){ for($i=0;$ikeywordList);$i++){ $keyword=&$si->keywordList [$i]; if(is_string($keyword->keyword)&&strlen($keyword->keyword)>0){ $n=strposi($string,$keyword->keyword); if($n !==FALSE){ $rep='' . substr($string,$n,strlen($keyword->keyword)). ''; $string=@str_replace_no_case($keyword->keyword,$rep,$string);}}} return TRUE;} function ResultReplaceSpecialStrings($currentResultNumber,$docKind,&$si,$contents,$targetFrame,&$resultTemplate,&$currentResult){ $docType='HTML'; $docName=GetFilenameFromPath($currentResult->URL); if($docKind==DOC_PDF){ $docType='PDF';} else if($docKind==DOC_DOC){ $docType='Word';} else if($docKind==DOC_XLS){ $docType='Excel';} else if($docKind==DOC_PPT){ $docType='PowerPoint';} $resultTemplate=str_replace('(URL)',$currentResult->URL,$resultTemplate); $buf=$currentResult->description; MakeSearchKeywordsBold($si,$buf); $resultTemplate=str_replace('(docdesc)',$buf,$resultTemplate); if(strlen($currentResult->title)==0) $buf=$currentResult->URL; else $buf=$currentResult->title; MakeSearchKeywordsBold($si,$buf); $resultTemplate=str_replace('(doctitle)',$buf,$resultTemplate); $resultTemplate=str_replace('(doctype)',$docType,$resultTemplate); $resultTemplate=str_replace('(docname)',$docName,$resultTemplate); $resultTemplate=str_replace('(resnumber)',$currentResultNumber,$resultTemplate); $resultTemplate=str_replace('(trgframe)',$targetFrame,$resultTemplate); $resultTemplate=str_replace('(doccontents)',is_string($contents)&&strlen($contents)>0 ? $contents : ' ',$resultTemplate); ResultReplaceDateString($resultTemplate,$currentResult); ResultReplaceSizeString($resultTemplate,$currentResult);} function ProcessResultCode(&$si,&$currentResult,$currentResultNumber,&$resultBuffer, &$contents,&$targetFrame){ $docKind=$currentResult->docType; ResultResolveConditionalCommands($docKind,$resultBuffer,$currentResult); ResultReplaceSpecialStrings($currentResultNumber,$docKind,$si,$contents,$targetFrame, $resultBuffer,$currentResult);} function OverviewResolveConditionalCommands($currentPageNumber,$lastPageNumber,&$resultTemplate){ while(TRUE){ $tempInt=strpos($resultTemplate,'{{IF'); if($tempInt===FALSE){ break;} $tempInt2=strpos($resultTemplate,'|',$tempInt); if($tempInt2===FALSE){ break;} $tempInt3=strpos($resultTemplate,'}}',$tempInt); $tempInt4=strpos($resultTemplate,'{{IF',$tempInt+4); if($tempInt4 !==FALSE&&$tempInt3 !==FALSE&&$tempInt4<$tempInt3){ $tempInt4=$tempInt3+2-$tempInt; $tempInt3=strpos($resultTemplate,'}}',$tempInt+$tempInt4);} if($tempInt3===FALSE || $tempInt3<=$tempInt2){ break;} $tempInt+=6; $bInclude=FALSE; if($resultTemplate [$tempInt-2]=='N'&&$resultTemplate [$tempInt-1]=='L'){ $bInclude=($currentPageNumber !=$lastPageNumber);} else if($resultTemplate [$tempInt-2]=='L'&&$resultTemplate [$tempInt-1]=='A'){ $bInclude=($currentPageNumber==$lastPageNumber);} else if($resultTemplate [$tempInt-2]=='E'&&$resultTemplate [$tempInt-1]=='X'){ $tempInt4=(int)substr($resultTemplate,$tempInt,$tempInt2-$tempInt); $bInclude=($tempInt4-1<=$lastPageNumber);} else if($resultTemplate [$tempInt-2]=='N'&&$resultTemplate [$tempInt-1]=='E'){ $tempInt4=(int)substr($resultTemplate,$tempInt,$tempInt2-$tempInt); $bInclude=($tempInt4-1>$lastPageNumber);} else if($resultTemplate [$tempInt-2]=='P'&&$resultTemplate [$tempInt-1]=='G'){ $tempInt4=(int)substr($resultTemplate,$tempInt,$tempInt2-$tempInt); $bInclude=($currentPageNumber==$tempInt4-1);} else if($resultTemplate [$tempInt-2]=='N'&&$resultTemplate [$tempInt-1]=='P'){ $tempInt4=(int)substr($resultTemplate,$tempInt,$tempInt2-$tempInt); $bInclude=($currentPageNumber !=$tempInt4-1);} $includedCode=''; if($bInclude){ $includedCode=substr($resultTemplate,$tempInt2+1,$tempInt3-$tempInt2-1);} $remainingCode=substr($resultTemplate,$tempInt3+2); $resultTemplate=substr($resultTemplate,0,$tempInt-6). $includedCode . $remainingCode;}} function CreatePageLink($nPage,&$params,$encodedQuery){ return($params->scriptName . '?q=' . $encodedQuery . '&cnt=' . $params->count . '&strt=' .($nPage*$params->count). '&pvdc=' . $params->searchFilter->prevValidDayCount . '&vdt=' . $params->searchFilter->validDocTypes . '&sec=' . $params->searchFilter->URLGroup . '&pref=' . $params->prefixString). '&sort=' . $params->sortType;} function OverviewReplaceSpecialStrings($maxResults,$currentPageNumber,$lastPage,$resultCount, &$params,&$resultTemplate){ $encodedQuery=urlencode($params->queryString); $lastResult=($currentPageNumber*$params->count)+$params->count; if($lastResult>$resultCount){ $lastResult=$resultCount;} if($resultCount<$maxResults){ $resultCountStr=$resultCount;} else{ $resultCountStr='>' . $maxResults;} $resultTemplate=str_replace('(resultcount)',$resultCountStr,$resultTemplate); $resultTemplate=str_replace('(firstresult)',($currentPageNumber*$params->count)+1,$resultTemplate); $resultTemplate=str_replace('(lastresult)',$lastResult,$resultTemplate); $resultTemplate=str_replace('(resultsperpage)',$params->count,$resultTemplate); $resultTemplate=str_replace('(currentpage)',$currentPageNumber+1,$resultTemplate); $resultTemplate=str_replace('(lastpage)',$lastPage+1,$resultTemplate); $resultTemplate=str_replace('(searchquery)',$params->queryString,$resultTemplate); $resultTemplate=str_replace('(linkprev)',CreatePageLink($currentPageNumber-1,$params,$encodedQuery),$resultTemplate); $resultTemplate=str_replace('(linknext)',CreatePageLink($currentPageNumber+1,$params,$encodedQuery),$resultTemplate); for($nPage=0;$nPage<=$lastPage;$nPage++){ $resultTemplate=str_replace("(linkpage" .($nPage+1).")",CreatePageLink($nPage,$params,$encodedQuery),$resultTemplate);}} function ProcessOverviewCode($maxResults,$currentPageNumber,$resultCount,&$params, &$resultBuffer){ $lastPage=(($resultCount % $params->count)!=0)?((int)($resultCount/$params->count)):(((int)($resultCount/$params->count))-1); OverviewResolveConditionalCommands($currentPageNumber,$lastPage,$resultBuffer); if($resultCount>0){ OverviewReplaceSpecialStrings($maxResults,$currentPageNumber,$lastPage,$resultCount,$params,$resultBuffer);}} function PrintNormalResult(&$si,&$currentResult,$nResult,$firstResult){ global $string7; global $resultFormatText; $resultTemplate=$resultFormatText; GetTitleAndDescriptionFromURLID($si,$currentResult->URLID,$currentResult->title,$currentResult->description,strstr($resultTemplate,'(docdesc)')); $contents=''; if(strstr($resultTemplate,'(doccontents)')){ if(SDBIsInitialized($si->contentsDB)&&SDBIsInitialized($si->contentsIndexDB)&& SDBIsInitialized($si->keywordIndex2DB)){ GetDescriptionFromContents($si,$currentResult->URLID,$contents); $contents .='...';}} ProcessResultCode($si,$currentResult,$nResult+$firstResult,$resultTemplate,$contents,$string7); echo $resultTemplate;} function PerformSearch(&$params){ global $string7; global $resultFormatText; global $contentPreviewBlockCount; global $contentPreviewBlockSize; global $resultOverviewText; $si=new SearchInfo; if(SearchInitialize($si,$params->prefixString)==FALSE){ echo "\n
Error: cannot open database files.

"; return;} $si->bDemoVersion=GetSettingByteValue($si->settingsDB,BDEMO_OFF); $maxResults=GetSettingDoubleByteValue($si->settingsDB,MAXRESULTS_OFF); if($maxResultsCQUERYMAXQUERYSIZE){ $maxResults=CQUERYMAXQUERYSIZE;} if($params->count>CQUERYMAXSCREENSIZE){ $params->count=CQUERYMAXSCREENSIZE;} if($params->count==0){ $params->count=1;} $cSkipResults=$params->first; $string7=GetSettingStringValue($si->settingsDB,DEFAULTFRAME_OFF); $resultFormatText=GetSettingStringValue($si->settingsDB,RESULTFORMATTEXT_OFF); $contentPreviewBlockCount=GetSettingByteValue($si->settingsDB,CONTENTPREVIEWBLOCKCOUNT_OFF); $contentPreviewBlockSize=GetSettingByteValue($si->settingsDB,CONTENTPREVIEWBLOCKSIZE_OFF); $resultOverviewText=GetSettingStringValue($si->settingsDB,RESULTOVERVIEWTEXT_OFF); $minWordLen=GetSettingByteValue($si->settingsDB,MINLEN_OFF); $specialChars=GetSettingSpecialChars($si->settingsDB,SPECIALCHARACTERS_OFF); switch($params->sortType){ case SORT_URL: $sortFunc="ResultSortByURLName";break; case SORT_TYPE: $sortFunc="ResultSortByType";break; case SORT_SIZE: $sortFunc="ResultSortBySize";break; case SORT_DATE: $sortFunc="ResultSortByDate";break; default: $sortFunc="ResultSortByScore";break;} SearchStart($si,$params->queryString,$maxResults,$minWordLen,$specialChars,$params->searchFilter,$sortFunc); $totalResults=count($si->resultList); if($params->first>=$totalResults){ $params->first=0;} echo "\n"; if($totalResults==0){ echo "\n
"; echo GetSettingStringValue($si->settingsDB,FONT1STR_OFF); echo GetSettingStringValue($si->settingsDB,NORESULTSSTR_OFF); echo "."; echo GetSettingStringValue($si->settingsDB,FONT1ENDSTR_OFF);} else{ ProcessOverviewCode($maxResults,(int)($params->first/$params->count),$totalResults,$params, $resultOverviewText); $markerPos=strpos($resultOverviewText,'(resultcode)'); if($markerPos !==FALSE){ echo substr($resultOverviewText,0,$markerPos); $cCurrentResult=0; for($i=0;$iresultList)&&$cCurrentResult<$params->count;$i++){ $result=&$si->resultList [$i]; if($cSkipResults>0){ $cSkipResults=$cSkipResults-1;} else{ PrintNormalResult($si,$result,$cCurrentResult+1,$params->first); $cCurrentResult++;}} echo substr($resultOverviewText,$markerPos+12);}} if($params->first==0&&is_string($params->queryString)&&strlen($params->queryString)>0){ $logPath=GetSettingStringValue($si->settingsDB,LOG_OFF); if(is_string($logPath)&&strlen($logPath)>0){ $file=@fopen($logPath,"a+b"); if($file){ $now=time(); $l=localtime($now,TRUE); $line=sprintf("%02d.%02d.%04d %02d:%02d:%02d %d Q:%s\n",$l['tm_mday'],$l['tm_mon']+1,$l['tm_year']+1900,$l['tm_hour'],$l['tm_min'],$l['tm_sec'],$totalResults,$params->queryString); fwrite($file,$line); fclose($file);}}} SearchCleanup($si);} function GetHttpParam($name){ global $HTTP_GET_VARS; global $HTTP_POST_VARS; $val=@$HTTP_GET_VARS [$name]; if($val==NULL){ $val=@$HTTP_POST_VARS [$name];} return $val;} $query=GetHttpParam('q'); if($query==NULL){ $query='';} $query=stripslashes($query); $start=GetHttpParam('strt'); if($start==NULL){ $start=0;} $cnt=GetHttpParam('cnt'); if($cnt==0){ $cnt=10;} $pref=GetHttpParam('pref'); if($pref==NULL) $pref=''; $searchFilter=new SearchFilter; $searchFilter->prevValidDayCount=(int)GetHttpParam('pvdc'); $searchFilter->validDocTypes=(int)GetHttpParam('vdt'); $searchFilter->URLGroup=GetHttpParam('sec'); $scrName=@basename(PATH_THISSCRIPT); if(!$scrName) $scrName="sessearch.php"; $params=new SearchParams; $params->queryString=$query; $params->count=$cnt; $params->first=$start; $params->prefixString=$pref; $params->sortType=GetHttpParam('sort'); $params->searchFilter=$searchFilter; $params->scriptName=$scrName; if(!is_string($pref)|| !@include($pref . "header.htm")) include("header.htm"); PerformSearch($params); if(!is_string($pref)|| !@include($pref . "footer.htm")) include("footer.htm"); ?>