diff --git a/core/autoload.php b/core/autoload.php index 15eb719a1..3e15bb6cd 100644 --- a/core/autoload.php +++ b/core/autoload.php @@ -33,6 +33,7 @@ MetaModel::IncludeModule('core/tagsetfield.class.inc.php'); MetaModel::IncludeModule('synchro/synchrodatasource.class.inc.php'); MetaModel::IncludeModule('core/backgroundtask.class.inc.php'); MetaModel::IncludeModule('core/inlineimage.class.inc.php'); +MetaModel::IncludeModule('core/counter.class.inc.php'); MetaModel::IncludeModule('webservices/webservices.basic.php'); diff --git a/core/cmdbsource.class.inc.php b/core/cmdbsource.class.inc.php index 72d070d61..800ac3614 100644 --- a/core/cmdbsource.class.inc.php +++ b/core/cmdbsource.class.inc.php @@ -793,6 +793,9 @@ class CMDBSource } /** + * + * @deprecated 2.7.0 N°1627 use ItopCounter insted + * * @param string $sTable * * @return int diff --git a/core/counter.class.inc.php b/core/counter.class.inc.php new file mode 100644 index 000000000..84b4b5894 --- /dev/null +++ b/core/counter.class.inc.php @@ -0,0 +1,162 @@ +Lock(); + + $oFilter = DBObjectSearch::FromOQL('SELECT KeyValueStore WHERE key_name=:key_name', array( + 'key_name' => $sCounterName, + )); + $oCounter = $oFilter->GetFirstResult(); + if (is_null($oCounter)) + { + if (null != $oNewObjectValueProvider) + { + $iComputedValue = $oNewObjectValueProvider(); + } + else + { + $iComputedValue = 0; + } + $oCounter = MetaModel::NewObject('KeyValueStore', array( + 'key_name' => $sCounterName, + 'value' => $iComputedValue, + )); + } + + $iCurrentValue = (int) $oCounter->Get('value'); + $iCurrentValue++; + + $oCounter->Set('value', $iCurrentValue); + $oCounter->DBWrite(); + + $oiTopMutex->Unlock(); + + return $iCurrentValue; + } + + /** + * handle a counter for the root class of given $sLeafClass. + * If no counter exist initialize it with the `max(id) + 1` + * + * @param $sLeafClass + * + * @return int + * @throws \ArchivedObjectException + * @throws \CoreCannotSaveObjectException + * @throws \CoreException + * @throws \CoreOqlMultipleResultsForbiddenException + * @throws \CoreUnexpectedValue + * @throws \MySQLException + * @throws \OQLException + */ + public static function IncClass($sLeafClass) + { + $sRootClass = MetaModel::GetRootClass($sLeafClass); + + $oNewObjectCallback = function() use ($sRootClass) + { + $sRootTable = MetaModel::DBGetTable($sRootClass); + $sIdField = MetaModel::DBGetKey($sRootClass); + + return CMDBSource::QueryToScalar("SELECT max(`$sIdField`) FROM `$sRootTable`"); + }; + + return self::Inc($sRootClass, $oNewObjectCallback); + } +} + + + +/** + * Persistent classes for a CMDB + * + * @copyright Copyright (C) 2010-2017 Combodo SARL + * @license http://opensource.org/licenses/AGPL-3.0 + */ + +class KeyValueStore extends DBObject +{ + public static function Init() + { + $aParams = array( + 'category' => 'bizmodel', + 'key_type' => 'autoincrement', + 'name_attcode' => array('key_name'), + 'state_attcode' => '', + 'reconc_keys' => array(''), + 'db_table' => 'key_value_store', + 'db_key_field' => 'id', + 'db_finalclass_field' => '', + 'indexes' => array ( + array ( + 0 => 'key_name', + ), + ),); + MetaModel::Init_Params($aParams); + MetaModel::Init_InheritAttributes(); + MetaModel::Init_AddAttribute(new AttributeString("key_name", array("allowed_values"=>null, "sql"=>'key_name', "default_value"=>'', "is_null_allowed"=>false, "depends_on"=>array(), "always_load_in_tables"=>false))); + MetaModel::Init_AddAttribute(new AttributeString("value", array("allowed_values"=>null, "sql"=>'value', "default_value"=>'0', "is_null_allowed"=>false, "depends_on"=>array(), "always_load_in_tables"=>false))); + + MetaModel::Init_SetZListItems('details', array ( + 0 => 'key_name', + 1 => 'value', + )); + MetaModel::Init_SetZListItems('standard_search', array ( + 0 => 'key_name', + 1 => 'value', + )); + MetaModel::Init_SetZListItems('list', array ( + 0 => 'key_name', + 1 => 'value', + )); + ; + } + + +} \ No newline at end of file diff --git a/core/metamodel.class.php b/core/metamodel.class.php index 12a2eb3d8..05619a7eb 100644 --- a/core/metamodel.class.php +++ b/core/metamodel.class.php @@ -6935,6 +6935,8 @@ abstract class MetaModel } /** + * @deprecated 2.7.0 N°1627, use ItopCounter::incRootClass($sClass) instead + * * @param string $sClass * * @return int @@ -6942,10 +6944,7 @@ abstract class MetaModel */ public static function GetNextKey($sClass) { - $sRootClass = MetaModel::GetRootClass($sClass); - $sRootTable = MetaModel::DBGetTable($sRootClass); - - return CMDBSource::GetNextInsertId($sRootTable); + return ItopCounter::IncClass($sClass); } /** diff --git a/lib/composer/autoload_classmap.php b/lib/composer/autoload_classmap.php index 367d3a488..522d0d941 100644 --- a/lib/composer/autoload_classmap.php +++ b/lib/composer/autoload_classmap.php @@ -140,6 +140,9 @@ return array( 'ContextTag' => $baseDir . '/core/contexttag.class.inc.php', 'CoreCannotSaveObjectException' => $baseDir . '/core/coreexception.class.inc.php', 'CoreException' => $baseDir . '/core/coreexception.class.inc.php', + 'CoreOqlException' => $baseDir . '/core/coreexception.class.inc.php', + 'CoreOqlMultipleResultsForbiddenException' => $baseDir . '/core/coreexception.class.inc.php', + 'CorePortalInvalidActionRuleException' => $baseDir . '/core/coreexception.class.inc.php', 'CoreServices' => $baseDir . '/core/restservices.class.inc.php', 'CoreUnexpectedValue' => $baseDir . '/core/coreexception.class.inc.php', 'CoreWarning' => $baseDir . '/core/coreexception.class.inc.php', @@ -255,8 +258,10 @@ return array( 'Introspection' => $baseDir . '/core/introspection.class.inc.php', 'InvalidConfigParamException' => $baseDir . '/core/coreexception.class.inc.php', 'IssueLog' => $baseDir . '/core/log.class.inc.php', + 'ItopCounter' => $baseDir . '/core/counter.class.inc.php', 'JSButtonItem' => $baseDir . '/application/applicationextension.inc.php', 'JSPopupMenuItem' => $baseDir . '/application/applicationextension.inc.php', + 'KeyValueStore' => $baseDir . '/core/counter.class.inc.php', 'ListExpression' => $baseDir . '/core/oql/expression.class.inc.php', 'ListOqlExpression' => $baseDir . '/core/oql/oqlquery.class.inc.php', 'LogAPI' => $baseDir . '/core/log.class.inc.php', diff --git a/lib/composer/autoload_static.php b/lib/composer/autoload_static.php index d0bcd7557..5475b2b2a 100644 --- a/lib/composer/autoload_static.php +++ b/lib/composer/autoload_static.php @@ -361,6 +361,9 @@ class ComposerStaticInit0018331147de7601e7552f7da8e3bb8b 'ContextTag' => __DIR__ . '/../..' . '/core/contexttag.class.inc.php', 'CoreCannotSaveObjectException' => __DIR__ . '/../..' . '/core/coreexception.class.inc.php', 'CoreException' => __DIR__ . '/../..' . '/core/coreexception.class.inc.php', + 'CoreOqlException' => __DIR__ . '/../..' . '/core/coreexception.class.inc.php', + 'CoreOqlMultipleResultsForbiddenException' => __DIR__ . '/../..' . '/core/coreexception.class.inc.php', + 'CorePortalInvalidActionRuleException' => __DIR__ . '/../..' . '/core/coreexception.class.inc.php', 'CoreServices' => __DIR__ . '/../..' . '/core/restservices.class.inc.php', 'CoreUnexpectedValue' => __DIR__ . '/../..' . '/core/coreexception.class.inc.php', 'CoreWarning' => __DIR__ . '/../..' . '/core/coreexception.class.inc.php', @@ -476,8 +479,10 @@ class ComposerStaticInit0018331147de7601e7552f7da8e3bb8b 'Introspection' => __DIR__ . '/../..' . '/core/introspection.class.inc.php', 'InvalidConfigParamException' => __DIR__ . '/../..' . '/core/coreexception.class.inc.php', 'IssueLog' => __DIR__ . '/../..' . '/core/log.class.inc.php', + 'ItopCounter' => __DIR__ . '/../..' . '/core/counter.class.inc.php', 'JSButtonItem' => __DIR__ . '/../..' . '/application/applicationextension.inc.php', 'JSPopupMenuItem' => __DIR__ . '/../..' . '/application/applicationextension.inc.php', + 'KeyValueStore' => __DIR__ . '/../..' . '/core/counter.class.inc.php', 'ListExpression' => __DIR__ . '/../..' . '/core/oql/expression.class.inc.php', 'ListOqlExpression' => __DIR__ . '/../..' . '/core/oql/oqlquery.class.inc.php', 'LogAPI' => __DIR__ . '/../..' . '/core/log.class.inc.php',