_errorNum = 1;
$this->_errorMsg = 'The MySQL adapter "mysql" is not available.';
return;
}
// connect to the server
$this->_resource = & $db->_resource;
// finalize initialization
JDatabase::__construct($options);
// select the database
if ( $select ) {
$this->select($database);
}
}
function _getFieldCount(){
if (!is_resource($this->_cursor)){
// This is a serious problem since we do not have a valid db connection
// or there is an error in the query
if ($this->getErrorNum()>0){
echo JText::_("No valid database connection")." ".$this->getErrorMsg()."
";
}
return 0;
}
$fields = mysql_num_fields($this->_cursor);
return $fields;
}
function _getFieldMetaData($i){
$meta = mysql_fetch_field($this->_cursor, $i);
return $meta;
}
function fillRefTableCache($cacheDir,$cacheFile){
$pfunc = $this->_profile();
$cacheFileContent = serialize($this->_refTables);
JFile::write($cacheFile,$cacheFileContent);
// clean out old cache files
// This could be very slow for long list of old files -
// TODO store in database instead
$this->cleanRefTableCache($cacheDir);
$pfunc = $this->_profile($pfunc);
}
function cleanRefTableCache($cacheDir){
$pfunc = $this->_profile();
$files =JFolder::files($cacheDir);
foreach ($files as $file) {
if (($file != '.') && ($file != '..')) {
$file = "$cacheDir/$file";
if (JFile::exists($file) && @filemtime($file) < $this->cacheExpiry) {
if (!JFile::delete($file)) {
echo "problems clearing cache file $file";
}
}
}
}
$pfunc = $this->_profile($pfunc);
return true;
}
function _logSetRefTablecache($action,$tempsql,$sql_exNos,$sqlHash){
$pfunc = $this->_profile();
$logfile = dirname(__FILE__)."/qalog.txt";
$handle = fopen($logfile,"ab");
// replace tabs and carriage returns with spaces
fwrite($handle,"$action ");
fwrite($handle,preg_replace("/([\t\n\r\f])/"," ",$tempsql));
fwrite($handle," #@�^�@# ");
fwrite($handle,preg_replace("/([\t\n\r\f])/"," ",$sql_exNos));
fwrite($handle," #@�^�@# ");
fwrite($handle,preg_replace("/([\t\n\r\f])/"," ",$sqlHash));
fwrite($handle," # JF LINE END# \n");
fclose($handle);
$pfunc = $this->_profile($pfunc);
}
function setRefTables(){
$pfunc = $this->_profile();
// Before joomfish manager is created since we can't translate so skip this anaylsis
global $_JOOMFISH_MANAGER;
if (!$_JOOMFISH_MANAGER) return;
// This could be speeded up by the use of a cache - but only of benefit is global caching is off
$tempsql = $this->_sql;
// only needed for selects at present - possibly add for inserts/updates later
if (strpos(strtoupper($tempsql),"SELECT")===false) {
$pfunc = $this->_profile($pfunc);
return;
}
// Ignore Joomfish translation query
if (strpos($tempsql,"SELECT jf_content.reference_field, jf_content.value")===0){
$pfunc = $this->_profile($pfunc);
return;
}
$config =& JFactory::getConfig();
jimport('joomla.client.helper');
$FTPOptions = JClientHelper::getCredentials('ftp');
// we won't use this caching if FTP layer ie enabled
if ($_JOOMFISH_MANAGER->getCfg("qacaching",1) && $FTPOptions['enabled'] == 1){
$cachepath = JPATH_CACHE;
$cachetime = $config->getValue('config.cachetime',0);
// remove time formats (assume all numbers are not necessay - this is experimental
// for example table names or column names could contain numbers
// so this version only replaces numbers not adjacent to alpha characters i.e.field2 doesn't become field
$sql_exNos = preg_replace("/(?![a-z])(.)([0-9]+)(?![a-z]+)/i",'${1}',$tempsql);
$sql_exNos = preg_replace("/(?![a-z]).([0-9]+)$/i",'${1}',$sql_exNos);
if ( $config->getValue('config.debug',0)) {
echo "
setRefTables debug:
"
. "tempsql = $tempsql
"
. "sql_exNos = $sql_exNos"
. "
";
}
$sqlHash = md5($sql_exNos );
$this->cacheExpiry = time() - $cachetime;
$cacheDir = "$cachepath/refTableSQL";
if (!JFolder::exists($cacheDir)) JFolder::create($cacheDir);
$cacheFile = "$cacheDir/$sqlHash";
if (JFile::exists($cacheFile) && @filemtime($cacheFile) > $this->cacheExpiry) {
$cacheFileContent = JFile::read($cacheFile);
$this->_refTables = unserialize($cacheFileContent);
if ($_JOOMFISH_MANAGER->getCfg("qalogging",0)){
$this->_logSetRefTablecache("r",$tempsql,$sql_exNos,$sqlHash);
}
$pfunc = $this->_profile($pfunc);
return;
}
if($this->_cursor===true || $this->_cursor===false) {
if ($_JOOMFISH_MANAGER->getCfg("qalogging",0)){
$this->_logSetRefTablecache("wtf",$tempsql,$sql_exNos,$sqlHash);
}
$this->fillRefTableCache($cacheDir,$cacheFile);
$pfunc = $this->_profile($pfunc);
return;
}
}
// get column metadata
$fields = $this->_getFieldCount();
//print "
$tempsql $this->_cursor $fields";
if ($_JOOMFISH_MANAGER->getCfg("qacaching",1) && $FTPOptions['enabled'] == 1){
if ($fields<=0) {
if ($_JOOMFISH_MANAGER->getCfg("qalogging",0)){
$this->_logSetRefTablecache("w0f",$tempsql,$sql_exNos,$sqlHash);
}
$this->fillRefTableCache($cacheDir,$cacheFile);
$pfunc = $this->_profile($pfunc);
return;
}
}
if ($fields<=0) {
$pfunc = $this->_profile($pfunc);
return;
}
$this->_refTables=array();
$this->_refTables["fieldTablePairs"]=array();
$this->_refTables["tableAliases"]=array();
$this->_refTables["reverseTableAliases"]=array();
$this->_refTables["fieldAliases"]=array();
$this->_refTables["fieldTableAliasData"]=array();
$this->_refTables["fieldCount"]=$fields;
$this->_refTables["sql"]=$tempsql;
// local variable to keep track of aliases that have already been analysed
$tableAliases = array();
for ($i = 0; $i < $fields; ++$i) {
$meta = $this->_getFieldMetaData($i);
if (!$meta) {
echo "No information available
\n";
}
else {
$tempTable = $meta->table;
// if I have already found the table alias no need to do it again!
if (array_key_exists($tempTable,$tableAliases)){
$value = $tableAliases[$tempTable];
}
// mysli only
else if (isset($meta->orgtable)){
$value = $meta->orgtable;
if (isset($this->_table_prefix) && strlen($this->_table_prefix)>0 && strpos($meta->orgtable,$this->_table_prefix)===0) $value = substr($meta->orgtable, strlen( $this->_table_prefix));
$tableAliases[$tempTable] = $value;
}
else {
if (!isset($tempTable) || strlen($tempTable)==0) {
continue;
}
//echo "
Information for column $i of ".($fields-1)." ".$meta->name." : $tempTable=";
$tempArray=array();
$prefix = $this->_table_prefix;
preg_match_all("/$prefix(\w*)\s+AS\s+`?".$tempTable."`?[,\s]/i",$this->_sql, $tempArray, PREG_PATTERN_ORDER);
if (count($tempArray)>1 && count($tempArray[1])>0) $value = $tempArray[1][0];
else $value = null;
if (isset($this->_table_prefix) && strlen($this->_table_prefix)>0 && strpos($tempTable,$this->_table_prefix)===0) $tempTable = substr($tempTable, strlen( $this->_table_prefix));
$value = $value?$value:$tempTable;
$tableAliases[$tempTable]=$value;
}
if ((!($value=="session" || strpos($value,"jf_")===0)) && $this->translatedContentAvailable($value)){
/// ARGH !!! I must also look for aliases for fieldname !!
if (isset($meta->orgname)){
$nameValue = $meta->orgname;
}
else {
$tempName = $meta->name;
$tempArray=array();
preg_match_all("/`?(\w*)`?\s+AS\s+`?".$tempName."`?[,\s]/i",$this->_sql, $tempArray, PREG_PATTERN_ORDER);
if (count($tempArray)>1 && count($tempArray[1])>0) {
//echo "$meta->name is an alias for ".$tempArray[1][0]."
";
$nameValue = $tempArray[1][0];
}
else $nameValue = $meta->name;
}
if (!array_key_exists($value,$this->_refTables["tableAliases"])) $this->_refTables["tableAliases"][$value]=$meta->table;
if (!array_key_exists($meta->table,$this->_refTables["reverseTableAliases"])) $this->_refTables["reverseTableAliases"][$meta->table]=$value;
// I can't use the field name as the key since it may not be unique!
if (!in_array($value,$this->_refTables["fieldTablePairs"])) $this->_refTables["fieldTablePairs"][]=$value;
if (!array_key_exists($nameValue,$this->_refTables["fieldAliases"])) $this->_refTables["fieldAliases"][$meta->name]=$nameValue;
// Put all the mapping data together so that everything is in sync and I can check fields vs aliases vs tables in one place
$this->_refTables["fieldTableAliasData"][$i]=array("fieldNameAlias"=>$meta->name, "fieldName"=>$nameValue,"tableNameAlias"=>$meta->table,"tableName"=>$value);
}
}
}
if ($_JOOMFISH_MANAGER->getCfg("qacaching",1) && $fields>1 && $FTPOptions['enabled'] == 1){
if ($_JOOMFISH_MANAGER->getCfg("qalogging",0)){
$this->_logSetRefTablecache("wn",$tempsql,$sql_exNos,$sqlHash);
}
$this->fillRefTableCache($cacheDir,$cacheFile);
}
$pfunc = $this->_profile($pfunc);
}
}
?>