%PDF- %PDF-
Direktori : /www/varak.net/mail2.varak.net_old/libraries/afterlogic/common/managers/db/storages/db/ |
Current File : //www/varak.net/mail2.varak.net_old/libraries/afterlogic/common/managers/db/storages/db/storage.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 Db */ class CApiDbDbStorage extends CApiDbStorage { /** * @var CDbStorage $oConnection */ protected $oConnection; /** * @var CApiDomainsCommandCreator */ protected $oCommandCreator; /** * @var IDbHelper */ protected $oHelper; /** * @param CApiGlobalManager &$oManager */ public function __construct(CApiGlobalManager &$oManager) { parent::__construct('db', $oManager); $this->oConnection =& $oManager->GetConnection(); $this->oCommandCreator =& $oManager->GetCommandCreator( $this, array( EDbType::MySQL => 'CApiDbCommandCreatorMySQL', EDbType::PostgreSQL => 'CApiDbCommandCreatorPostgreSQL' ) ); $this->oHelper =& $oManager->GetSqlHelper(); } /** * @return bool */ public function TestConnection() { $bResult = $this->oConnection->Connect(); $this->throwDbExceptionIfExist(); return $bResult; } /** * @return bool */ public function TryToCreateDatabase() { CDbCreator::ClearStatic(); $aConnections =& CDbCreator::CreateConnector($this->oSettings); $oConnect = $aConnections[0]; if ($oConnect) { $oConnect->ConnectNoSelect(); $oConnect->Execute( $this->oCommandCreator->CreateDatabase($this->oSettings->GetConf('Common/DBName'))); } else { throw new CApiBaseException(Errs::Db_ExceptionError); } return true; } /** * @param mixed $fVerboseCallback * @param bool $bDropFields = false * @param bool $bDropIndex = false */ public function SyncTables($fVerboseCallback, $bDropFields = false, $bDropIndex = false) { $iResult = 0; $aDbTables = $this->oConnection->GetTableNames(); if (is_array($aDbTables)) { $iResult = 1; $aTables = CDbSchemaHelper::GetSqlTables(); foreach ($aTables as /* @var $oTable CDbTable */ $oTable) { if (in_array($oTable->Name(), $aDbTables)) { $iResult &= $this->syncTable($oTable, $fVerboseCallback, $bDropFields, $bDropIndex); } else { $sError = ''; $aSql = explode(';', $oTable->ToString($this->oHelper)); foreach ($aSql as $sSql) { if ('' !== trim($sSql)) { $bResult = $this->oConnection->Execute($sSql); if (!$bResult) { $iResult = 0; $sError = $this->oConnection->GetError(); break; } } } call_user_func($fVerboseCallback, ESyncVerboseType::CreateTable, $bResult, $oTable->Name(), array(), $sError); } } } $this->throwDbExceptionIfExist(); return (bool) $iResult; } /** * @param CDbTable $oTable * @param mixed $fVerboseCallback * @param bool $bDropFields = false * @param bool $bDropIndex = false */ protected function syncTable(CDbTable $oTable, $fVerboseCallback, $bDropFields = false, $bDropIndex = false) { $iResult = 1; $aDbFields = $this->oConnection->GetTableFields($oTable->Name()); if (!is_array($aDbFields)) { return false; } $aSchemaFields = $oTable->GetFieldNames(); $aFieldsToAdd = array_diff($aSchemaFields, $aDbFields); if (0 < count($aFieldsToAdd)) { $sError = ''; $sResult = $this->oConnection->Execute($oTable->GetAlterAddFields($this->oHelper, $aFieldsToAdd)); if (!$sResult) { $iResult = 0; $sError = $this->oConnection->GetError(); } call_user_func($fVerboseCallback, ESyncVerboseType::CreateField, $sResult, $oTable->Name(), $aFieldsToAdd, $sError); } // if ($bDropFields) // { // $aFieldsToDelete = array_diff($aDbFields, $aSchemaFields); // if (0 < count($aFieldsToDelete)) // { // $sError = ''; // $sResult = $this->oConnection->Execute($oTable->GetAlterDeleteFields($this->oHelper, $aFieldsToDelete)); // if (!$sResult) // { // $iResult = 0; // $sError = $this->oConnection->GetError(); // } // // call_user_func($fVerboseCallback, ESyncVerboseType::DeleteField, $sResult, $oTable->Name(), $aFieldsToDelete, $sError); // } // } $aTableIndexes = $oTable->GetIndexesFieldsNames(); $aDbIndexes = $this->oConnection->GetTableIndexes($oTable->Name()); $aTableIndexesSimple = array(); foreach ($aTableIndexes as $iKey => $aIndex) { sort($aIndex); $aTableIndexesSimple[$iKey] = implode('|', $aIndex); } $aDbIndexesSimple = array(); foreach ($aDbIndexes as $sKey => $aIndex) { sort($aIndex); $aDbIndexesSimple[$sKey] = implode('|', $aIndex); } foreach ($aTableIndexesSimple as $iKey => $sIndexLine) { if (!empty($sIndexLine) && !in_array($sIndexLine, $aDbIndexesSimple) && isset($aTableIndexes[$iKey])) { $sError = ''; $sResult = $this->oConnection->Execute($oTable->GetAlterCreateIndexes($this->oHelper, $aTableIndexes[$iKey])); if (!$sResult) { $iResult = 0; $sError = $this->oConnection->GetError(); } call_user_func($fVerboseCallback, ESyncVerboseType::CreateIndex, $sResult, $oTable->Name(), explode('|', $sIndexLine), $sError); } } // if ($bDropIndex) // { // foreach ($aDbIndexesSimple as $sKey => $sIndex) // { // if ('PRIMARY' !== strtoupper($sKey) && '_pkey' !== strtolower(substr($sKey, -5)) && !empty($sIndex) // && !in_array($sIndex, $aTableIndexesSimple) && isset($aDbIndexes[$sKey])) // { // $sError = ''; // $sResult = $this->oConnection->Execute($oTable->GetAlterDeleteIndexes($this->oHelper, $sKey)); // if (!$sResult) // { // $iResult = 0; // $sError = $this->oConnection->GetError(); // } // // call_user_func($fVerboseCallback, ESyncVerboseType::DeleteIndex, $sResult, $oTable->Name(), array($sIndex), $sError); // } // } // } $this->throwDbExceptionIfExist(); return (bool) $iResult; } /** * @return bool */ public function AUsersTableExists() { $aTables = $this->oConnection->GetTableNames(); $aTables = is_array($aTables) ? $aTables : array(); $bResult = in_array($this->oConnection->Prefix().'a_users', $aTables); $this->throwDbExceptionIfExist(); return $bResult; } /** * @return bool */ public function CreateTables() { $bResult = 1; $aTables = $this->GetSqlSchemaAsArray(); foreach ($aTables as $sTableCreateSql) { $bResult &= $this->oConnection->Execute($sTableCreateSql); } $this->throwDbExceptionIfExist(); return (bool) $bResult; } /** * @param bool $bAddDropTable = false * @return string */ public function GetSqlSchemaAsString($bAddDropTable = false) { $sFunctions = implode(';;'.API_CRLF.API_CRLF, $this->GetSqlFunctionsAsArray($bAddDropTable)); $sFunctions = empty($sFunctions) ? '' : API_CRLF.API_CRLF.'DELIMITER ;;'.API_CRLF.API_CRLF.$sFunctions.';;'.API_CRLF.API_CRLF.'DELIMITER ;'; return trim('DELIMITER ;'.API_CRLF.API_CRLF. implode(';'.API_CRLF.API_CRLF, $this->GetSqlSchemaAsArray($bAddDropTable)).';'. $sFunctions); } /** * @param bool $bAddDropTable = false * @return array */ public function GetSqlSchemaAsArray($bAddDropTable = false) { $aResult = array(); $aTables = CDbSchemaHelper::GetSqlTables(); foreach ($aTables as /* @var $oTable CDbTable */ $oTable) { $aResult[] = $oTable->ToString($this->oHelper, $bAddDropTable); } return $aResult; } /** * @param bool $bAddDropFunction = false * @return array */ public function GetSqlFunctionsAsArray($bAddDropFunction = false) { $aResult = array(); $aFunctions = CDbSchemaHelper::GetSqlFunctions(); foreach ($aFunctions as /* @var $oFunction CDbFunction */ $oFunction) { $aResult[] = $oFunction->ToString($this->oHelper, $bAddDropFunction); } return $aResult; } }