%PDF- %PDF-
| Direktori : /www/varak.net/mail2.varak.net_old/libraries/afterlogic/common/db/ |
| Current File : /www/varak.net/mail2.varak.net_old/libraries/afterlogic/common/db/table.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
* @subpackage Db
*/
class CDbTable
{
const CRLF = "\r\n";
const TAB = "\t";
/**
* @var string
*/
protected $sName;
/**
* @var string
*/
protected $sPrefix;
/**
* @var array
*/
protected $aFields;
/**
* @var array
*/
protected $aKeys;
/**
* @param string $sName
* @param string $sPrefix
* @param array $aFields
* @param array $aKeys = array()
*/
public function __construct($sName, $sPrefix, array $aFields, $aKeys = array())
{
$this->sName = $sName;
$this->sPrefix = $sPrefix;
$this->aFields = $aFields;
$this->aKeys = $aKeys;
}
/**
* @return string
*/
public function Name($nWithPrefix = true)
{
return (($nWithPrefix) ? $this->sPrefix : '').$this->sName;
}
/**
* @return array
*/
public function &GetFields()
{
return $this->aFields;
}
/**
* @return array
*/
public function GetFieldNames()
{
$aField = array();
foreach ($this->aFields as /* @var $oField CDbField */ $oField)
{
$aField[] = $oField->Name();
}
return $aField;
}
/**
* @return array
*/
public function GetIndexesFieldsNames()
{
$aKeyLines = array();
foreach ($this->aKeys as /* @var $oKey CDbKey */ $oKey)
{
if (CDbKey::TYPE_PRIMARY_KEY !== $oKey->GetType())
{
$aKeyFields = $oKey->GetIndexesFields();
if (is_array($aKeyFields) && 0 < count($aKeyFields))
{
$aKeyLines[] = $aKeyFields;
}
}
}
return $aKeyLines;
}
/**
* @param string $sName
* @return CDbField
*/
public function GetFieldByName($sName)
{
$oResultField = false;
foreach ($this->aFields as /* @var $oField CDbField */ $oField)
{
if ($sName === $oField->Name())
{
$oResultField = $oField;
break;
}
}
return $oResultField;
}
/**
* @param IDbHelper $oHelper
* @param bool $bAddDropTable = false
* @return string
*/
public function ToString($oHelper, $bAddDropTable = false)
{
$sResult = '';
if ($bAddDropTable)
{
$sResult .= 'DROP TABLE IF EXISTS '.$oHelper->EscapeColumn($this->Name()).';'.CDbTable::CRLF;
}
$sResult .= 'CREATE TABLE '.$oHelper->EscapeColumn($this->Name())
.' ('.CDbTable::CRLF.CDbTable::TAB;
$aFieldLines = array();
foreach ($this->aFields as /* @var $oField CDbField */ $oField)
{
$aFieldLines[] = $oField->ToString($oHelper);
}
$sResult .= implode(','.CDbTable::CRLF.CDbTable::TAB, $aFieldLines);
unset($aFieldLines);
$aAdditionalRequests = array();
$aKeyLines = array();
foreach ($this->aKeys as /* @var $oKey CDbKey */ $oKey)
{
if (CDbKey::TYPE_PRIMARY_KEY === $oKey->GetType() || !$oHelper->UseSingleIndexRequest())
{
$sLine = $oKey->ToString($oHelper, $this->Name());
if (!empty($sLine))
{
$aKeyLines[] = $sLine;
}
}
else
{
$aAdd = $oKey->ToSingleIndexRequest($oHelper, $this->Name());
if (!empty($aAdd))
{
$aAdditionalRequests[] = $aAdd;
}
}
}
if (0 < count($aKeyLines))
{
$sResult .= ','.CDbTable::CRLF.CDbTable::TAB.
implode(','.CDbTable::CRLF.CDbTable::TAB, $aKeyLines);
}
unset($aKeyLines);
return trim($sResult.CDbTable::CRLF.') '.$oHelper->CreateTableLastLine()).
(0 < count($aAdditionalRequests) ? ";\n\n".implode(";\n\n", $aAdditionalRequests) : '');
}
/**
* @param IDbHelper $oHelper
* @param array $aFieldsToAdd
* @return string
*/
public function GetAlterAddFields($oHelper, $aFieldsToAdd)
{
if (0 < count($aFieldsToAdd))
{
$aLines = array();
foreach ($this->aFields as /* @var $oField CDbField */ $oField)
{
if (in_array($oField->Name(), $aFieldsToAdd))
{
$aLines[] = 'ADD '.$oField->ToString($oHelper);
}
}
return sprintf('ALTER TABLE %s %s', $oHelper->EscapeColumn($this->Name()), implode(', ', $aLines));
}
return false;
}
/**
* @param IDbHelper $oHelper
* @param array $aFieldsToDelete
* @return string
*/
public function GetAlterDeleteFields($oHelper, $aFieldsToDelete)
{
if (0 < count($aFieldsToDelete))
{
$aLines = array();
foreach ($aFieldsToDelete as $sFieldName)
{
$aLines[] = 'DROP '.$oHelper->EscapeColumn($sFieldName);
}
return sprintf('ALTER TABLE %s %s', $oHelper->EscapeColumn($this->Name()), implode(', ', $aLines));
}
return false;
}
/**
* @param IDbHelper $oHelper
* @param array $aIndexesToCreate
* @return string
*/
public function GetAlterCreateIndexes($oHelper, $aIndexesToCreate)
{
if (0 < count($aIndexesToCreate))
{
$sName = strtoupper('awm_'.$this->Name().'_'.implode('_', $aIndexesToCreate).'_index');
$aIndexesToCreate = array_map(array($oHelper, 'EscapeColumn'), $aIndexesToCreate);
return sprintf('CREATE INDEX %s ON %s (%s)', $sName,
$oHelper->EscapeColumn($this->Name()), implode(', ', $aIndexesToCreate));
}
return false;
}
/**
* @param IDbHelper $oHelper
* @param string $sIndexesName
* @return string
*/
public function GetAlterDeleteIndexes($oHelper, $sIndexesName)
{
if (!empty($sIndexesName))
{
return $oHelper->DropIndexRequest($sIndexesName, $this->Name());
}
return false;
}
}
/**
* @package Api
* @subpackage Db
*/
class CDbField
{
const AUTO_INT = 10;
const AUTO_INT_BIG = 11;
const AUTO_INT_UNSIGNED = 12;
const AUTO_INT_BIG_UNSIGNED = 13;
const BIT = 20;
const INT = 21;
const INT_SHORT = 22;
const INT_SMALL = 23;
const INT_BIG = 24;
const INT_UNSIGNED = 25;
const INT_SHORT_SMALL = 26;
const INT_BIG_UNSIGNED = 27;
const CHAR = 31;
const VAR_CHAR = 32;
const TEXT = 33;
const TEXT_MEDIUM = 37;
const TEXT_LONG = 34;
const BLOB = 35;
const BLOB_LONG = 36;
const DATETIME = 40;
/**
* @var string
*/
protected $sName;
/**
* @var int
*/
protected $iType;
/**
* @var mixed
*/
protected $mDefault;
/**
* @var int
*/
protected $iCustomLen;
/**
* @var bool
*/
protected $bNotNullWithOutDefault;
/**
* @param string $sName
* @param int $iType
* @param mixed $mDefault = null
* @param int $iCustomLen = null
* @param bool $bNotNullWithOutDefault = false
*/
public function __construct($sName, $iType, $mDefault = null, $iCustomLen = null, $bNotNullWithOutDefault = false)
{
$this->sName = $sName;
$this->iType = $iType;
$this->mDefault = $mDefault;
$this->iCustomLen = $iCustomLen;
$this->bNotNullWithOutDefault = $bNotNullWithOutDefault;
}
/**
* @return string
*/
public function Name()
{
return $this->sName;
}
/**
* @param string $sTableName
* @param IDbHelper $oHelper
* @return string
*/
public function ToAlterString($sTableName, $oHelper)
{
return sprintf('ALTER TABLE %s ADD %s',
$oHelper->EscapeColumn($sTableName), $this->ToString($oHelper));
}
/**
* @return string
*/
public function ToString($oHelper)
{
return $oHelper->FieldToString($this->sName, $this->iType, $this->mDefault, $this->iCustomLen, $this->bNotNullWithOutDefault);
}
}
/**
* @package Api
* @subpackage Db
*/
class CDbKey
{
const TYPE_KEY = 0;
const TYPE_UNIQUE_KEY = 1;
const TYPE_PRIMARY_KEY = 2;
const TYPE_INDEX = 3;
const TYPE_FULLTEXT = 4;
/**
* @var int
*/
protected $iType;
/**
* @var array
*/
protected $aFields;
/**
* @param string $sName
* @param int $iType
* @param array $aFields
*/
public function __construct($iType, array $aFields)
{
$this->iType = $iType;
$this->aFields = $aFields;
}
/**
* @return int
*/
public function GetType()
{
return $this->iType;
}
/**
* @param string $sTableName
* @return string
*/
public function GetName($sTableName)
{
$aList = $this->aFields;
sort($aList);
return strtoupper($sTableName.'_'.implode('_', $aList).'_INDEX');
}
/**
* @return array
*/
public function GetIndexesFields()
{
return $this->aFields;
}
/**
* @return string
*/
public function ToString($oHelper, $sTableName)
{
$sResult = '';
if (0 < count($this->aFields))
{
switch ($this->iType)
{
case CDbKey::TYPE_PRIMARY_KEY:
$sResult .= 'PRIMARY KEY';
break;
case CDbKey::TYPE_UNIQUE_KEY:
$sResult .= 'UNIQUE '.$oHelper->EscapeColumn($this->GetName($sTableName));
break;
case CDbKey::TYPE_INDEX:
$sResult .= 'INDEX '.$oHelper->EscapeColumn($this->GetName($sTableName));
break;
// case CDbKey::TYPE_FULLTEXT:
// $sResult .= 'FULLTEXT '.$oHelper->EscapeColumn($this->GetName($sTableName));
// break;
}
$aValues = array_map(array(&$oHelper, 'EscapeColumn'), $this->aFields);
$sResult .= ' ('.implode(', ', $aValues).')';
}
return trim($sResult);
}
/**
* @return string
*/
public function ToSingleIndexRequest($oHelper, $sTableName)
{
return $oHelper->CreateIndexRequest($this->iType, $sTableName, $this->GetName($sTableName), $this->aFields);
}
}
/**
* @package Api
* @subpackage Db
*/
class CDbFunction
{
/**
* @var string
*/
protected $sName;
/**
* @var string
*/
protected $sIncParams;
/**
* @var string
*/
protected $sResult;
/**
* @var string
*/
protected $sText;
/**
* @param string $sName
* @param string $sText
*/
public function __construct($sName, $sIncParams, $sResult, $sText)
{
$this->sName = $sName;
$this->sIncParams = $sIncParams;
$this->sResult = $sResult;
$this->sText = $sText;
}
/**
* @param IDbHelper $oHelper
* @param bool $bAddDropFunction = false
* @return string
*/
public function ToString($oHelper, $bAddDropFunction = false)
{
$sResult = '';
if ($bAddDropFunction)
{
$sResult .= 'DROP FUNCTION IF EXISTS '.$this->sName.';;'.CDbTable::CRLF;
}
$sResult .= 'CREATE FUNCTION '.$this->sName.'('.$this->sIncParams.') RETURNS '.$this->sResult;
$sResult .= CDbTable::CRLF.$this->sText;
return trim($sResult);
}
}