%PDF- %PDF-
| Direktori : /www/varak.net/mail2.varak.net_old/libraries/afterlogic/common/ |
| Current File : //www/varak.net/mail2.varak.net_old/libraries/afterlogic/common/container.php |
<?php
/*
* Copyright 2004-2014, AfterLogic Corp.
* Licensed under AGPLv3 license or AfterLogic license
* if commercial version of the product was purchased.
* See the LICENSE file for a full license statement.
*/
/**
* @package Api
*/
abstract class api_AContainer
{
const SESSION_CONTAINER_PREFIX = 'sess_object_container';
/**
* @var bool
*/
public $__USE_TRIM_IN_STRINGS__;
/**
* @var string
*/
protected $sParentClassName;
/**
* @var string
*/
protected $sSessionUniqueProperty;
/**
* @var array
*/
protected $aContainer;
/**
* @var array
*/
protected $aObsolete;
/**
* @var array
*/
protected $aTrimer;
/**
* @var array
*/
protected $aLower;
/**
* @var array
*/
protected $aUpper;
/**
* @param string $sParentClassName
* @param string $sSessionUniqueProperty = ''
*/
public function __construct($sParentClassName, $sSessionUniqueProperty = '')
{
$this->__USE_TRIM_IN_STRINGS__ = false;
$this->sParentClassName = $sParentClassName;
$this->sSessionUniqueProperty = $sSessionUniqueProperty;
$this->aContainer = array();
$this->aObsolete = array();
$this->aTrimer = array();
$this->aLower = array();
$this->aUpper = array();
}
/**
* @param array $aValues
* @return void
*/
public function SetDefaults($aValues)
{
$this->MassSetValues($aValues);
$this->FlushObsolete();
}
/**
* @param array $aValues
* @return void
*/
public function SetTrimer($aValues)
{
$this->aTrimer = $aValues;
}
/**
* @param array $aValues
* @return void
*/
public function SetLower($aValues)
{
$this->aLower = $aValues;
}
/**
* @param array $aValues
* @return void
*/
public function SetUpper($aValues)
{
$this->aUpper = $aValues;
}
/**
* @param array $aValues
* @return void
*/
public function MassSetValues($aValues)
{
foreach ($aValues as $sKey => $mValue)
{
$this->{$sKey} = $mValue;
}
}
/**
* @param stdClass $oRow
*/
public function InitByDbRow($oRow)
{
$aMap = $this->GetMap();
foreach ($aMap as $sKey => $aTypes)
{
if (isset($aTypes[1]) && property_exists($oRow, $aTypes[1]))
{
if ('password' === $aTypes[0])
{
$this->{$sKey} = api_Utils::DecodePassword($oRow->{$aTypes[1]});
}
else if ('datetime' === $aTypes[0])
{
$iDateTime = 0;
$aDateTime = api_Utils::DateParse($oRow->{$aTypes[1]});
if (is_array($aDateTime))
{
$iDateTime = gmmktime($aDateTime['hour'], $aDateTime['minute'], $aDateTime['second'],
$aDateTime['month'], $aDateTime['day'], $aDateTime['year']);
if (false === $iDateTime || $iDateTime <= 0)
{
$iDateTime = 0;
}
}
$this->{$sKey} = $iDateTime;
}
else if ('serialize' === $aTypes[0])
{
$this->{$sKey} = ('' === $oRow->{$aTypes[1]} || !is_string($oRow->{$aTypes[1]})) ?
'' : unserialize($oRow->{$aTypes[1]});
}
else
{
$this->{$sKey} = $oRow->{$aTypes[1]};
}
$this->FlushObsolete($sKey);
}
}
}
/**
* @param string $sKey
* @return mixed
*/
public function GetObsoleteValue($sKey)
{
if (key_exists($sKey, $this->aObsolete))
{
return $this->aObsolete[$sKey];
}
return null;
}
/**
* @param string $sKey = null
* @return void
*/
public function FlushObsolete($nsKey = null)
{
if (null === $nsKey)
{
$this->aObsolete = array();
}
else
{
if (key_exists($nsKey, $this->aObsolete))
{
unset($this->aObsolete[$nsKey]);
}
}
}
/**
* @param string $sKey
* @param mixed $mDefault
* @return mixed
*/
public function GetSessionValue($sKey, $mDefault = null)
{
$aValues = CSession::Get($this->getSessionUniqueKey(), null);
return (is_array($aValues) && array_key_exists($sKey, $aValues)) ? $aValues[$sKey] : $mDefault;
}
/**
* @param string $sKey
* @param mixed $mValue
*/
public function SetSessionValue($sKey, $mValue)
{
$sUniqueKey = $this->getSessionUniqueKey();
$aValues = CSession::Get($sUniqueKey, array());
if (!is_array($aValues))
{
$aValues = array();
}
$aValues[$sKey] = $mValue;
CSession::Set($sUniqueKey, $aValues);
}
/**
* @return string
*/
protected function getSessionUniqueKey()
{
$sUniqueKey = (0 === strlen($this->sSessionUniqueProperty)) ? '' : $this->{$this->sSessionUniqueProperty};
return api_AContainer::SESSION_CONTAINER_PREFIX.$this->sParentClassName.$sUniqueKey;
}
/**
* @return string
*/
public function SessionUniqueProperty()
{
return $this->sSessionUniqueProperty;
}
/**
* @return string
*/
public function SessionUniquePropertyValue()
{
return (0 === strlen($this->sSessionUniqueProperty)) ? '' : $this->{$this->sSessionUniqueProperty};
}
/**
* @param string $sPropertyName
* @param mixed $mValue
* @return bool
*/
public function IsProperty($sPropertyName)
{
$aMap = $this->GetMap();
return isset($aMap[$sPropertyName]);
}
/**
* @param string $sPropertyName
* @return bool
*/
public function __isset($sPropertyName)
{
return $this->IsProperty($sPropertyName);
}
/**
* @param string $sKey
* @param mixed $mValue
* @return void
*/
public function __set($sKey, $mValue)
{
$aMap = $this->GetMap();
if (isset($aMap[$sKey]))
{
$this->setType($mValue, $aMap[$sKey][0]);
if (key_exists($sKey, $this->aContainer))
{
$this->aObsolete[$sKey] = $this->aContainer[$sKey];
}
if (($this->__USE_TRIM_IN_STRINGS__ && 0 === strpos($aMap[$sKey][0], 'string')) ||
(in_array($sKey, $this->aTrimer) && is_string($mValue)))
{
$mValue = trim($mValue);
}
if (is_string($mValue))
{
if (in_array($sKey, $this->aLower))
{
$mValue = strtolower($mValue);
}
else if (in_array($sKey, $this->aUpper))
{
$mValue = strtoupper($mValue);
}
}
$this->aContainer[$sKey] = $mValue;
}
else
{
throw new CApiBaseException(Errs::Container_UndefinedProperty, null, array('{{PropertyName}}' => $sKey));
}
}
/**
* @param string $sKey
* @return mixed
*/
// public function &__get($sKey)
public function __get($sKey)
{
$mReturn = null;
if (array_key_exists($sKey, $this->aContainer))
{
$mReturn = $this->aContainer[$sKey];
// if (is_scalar($this->aContainer[$sKey]))
// {
// $mReturn = $this->aContainer[$sKey];
// }
// else
// {
// $mReturn =& $this->aContainer[$sKey];
// }
}
else
{
throw new Exception('Undefined property '.$sKey);
}
return $mReturn;
}
/**
* @param mixed $mValue
* @param string $sType
*/
protected function setType(&$mValue, $sType)
{
$sType = strtolower($sType);
if (in_array($sType, array('string', 'int', 'bool', 'array')))
{
settype($mValue, $sType);
}
else if (in_array($sType, array('datetime')))
{
settype($mValue, 'int');
}
else if (in_array($sType, array('password')))
{
settype($mValue, 'string');
}
else if (0 === strpos($sType, 'string('))
{
settype($mValue, 'string');
if (0 < strlen($mValue))
{
$iSize = substr($sType, 7, -1);
if (is_numeric($iSize) && (int) $iSize < strlen($mValue))
{
// $mValue = substr($mValue, 0, (int) $iSize);
$mValue = api_Utils::Utf8Truncate($mValue, (int) $iSize);
}
}
}
}
/**
* @param bool $bIsInsert = false
* @return bool
*/
public function InitBeforeChange()
{
return true;
}
/**
* @return bool
*/
public function Validate()
{
return true;
}
/**
* @return array
*/
public function GetMap()
{
return array();
}
/**
* @return array
*/
public static function GetStaticMap()
{
return array();
}
/**
* @param array $aMap
* @return array
*/
public static function DbReadKeys($aMap)
{
$aResult = array();
foreach ($aMap as $aTypes)
{
if (isset($aTypes[1]))
{
$aResult[] = $aTypes[1];
}
}
return $aResult;
}
/**
* @param array $aMap
* @param bool $bInsert
* @return array
*/
public static function DbWriteKeys($aMap, $bInsert)
{
$aResult = array();
foreach ($aMap as $sKey => $aTypes)
{
if (isset($aTypes[1]))
{
$bUseInInsert = $bUseInUpdate = true;
if (isset($aTypes[2]) && !$aTypes[2])
{
$bUseInInsert = false;
}
if (isset($aTypes[3]) && !$aTypes[3])
{
$bUseInUpdate = false;
}
if (($bInsert && $bUseInInsert) || (!$bInsert && $bUseInUpdate))
{
$aResult[$aTypes[1]] = $sKey;
}
}
}
return $aResult;
}
/**
* @param object $oObject
* @param object $oHelper
* @param array $aExclude
* @return array
*/
public static function DbUpdateArray($oObject, $oHelper, $aExclude = array())
{
$aResult = array();
$aExclude = is_array($aExclude) && 0 < count($aExclude) ? $aExclude : array();
$sQueryParams = '';
$bUseLogQueryParams = (bool) CApi::GetConf('labs.db.log-query-params', false);
$oObject->InitBeforeChange();
$aStaticMap = $oObject->GetMap();
$aMap = api_AContainer::DbWriteKeys($aStaticMap, false);
foreach ($aMap as $sDbKey => $sObjectKey)
{
if (in_array($sDbKey, $aExclude))
{
continue;
}
$mValue = $oObject->{$sObjectKey};
if (isset($aStaticMap[$sObjectKey][0]))
{
if ('password' === $aStaticMap[$sObjectKey][0])
{
$mValue = api_Utils::EncodePassword($mValue);
}
else if ('datetime' === $aStaticMap[$sObjectKey][0])
{
$mValue = $oHelper->TimeStampToDateFormat($mValue);
}
else if ('serialize' === $aStaticMap[$sObjectKey][0])
{
$mValue = '' === $mValue ? '' : serialize($mValue);
}
}
$aResult[] = $oHelper->EscapeColumn($sDbKey).' = '.
(is_string($mValue) ? $oHelper->EscapeString($mValue) : (int) $mValue);
if ($bUseLogQueryParams)
{
$sQueryParams .=
API_CRLF.API_TAB.$sDbKey.' = '.(
is_string($mValue) ? $oHelper->EscapeString($mValue) : (int) $mValue);
}
}
if ($bUseLogQueryParams)
{
CApi::Log($sQueryParams);
}
return $aResult;
}
/**
* @param string $sWhere
* @param string $sTableName
* @param array $aStaticMap
* @param object $oHelper
*
* @return string
*/
public static function DbGetObjectSqlString($sWhere, $sTableName, $aStaticMap, $oHelper)
{
$aMap = api_AContainer::DbReadKeys($aStaticMap);
$aMap = array_map(array($oHelper, 'EscapeColumn'), $aMap);
$sSql = 'SELECT %s FROM %s WHERE %s';
return sprintf($sSql, implode(', ', $aMap), $sTableName, $sWhere);
}
/**
* @param string $sTableName
* @param object $oObject
* @param object $oHelper
*
* @return string
*/
public static function DbCreateObjectSqlString($sTableName, $oObject, $oHelper)
{
$sSql = '';
$aResults = self::DbInsertArrays($oObject, $oHelper);
if ($aResults[0] && $aResults[1])
{
$sSql = 'INSERT INTO %s ( %s ) VALUES ( %s )';
$sSql = sprintf($sSql, $sTableName, implode(', ', $aResults[0]), implode(', ', $aResults[1]));
}
return $sSql;
}
/**
* @param string $sTableName
* @param object $oObject
* @param object $oHelper
*
* @return string
*/
public static function DbUpdateObjectSqlString($sTableName, $oObject, $oHelper)
{
$aResult = self::DbUpdateArray($oObject, $oHelper);
$mValue = $oObject->SessionUniquePropertyValue();
$sSql = 'UPDATE %s SET %s WHERE %s = %s';
return sprintf($sSql, $sTableName, implode(', ', $aResult),
$oHelper->EscapeColumn($oObject->SessionUniqueProperty()),
(is_string($mValue) ? $oHelper->EscapeString($mValue) : (int) $mValue)
);
}
/**
* @param object $oObject
* @param object $oHelper
* @return array
*/
public static function DbInsertArrays($oObject, $oHelper)
{
$aResult = array(false, false);
$sQueryParams = '';
$bUseLogQueryParams = (bool) CApi::GetConf('labs.db.log-query-params', false);
$oObject->InitBeforeChange();
$aStaticMap = $oObject->GetMap();
$aMap = api_AContainer::DbWriteKeys($aStaticMap, true);
$aDbKeys = array_keys($aMap);
$aResult[0] = array_map(array(&$oHelper, 'EscapeColumn'), $aDbKeys);
$aDbValues = array_values($aMap);
foreach ($aDbValues as $iIndex => $sKey)
{
$mValue = $oObject->{$sKey};
if (isset($aStaticMap[$sKey][0]))
{
if ('password' === $aStaticMap[$sKey][0])
{
$mValue = api_Utils::EncodePassword($mValue);
}
else if ('datetime' === $aStaticMap[$sKey][0])
{
$mValue = $oHelper->TimeStampToDateFormat($mValue);
}
else if ('serialize' === $aStaticMap[$sKey][0])
{
$mValue = '' === $mValue ? '' : serialize($mValue);
}
}
$aDbValues[$iIndex] = is_string($mValue)
? $oHelper->EscapeString($mValue) : (int) $mValue;
if ($bUseLogQueryParams)
{
$sDbKey = isset($aDbKeys[$iIndex]) ? $aDbKeys[$iIndex] : '!unknown!';
$sQueryParams .= API_CRLF.API_TAB.$sDbKey.' = '.$aDbValues[$iIndex];
}
}
$aResult[1] = $aDbValues;
if ($bUseLogQueryParams)
{
CApi::Log($sQueryParams);
}
return $aResult;
}
}