Code Coverage |
||||||||||
Classes and Traits |
Functions and Methods |
Lines |
||||||||
Total | |
0.00% |
0 / 1 |
|
73.33% |
11 / 15 |
CRAP | |
91.57% |
163 / 178 |
abstract_modelVirtual | |
0.00% |
0 / 1 |
|
73.33% |
11 / 15 |
67.53 | |
91.57% |
163 / 178 |
_getInstance | |
100.00% |
1 / 1 |
2 | |
100.00% |
4 / 4 |
|||
findMany | |
100.00% |
1 / 1 |
2 | |
100.00% |
4 / 4 |
|||
findManySimple | |
100.00% |
1 / 1 |
1 | |
100.00% |
1 / 1 |
|||
findOne | |
100.00% |
1 / 1 |
2 | |
100.00% |
4 / 4 |
|||
findOneSimple | |
100.00% |
1 / 1 |
1 | |
100.00% |
1 / 1 |
|||
query | |
0.00% |
0 / 1 |
7 | |
95.24% |
20 / 21 |
|||
explainSql | |
0.00% |
0 / 1 |
18.74 | |
60.00% |
18 / 30 |
|||
findListCritere | |
100.00% |
1 / 1 |
8 | |
100.00% |
23 / 23 |
|||
sortResult | |
0.00% |
0 / 1 |
9 | |
97.30% |
36 / 37 |
|||
findInTableWithCritere | |
0.00% |
0 / 1 |
8.02 | |
93.33% |
14 / 15 |
|||
getTabFromFile | |
100.00% |
1 / 1 |
4 | |
100.00% |
12 / 12 |
|||
setColumns | |
100.00% |
1 / 1 |
1 | |
100.00% |
2 / 2 |
|||
addObject | |
100.00% |
1 / 1 |
3 | |
100.00% |
8 / 8 |
|||
bind | |
100.00% |
1 / 1 |
5 | |
100.00% |
15 / 15 |
|||
erreur | |
100.00% |
1 / 1 |
1 | |
100.00% |
1 / 1 |
<?php | |
/* | |
This file is part of Mkframework. | |
Mkframework is free software: you can redistribute it and/or modify | |
it under the terms of the GNU Lesser General Public License as published by | |
the Free Software Foundation, either version 3 of the License. | |
Mkframework is distributed in the hope that it will be useful, | |
but WITHOUT ANY WARRANTY; without even the implied warranty of | |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
GNU Lesser General Public License for more details. | |
You should have received a copy of the GNU Lesser General Public License | |
along with Mkframework. If not, see <http://www.gnu.org/licenses/>. | |
*/ | |
/** | |
*classe abstract_modelVirtual | |
* @author Mika | |
* @link http://mkf.mkdevs.com/ | |
*/ | |
class abstract_modelVirtual{ | |
protected $tColumn; | |
protected $tLine; | |
protected $oCache; | |
public static $_toInstance=null; | |
public static function _getInstance($sClass){ | |
if(isset(self::$_toInstance[$sClass])==false){ | |
self::$_toInstance[$sClass]=new $sClass(); | |
} | |
return self::$_toInstance[$sClass]; | |
} | |
public function findMany($tSql,$sClassRow=null){ | |
$tRows=$this->query($this->bind($tSql),$sClassRow); | |
if(!$tRows){ | |
return null; | |
} | |
return $tRows; | |
} | |
public function findManySimple($tSql,$sClassRow=null){ | |
return $this->findMany($tSql,$sClassRow); | |
} | |
public function findOne($tSql,$sClassRow=null){ | |
$tRs=$this->query($this->bind($tSql),$sClassRow); | |
if(empty($tRs)){ | |
return null; | |
} | |
return $tRs[0]; | |
} | |
public function findOneSimple($tSql,$sClassRow=null){ | |
return $this->findOne($tSql,$sClassRow=null); | |
} | |
private function query($sReq,$sClassRow){ | |
//traitement de la requete $sReq | |
$sReq=trim($sReq); | |
$this->_sReq=$sReq; | |
if(substr($sReq,0,6)== 'SELECT'){ | |
$tReq=$this->explainSql($sReq); | |
//count | |
$bCount=false; | |
$iCount=0; | |
if(isset($tReq['select']) and preg_match('/COUNT\(/i',$tReq['select'])){ | |
$bCount=true; | |
} | |
$tCritere=$this->findListCritere($tReq); | |
$sTable=trim($tReq['from']); | |
$tObj=$this->findInTableWithCritere($sClassRow,$sTable,$tCritere); | |
//count | |
if($bCount){ | |
$iCount=count($tObj); | |
$o=new stdclass(); | |
$o->total=$iCount; | |
return array($o); | |
}else if(isset($tReq['order']) and $tObj!=null){ | |
return $this->sortResult($tObj,$tReq); | |
}else{ | |
return $tObj; | |
} | |
} | |
} | |
private function explainSql($sReq){ | |
if( | |
preg_match_all('/^SELECT(?<select>.*)FROM(?<from>.*)WHERE(?<where>.*)ORDER BY(?<order>.*)LIMIT(?<limit>.*)/i' | |
,$sReq,$tResult,PREG_SET_ORDER) | |
or | |
preg_match_all('/^SELECT(?<select>.*)FROM(?<from>.*)WHERE(?<where>.*)ORDER BY(?<order>.*)/i' | |
,$sReq,$tResult,PREG_SET_ORDER) | |
or | |
preg_match_all('/^SELECT(?<select>.*)FROM(?<from>.*)ORDER BY(?<order>.*)LIMIT(?<limit>.*)/i',$sReq,$tResult,PREG_SET_ORDER) | |
or | |
preg_match_all('/^SELECT(?<select>.*)FROM(?<from>.*)ORDER BY(?<order>.*)/i',$sReq,$tResult,PREG_SET_ORDER) | |
or | |
preg_match_all('/^SELECT(?<select>.*)FROM(?<from>.*)WHERE(?<where>.*)/i',$sReq,$tResult,PREG_SET_ORDER) | |
or | |
preg_match_all('/^SELECT(?<select>.*)FROM(?<from>.*)/i',$sReq,$tResult,PREG_SET_ORDER) | |
){ | |
if(isset($tResult[0]['where']) and preg_match('/ or /i',$tResult[0]['where'])){ | |
$this->erreur('Requete non supportee : '.$sReq); | |
}elseif(isset($tResult[0]['order']) and !preg_match('/\s[ASC|DESC]/i',trim($tResult[0]['order'])) ){ | |
$this->erreur('Il faut definir un sens de tri: ASC ou DESC dans la requete'.$sReq); | |
}else{ | |
return $tResult[0]; | |
} | |
}else{ | |
$msg="\n\n"; | |
$msg.="Le driver virtual gere les requetes de type : \n"; | |
$msg.="- SELECT liste_des_champs FROM ma_table WHERE champ=valeur ORDER BY champ DESC/ASC \n"; | |
$msg.="- SELECT liste_des_champs FROM ma_table ORDER BY champ DESC/ASC \n"; | |
$msg.="- SELECT liste_des_champs FROM ma_table WHERE champ=valeur \n"; | |
$msg.="- SELECT liste_des_champs FROM ma_table \n"; | |
$msg.=" la clause where accepte uniquement champ=valeur, champ!=valeur et AND \n"; | |
$this->erreur('Requete non supportee : '.$sReq.$msg); | |
} | |
} | |
private function findListCritere($tReq){ | |
$tCritere=array(); | |
if(isset($tReq['where'])){ | |
if(preg_match('/ and /i',$tReq['where'])){ | |
$tWhere=preg_split('/ AND /i',$tReq['where']); | |
foreach($tWhere as $sWhereVal){ | |
if(preg_match('/!=/',$sWhereVal)){ | |
list($sVar,$sVal)=preg_split('/!=/',$sWhereVal); | |
$tCritere[trim($sVar)]='!'.trim($sVal); | |
}elseif(preg_match('/=/',$sWhereVal)){ | |
list($sVar,$sVal)=preg_split('/=/',$sWhereVal); | |
$tCritere[trim($sVar)]='='.trim($sVal); | |
} | |
} | |
}else{ | |
if(preg_match('/!=/',$tReq['where'])){ | |
list($sVar,$sVal)=preg_split('/!=/',$tReq['where']); | |
$tCritere[trim($sVar)]='!'.trim($sVal); | |
}elseif(preg_match('/=/',$tReq['where'])){ | |
list($sVar,$sVal)=preg_split('/=/',$tReq['where']); | |
$tCritere[trim($sVar)]='='.trim($sVal); | |
} | |
} | |
} | |
return $tCritere; | |
} | |
private function sortResult($tObj,$tReq){ | |
list($sChamp,$sSens)=preg_split('/ /',trim($tReq['order'])); | |
$sSens=trim(strtoupper($sSens)); | |
if(!in_array($sChamp,$this->tColumn)){ | |
$this->erreur('Champ "'.$sChamp.'" inexistant dans cette table virtuelle, champs disponibles (sensible a la casse): '.implode(',',$this->tColumn).' (requete executee :"'.$this->_sReq.'" )'); | |
} | |
$tTri=array(); | |
$tIdObj=array(); | |
foreach($tObj as $i => $oObj){ | |
$tIdObj[ $i ]=$oObj; | |
$tTri[ $i ]=(string)$oObj->$sChamp; | |
} | |
if($sSens=='DESC'){ | |
arsort($tTri); | |
}else{ | |
asort($tTri); | |
} | |
if(isset($tReq['limit'])){ | |
list($iOffset,$iLimit)=preg_split('/,/',trim($tReq['limit'])); | |
$iOffset=(int)$iOffset; | |
$iLimit=(int)$iLimit; | |
$tOrderedObj=array(); | |
$tId= array_keys($tTri); | |
$i=-1; | |
$j=0; | |
foreach($tId as $id){ | |
$i++; | |
if($i < $iOffset){ continue;} | |
if($j>$iLimit){ break;} | |
$tOrderedObj[]=$tIdObj[$id]; | |
$j++; | |
} | |
}else{ | |
$tOrderedObj=array(); | |
$tId= array_keys($tTri); | |
foreach($tId as $id){ | |
$tOrderedObj[]=$tIdObj[$id]; | |
} | |
} | |
return $tOrderedObj; | |
} | |
private function findInTableWithCritere($sClassRow,$sTable,$tCritere){ | |
$tFile=$this->getTabFromFile($this->tLine); | |
$tObj=array(); | |
foreach($tFile as $oRow){ | |
foreach($tCritere as $sCritereField => $sCritereVal){ | |
if(!isset($oRow->$sCritereField) or | |
( | |
($sCritereVal[0]=='=' and (string)$sCritereVal!=(string)'='.$oRow->$sCritereField) | |
or | |
($sCritereVal[0]=='!' and (string)$sCritereVal==(string)'!'.$oRow->$sCritereField) | |
) | |
){ | |
continue 2; | |
} | |
} | |
$tObj[]=$oRow; | |
} | |
return $tObj; | |
} | |
public function getTabFromFile($tContent){ | |
$tHeader=$this->tColumn; | |
$tab=array(); | |
if($tContent){ | |
foreach($tContent as $i => $tLigne){ | |
$obj=new stdclass(); | |
foreach($tHeader as $i => $sHeader){ | |
$obj->$sHeader=$tLigne[$i]; | |
} | |
$tab[]=$obj; | |
} | |
} | |
return $tab; | |
} | |
public function setColumns($tColumn){ | |
$this->tColumn=$tColumn; | |
} | |
public function addObject($obj){ | |
foreach($this->tColumn as $i => $column){ | |
$tValue[$i]=null; | |
if(isset($obj->$column)){ | |
$tValue[$i]=$obj->$column; | |
} | |
} | |
$this->tLine[]=$tValue; | |
} | |
public function bind($tReq){ | |
$sReq=''; | |
if(is_array($tReq)){ | |
$sReq=$tReq[0]; | |
if(isset($tReq[1]) and is_array($tReq[1])){ | |
$tParam=$tReq[1]; | |
}else{ | |
unset($tReq[0]); | |
$tParam=array_values($tReq); | |
} | |
foreach($tParam as $sVal){ | |
$sVal=$this->quote($sVal); | |
$sReq=preg_replace('/[?]/',$sVal,$sReq,1); | |
} | |
}else{ | |
return $tReq; | |
} | |
return $sReq; | |
} | |
public function erreur($sErreur){ | |
throw new Exception($sErreur); | |
} | |
} |