Files
zurawik.pl/core/model/DefaultDAL.class.php
2026-05-15 18:33:51 +02:00

705 lines
21 KiB
PHP

<?php
/**
* Domyslna klasa DAL
*
* @author pawel
*/
abstract class DefaultDAL {
private static $cacheTime;
private static $cachePath;
private static $cacheId;
public static function DefaultRemoveDuplicate($objClassTable, $objClassTablePK,$optClassTableChangeArray, $changeDictionaryTo = null) {
$db = Registry::Get('db');
$db->BeginTransaction();
// znajdujemy wszytkie duplikaty od otrzymanego id
//pobieramy nazwe
$sql = "SELECT name FROM $objClassTable WHERE $objClassTablePK = $changeDictionaryTo";
$stmt = $db->prepare($sql)
->execute();
$array = $stmt->fetchAllAssoc();
$name = $array[0]['name'];
//znajdujemy wszytkie duplikaty tego sameogo pola
$sql = "SELECT $objClassTablePK FROM $objClassTable WHERE name = '$name' AND $objClassTablePK != $changeDictionaryTo";
$stmt = $db->prepare($sql)
->execute();
$array = $stmt->fetchAllAssoc();
// dodajemy wszytkie id tych samych rekordkow do tablicy
$idDuplicateArray = array();
for($i=0;$i<count($array);$i++) {
$idDuplicateArray[]=$array[$i][$objClassTablePK];
}
//var_dump($idDuplicateArray);
self::DefaultMoveDictionary($objClassTable, $objClassTablePK, $optClassTableChangeArray, $idDuplicateArray, $changeDictionaryTo);
$db->CommitTransaction();
}
public static function DefaultMoveDictionary($objClassTable, $objClassTablePK,$optClassTableChangeArray, $changeDictionary = array(), $changeDictionaryTo = null) {
$db = Registry::Get('db');
$db->BeginTransaction();
if(count($changeDictionary) > 0)
foreach($optClassTableChangeArray as $key => $value) {
// pierwsze zmienic wszytkie istnijace z changedictionary na docelowe
if($value == "nm_physician") {
$sql = "UPDATE $value SET $objClassTablePK=$changeDictionaryTo,reload=1 WHERE $objClassTablePK ";
}
else {
$sql = "UPDATE $value SET $objClassTablePK=$changeDictionaryTo WHERE $objClassTablePK ";
}
$in = "";
if(count($changeDictionary) == 1) {
$sql .= " = " . $changeDictionary[0];
}
else if(count($changeDictionary) > 1) {
$sql .= " IN (";
foreach($changeDictionary as $key => $value) {
$in.=$value . ", ";
}
$in = substr($in, 0, strlen($in)-2);
$sql.=$in;
$sql.=")";
}
$stmt = $db->prepare($sql)
->execute();
}
//usuniecie wszytkich z changedictionary
if(count($changeDictionary) > 0)
foreach($changeDictionary as $key => $value) {
$dalData = new DalData();
$dalData->setObjClassTable($objClassTable);
$dalData->setObjClassTablePK($objClassTablePK);
$dalData->setObj($value);
self::DefaultDelete($dalData);
}
$db->CommitTransaction();
}
/**
*
* Znajduje duplikaty (takie same pola w tabeli slowników)
*
* @param <type> $optClass
* @param <type> $objClassTable
* @param <type> $objClassName
*/
public static function DefaultFindDuplicate($optClass, $objClassTable, $objClassName,$duplicateField) {
$db = Registry::Get('db');
$queryCacheName = $objClassName. "_" .__FUNCTION__. "_" .md5($objClassTable);
if(QUERYCACHE_ENABLE==true && isset(QueryCacheTemp::$cacheQuery[$queryCacheName])) {
$sql = QueryCacheTemp::$cacheQuery[$queryCacheName];
}
else {
$select =" " . SQL::ToSelect($optClass) . " , count($duplicateField) as countField ";
$sql = " SELECT $select FROM " . $objClassTable . " WHERE 1=1";
$q = new QueryCache($queryCacheName,$sql);
}
$sql.=" GROUP BY $duplicateField HAVING countField>1";
/*
$sql .= ( $sortBy ? " ORDER BY $sortBy " : "").
( $limit ? " LIMIT " . $limit : "").
" ";
*/
$stmt = $db->prepare($sql)
->execute();
$array = $stmt->fetchAllAssoc();
$done = array();
for($i=0;$i<count($array);$i++) {
$className=$objClassName;
$obj = new $className();
$obj->FromArray($array[$i],1);
$obj->setCountField($array[$i]['countField']);
$done[] = $obj;
}
return $done;
}
/**
* Wykonanie zapytania
*
* @param klasa opcjonalna $optClass
* @param tablica $objClassTable
* @param nazwa klasy $objClassName
* @param tablica pol do where $data
* @param tablica pol do zapytania $queryFields
* @param limit do zapytania $limit
* @param sortowanie do zapytania $sortBy
* @param opcjonalna liczba rekordow w odpowiedzi(true/false) $count
* @return array
*/
public static function DefaultGetResult(DalData $dalObj, $showSql = null) {
//Utils::ArrayDisplay($dalObj);
if(!self::CacheControll($dalObj)) {
$joinString = null;
$selectString = null;
if(is_array($dalObj->getJoin())) {
foreach($dalObj->getJoin() as $key => $value) {
if(trim(SQL::ToSelect($key,$dalObj->getQueryFields())) != "")
$selectString .="," . SQL::ToSelect($key,$dalObj->getQueryFields());
$joinString .= $value;
}
}
$db = Registry::Get($dalObj->getDatabaseType());
$queryCacheName = $dalObj->getObjClassName(). "_" . $dalObj->getObjClassTable() . "_" .__FUNCTION__. "_" .md5(implode($dalObj->getQueryFields()));
if($dalObj->getCount() == true)
$queryCacheName .="_count";
if(Config::Get('QUERYCACHE_ENABLE')==true && isset(QueryCacheTemp::$cacheQuery[$queryCacheName])) {
$sql = QueryCacheTemp::$cacheQuery[$queryCacheName];
}
else {
if($dalObj->getCount() == true)
$select = "count(*) as count";
else
$select =" " . SQL::ToSelect($dalObj->getOptClass(),$dalObj->getQueryFields()) . " " . $selectString . " " . $dalObj->getSelectFieldsQuery();
$sql = " SELECT $select FROM " . $dalObj->getObjClassTable() . " " . $joinString . " WHERE 1=1 ";
$q = new QueryCache($queryCacheName,$sql);
}
foreach ($dalObj->getCondition() as $key => $value) {
if($key == "id")
$key = "id_" . $dalObj->getObjClassTable();
if(is_array($value))
$sql .= ( is_numeric($value['value']) || $value ? " AND ".$key." ".$value['condition']." ". $value['value'] : "");
else
$sql .= ( is_numeric($value) || $value ? " AND ".$key." = '". $value ."'" : "");
}
$sql .=
( trim($dalObj->getGroupBy() ?? '') ? " GROUP BY " . $dalObj->getGroupBy() : "").
( trim($dalObj->getSortBy() ?? '') ? " ORDER BY " . $dalObj->getSortBy() : "").
( $dalObj->getLimit() ? " LIMIT " . $dalObj->getLimit() : "").
" ";
try {
$stmt = $db->prepare($sql);
if($dalObj->getCacheTime()>0) {
$stmt->CacheStart($dalObj->getCacheTime());
}
} catch(MysqlException $e) {
if ($showSql) {
Utils::ArrayDisplay($sql);
}
}
if ($showSql) {
Utils::ArrayDisplay($sql);
}
//Utils::ArrayDisplay($stmt);
$stmt->execute();
//Utils::ArrayDisplay($stmt);
$array = $stmt->fetchAllAssoc();
if($dalObj->getCount() == true)
return $array[0]['count'];
$done = array();
for($i=0;$i<count($array);$i++) {
$className=$dalObj->getObjClassName();
$obj = new $className();
$obj->FromArray($array[$i],1);
foreach($dalObj->getSelectFields() as $key => $value) {
$func = "set" . $key;
$obj->$func($array[$i][$key]);
}
if(is_array($dalObj->getJoin()))
foreach ($dalObj->getJoin() as $key => $value) {
$objArray = new $key();
$objArray->FromArray($array[$i],1);
$strFunciton="set" . $key;
$obj->$strFunciton($objArray);
}
$done[] = $obj;
}
if($dalObj->getCacheObject()) {
self::CacheWriter($done);
}
return $done;
} else {
return self::CacheReader();
}
}
public static function DefaultGetResultByLink(DalData $dalObj) {
if(!self::CacheControll($dalObj)) {
$joinString = null;
$selectString = null;
if(is_array($dalObj->getJoin())) {
foreach($dalObj->getJoin() as $key => $value) {
if(trim(SQL::ToSelect($key,$dalObj->getQueryFields())) != "")
$selectString .="," . SQL::ToSelect($key,$dalObj->getQueryFields());
$joinString .= $value;
}
}
$db = Registry::Get($dalObj->getDatabaseType());
$queryCacheName = $dalObj->getObjClassName(). "_" . $dalObj->getObjClassTable() . "_" .__FUNCTION__. "_" .md5(implode($dalObj->getQueryFields()));
if($dalObj->getCount() == true)
$queryCacheName .="_count";
if(Config::Get('QUERYCACHE_ENABLE')==true && isset(QueryCacheTemp::$cacheQuery[$queryCacheName])) {
$sql = QueryCacheTemp::$cacheQuery[$queryCacheName];
}
else {
if($dalObj->getCount() == true)
$select = "count(*) as count";
else
$select =" " . SQL::ToSelect($dalObj->getOptClass(),$dalObj->getQueryFields()) . " " . $selectString . " " . $dalObj->getSelectFieldsQuery();
if(is_array($dalObj->getDataArray('mf_link_id')))
$select .= ", " . 'mf_link.id_source as id_source';
}
//in do pobierania kliku
if(!is_array($dalObj->getDataArray('mf_link_id')))
{
if ($dalObj->getDataArray('mf_link_destination') != false)
$sql = " SELECT $select FROM " . $dalObj->getObjClassTable() ." INNER JOIN mf_link ON " . $dalObj->getObjClassTable() . "." . $dalObj->getObjClassTablePK() . "=mf_link.id_destination AND mf_link.destination_type='" . $dalObj->getObjClassTable() . "' AND mf_link.source_type='" . $dalObj->getDataArray('mf_link_table') . "' AND mf_link.id_source=" . $dalObj->getDataArray('mf_link_id');
else
$sql = " SELECT $select FROM " . $dalObj->getObjClassTable() ." INNER JOIN mf_link ON " . $dalObj->getObjClassTable() . "." . $dalObj->getObjClassTablePK() . "=mf_link.id_source AND mf_link.source_type='" . $dalObj->getObjClassTable() . "' AND mf_link.destination_type='" . $dalObj->getDataArray('mf_link_table') . "' AND mf_link.id_destination=" . $dalObj->getDataArray('mf_link_id');
}
else
{
if ($dalObj->getDataArray('mf_link_destination') != false)
$sql = " SELECT $select FROM " . $dalObj->getObjClassTable() ." INNER JOIN mf_link ON " . $dalObj->getObjClassTable() . "." . $dalObj->getObjClassTablePK() . "=mf_link.id_destination AND mf_link.destination_type='" . $dalObj->getObjClassTable() . "' AND mf_link.source_type='" . $dalObj->getDataArray('mf_link_table') . "' AND mf_link.id_source IN(" . implode(",", $dalObj->getDataArray('mf_link_id')) . ")";
else
$sql = " SELECT $select FROM " . $dalObj->getObjClassTable() ." INNER JOIN mf_link ON " . $dalObj->getObjClassTable() . "." . $dalObj->getObjClassTablePK() . "=mf_link.id_source AND mf_link.source_type='" . $dalObj->getObjClassTable() . "' AND mf_link.destination_type='" . $dalObj->getDataArray('mf_link_table') . "' AND mf_link.id_destination IN(" . implode(",", $dalObj->getDataArray('mf_link_id')) . ")";
}
$sql .= " " . $joinString . " WHERE 1=1 ";
foreach ($dalObj->getCondition() as $key => $value) {
if($key == "id")
$key = "id_" . $dalObj->getObjClassTable();
if(is_array($value))
$sql .= ( is_numeric($value['value']) || $value ? " AND ".$key." ".$value['condition']." ". $value['value'] : "");
else
$sql .= ( is_numeric($value) || $value ? " AND ".$key." = '". $value ."'" : "");
}
$sql .=
( trim($dalObj->getGroupBy()) ? " GROUP BY " . $dalObj->getGroupBy() : "").
( trim($dalObj->getSortBy()) ? " ORDER BY " . $dalObj->getSortBy() : "").
( $dalObj->getLimit() ? " LIMIT " . $dalObj->getLimit() : "").
" ";
try {
$stmt = $db->prepare($sql);
if($dalObj->getCacheTime()>0) {
$stmt->CacheStart($dalObj->getCacheTime());
}
} catch(MysqlException $e) {
}
$stmt->execute();
$array = $stmt->fetchAllAssoc();
if($dalObj->getCount() == true)
return $array[0]['count'];
$done = array();
for($i=0;$i<count($array);$i++) {
$className=$dalObj->getObjClassName();
$obj = new $className();
$obj->FromArray($array[$i],1);
foreach($dalObj->getSelectFields() as $key => $value) {
$func = "set" . $key;
$obj->$func($array[$i][$key]);
}
if(is_array($dalObj->getJoin()))
foreach ($dalObj->getJoin() as $key => $value) {
$objArray = new $key();
$objArray->FromArray($array[$i],1);
$strFunciton="set" . $key;
$obj->$strFunciton($objArray);
}
if(is_array($dalObj->getDataArray('mf_link_id')))
$done[$array[$i]['id_source']] = $obj;
else
$done[$obj->GetId()] = $obj;
}
if($dalObj->getCacheObject()) {
self::CacheWriter($done);
}
return $done;
} else {
return self::CacheReader();
}
}
public static final function CacheControll(DalData $dalObj) {
if($dalObj->getCacheObject()) {
self::$cachePath = Config::Get('DBCACHE_PATH').'DAL/';
self::$cacheTime = $dalObj->getCacheTime();
self::$cacheId = md5(serialize($dalObj));
if(is_file(self::$cachePath.self::$cacheId) && filemtime(self::$cachePath.self::$cacheId) > (time() - self::$cacheTime)) {
return true;
} else {
return false;
}
} else {
return false;
}
}
public static final function CacheWriter($data) {
$records = serialize($data);
$fp = fopen(self::$cachePath.self::$cacheId, "w");
fputs($fp, $records);
fclose($fp);
}
public static final function CacheReader() {
return unserialize(file_get_contents(self::$cachePath.self::$cacheId));
}
/**
* Dodanie rekordu
*
* @param nazwa tablicy $objClassTable
* @param obiekt $obj
* @return integer
*/
public static function DefaultInsert(DalData $dalObj) {
$db = Registry::Get($dalObj->getDatabaseType());
if(!is_numeric($dalObj->getObj()->getId()) || $dalObj->getObj()->getId() == -1)
$dalObj->getObj()->SetId('NULL');
$sql = "INSERT INTO " . $dalObj->getObjClassTable() . " (".SQL::ToInsertFields($dalObj->getObj()).") VALUES (" . SQL::ToInsertValues($dalObj->getObj()).")";
//Utils::ArrayDisplay($sql);
$stmt = $db->prepare($sql)->execute();
return $stmt->GetInsertionId();
}
/**
* Aktualizacja rekordu
*
* @param nazwa tablicy $objClassTable
* @param primary key tablicy $objClassTablePK
* @param aktualizowany obiekt $obj
*/
public static function DefaultUpdate(DalData $dalObj) {
$db = Registry::Get($dalObj->getDatabaseType());
$sql = "UPDATE " . $dalObj->getObjClassTable() . " SET ". SQL::ToUpdateSet($dalObj->getObj()) ." WHERE " . $dalObj->getObjClassTablePK() ."=:*#1#* ";
$stmt=$db->prepare($sql)
->bindParam('*#1#*', $dalObj->getObj()->GetId());
$stmt->execute();
//Utils::ArrayDisplay($dalObj->getObj()->GetId());
//Utils::ArrayDisplay($sql);
return $dalObj->getObj()->GetId();
}
/**
* Aktualizacja rekordu
*
* @param nazwa tablicy $objClassTable
* @param primary key tablicy $objClassTablePK
* @param tablica pol i wartosci $array
* @param id elementu $id
*/
public static function UpdateField(DalData $dalObj) {
$db = Registry::Get($dalObj->getDatabaseType());
$sql=array();
foreach($dalObj->getUpdateFileldArray() as $key => $value) {
$sql[] = $key."='".$db->Escape($value)."'";
}
$sql = "UPDATE " . $dalObj->getObjClassTable() . " SET ". implode(',', $sql) ." WHERE " . $dalObj->getObjClassTablePK() ."=:*#1#* ";
$stmt=$db->prepare($sql)
->bindParam('*#1#*', $dalObj->getUpdateFieldId());
$stmt->execute();
//Utils::ArrayDisplay($sql);
return $dalObj->getUpdateFieldId();
}
/**
* Usuniecie rekordu
*
* @param nazwa tablicy $objClassTable
* @param primary key tablicy $objClassTablePK
* @param identyfikator rekordu $id
*/
public static function DefaultDelete(DalData $dalObj) {
$db = Registry::Get($dalObj->getDatabaseType());
$obj = $dalObj->getObj();
$sql = "DELETE FROM " . $dalObj->getObjClassTable() . " WHERE " . $dalObj->getObjClassTablePK() . "=:1";
$stmt=$db->prepare($sql)
->bindParam(1, $obj->getId())
->execute();
// Utils::ArrayDisplay($dalObj);
// Utils::ArrayDisplay($sql);
}
/**
* Usuniecie rekordu(obiektu) przy porownaniu wszystkich pol
*
* @param nazwa tablicy $objClassTable
* @param primary key tablicy $objClassTablePK
* @param identyfikator rekordu $id
*/
public static function DefaultExactDelete(DalData $dalObj) {
$db = Registry::Get($dalObj->getDatabaseType());
$sql = "DELETE FROM " . $dalObj->getObjClassTable() . " WHERE " . SQL::ToDeleteSet($dalObj->getObj());
$stmt=$db->prepare($sql)
->execute();
}
/**
* Usuniecie rekordu po nazwie pola
*
* @param nazwa tablicy $objClassTable
* @param nazwa pola $field_name
* @param identyfikator rekordu $id_mf_user
*/
public static function DefaultDeleteByField(DalData $dalObj) {
$db = Registry::Get($dalObj->getDatabaseType());
$sql = "DELETE FROM " . $dalObj->getObjClassTable() . " WHERE " . $dalObj->getFieldName() . " =:1";
$stmt=$db->prepare($sql)
->bindParam(1, $dalObj->getId())
->execute();
//Utils::ArrayDisplay($sql);
}
/**
* Zwraca obiekt po numerze id
*
* @param nazwa opcjonalnej klasy $optClass
* @param nazwa tablicy $objClassTable
* @param nazwa klasy $objClassName
* @param nazwa pola primary key $objClassTablePK
* @param id rekordu $id
* @return obj
*/
public static function DefaultGetById(DalData $dalObj) {
$dalObj->setUpdateFileldArray(array($dalObj->getObjClassTablePK()=>$dalObj->getId()));
$dalObj->setLimit(1);
$result = self::DefaultGetResult($dalObj);
if(isset($result[0]) && is_object($result[0])) {
return $result[0];
} else {
throw new UserException('Brak rekordu w tablicy '.$dalObj->getObjClassTable().' o id <b>'.$dalObj->getId().'</b>!');
}
}
/**
* Zapisanie lub aktualizacja obiektu
*
* @param nazwa tablicy $objClassTable
* @param nazwa pola primary key $objClassTablePK
* @param aktualizoawny obiekt $obj
*/
public static function DefaultSave(DalData $dalObj) {
if($dalObj->getObj()->GetId()=='-1') {
return self::DefaultInsert($dalObj);
} else {
return self::DefaultUpdate($dalObj);
}
}
public static function DefaultGetByTag(DalData $dalObj) {
$dalObj->setCondition(array($dalObj->getObjClassTablePK()=>'mf_link.id_destination', 'mf_link.destination_type'=>$dalObj->getObjClassTable(), 'wp_tag.id_wp_tag'=>'mf_link.id_source', 'mf_link.source_type'=>'wp_tag'));
$dalObj->setJoin(array('wp_tag', 'mf_link'));
return self::DefaultGetResult($dalObj);
}
public static function DefaultGetByTagSuggest(DalData $dalObj) {
$dalObj->setCondition(array($dalObj->getObjClassTablePK()=>'mf_link.id_destination', 'mf_link.destination_type'=>$dalObj->getObjClassTable(), 'wp_tag_suggest.id_wp_tag_suggest'=>'mf_link.id_source', 'mf_link.source_type'=>'wp_tag_suggest'));
$dalObj->setJoin(array('wp_tag_suggest', 'mf_link'));
return self::DefaultGetResult($dalObj);
}
public static abstract function Save($obj);
//public static abstract function Insert($obj);
//public static abstract function Update($obj);
//public static abstract function Delete($id);
public static abstract function GetById($id);
public static abstract function GetDalDataObj();
/**
* Generator kodu JavaScript
*
* @param array $array
* @param nazwa javascriptowa $jsName
* @return string
*/
public static function ToJavaScriptArray($array, $jsName) {
$js = "new Array(); \n";
foreach($array as $key => $value) {
$js .= $jsName . "[" . $key . "] = '" . $value . "'; \n";
}
return $js;
}
/**
* funkcja do js'a
*
* @param unknown_type $array
* @return unknown
*/
public static function DirectArray($array) {
$js = "new Array(";
foreach($array as $value) {
$js .= "'$value',";
}
$js = substr($js, 0, -1);
$js .= ")";
return $js;
}
/*
* Tworzy w katalogu temp klasy plik do zliczenia metoda DefaultFileCounterCountAndClean()
*/
public static function DefaultFileCounterAppend($objClassName, $id) {
$data['id'] = $id;
$validator = new Validator($data);
//$validator->setValues($data);
$validator->IsNumber('id', 'Nie jest numerkiem!');
if(!$validator->IsError()) {
// Utils::Mkdirs(Config::Get('PATH_TEMP').'/DAL/'.$objClassName);
// $fp = fopen(Config::Get('PATH_TEMP').'/DAL/'.$objClassName.'/'.$id.'_'.microtime(), "w");
// fputs($fp, ' ');
// fclose($fp);
if(Enviroment::CheckMemcache()) {
if(!MfMemcache::exists($objClassName)) {
MfMemcache::set($objClassName, array());
}
$memcacheContent = MfMemcache::get($objClassName);
if(isset($memcacheContent[$id])) {
$newValue = ++$memcacheContent[$id];
$memcacheContent[$id] = $newValue;
} else {
$memcacheContent[$id] = 1;
}
MfMemcache::replace($objClassName, $memcacheContent);
}
}
}
/*
* Zwraca tablice z liczba id w katalogu temp klasy oraz usuwa pliki
*/
public static function DefaultFileCounterCountAndClean($objClassName) {
echo"mem";
if(Enviroment::CheckMemcache()) {echo "memcache1";
if(MfMemcache::exists($objClassName)) {echo"memcache2";
$validator = new Validator(array());
$memcacheContent = MfMemcache::get($objClassName);
print_R($memcacheContent);
foreach($memcacheContent as $id => $count) {
if($count>0) {
$data['id'] = $id;
$validator->setValues($data);
$validator->IsNumber('id', 'Nie jest numerkiem!');
if(!$validator->IsError()) {
$obj = WpCounterMemcacheDAL::GetResult(array('content_type'=>$objClassName, 'content_id'=>$id, 'time'=>date("Y-m-d")));
if(isset($obj[0]) && is_object($obj[0])) {
$counter = $obj[0];
} else {
$counter = new WpCounterMemcache();
$counter->SetContentId($id);
$counter->SetContentType($objClassName);
$counter->SetTime(date("Y-m-d"));
}
$counter->SetCount(($counter->GetCount()+$count));
WpCounterMemcacheDAL::Save($counter);
} else { echo $id . "nie jest numerkiem!<br />";}
}
}
MfMemcache::remove($objClassName);
}
}
//return $counterData;
}
}
?>