// Perfs improved

git-svn-id: http://dev.prestashop.com/svn/v1/branches/1.5.x@16629 b9a71923-0436-4b27-9f14-aed3839534dd
This commit is contained in:
dMetzger
2012-07-31 16:32:44 +00:00
parent 0f56795f2f
commit e930b5d08f
2 changed files with 42 additions and 20 deletions

View File

@@ -134,6 +134,11 @@ abstract class ObjectModelCore
* @var array List of specific fields to update (all fields if null)
*/
protected $update_fields = null;
/**
* @var Db An instance of the db in order to avoid calling Db::getInstance() thousands of time
*/
protected static $db = false;
/**
* Returns object validation rules (fields validity)
@@ -163,6 +168,9 @@ abstract class ObjectModelCore
*/
public function __construct($id = null, $id_lang = null, $id_shop = null)
{
if (!ObjectModel::$db)
ObjectModel::$db = Db::getInstance();
$this->def = self::getDefinition($this);
$this->setDefinitionRetrocompatibility();
@@ -203,7 +211,7 @@ abstract class ObjectModelCore
if (Shop::isTableAssociated($this->def['table']))
$sql->leftJoin($this->def['table'].'_shop', 'c', 'a.'.$this->def['primary'].' = c.'.$this->def['primary'].' AND c.id_shop = '.(int)$this->id_shop);
Cache::store($cache_id, Db::getInstance()->getRow($sql));
Cache::store($cache_id, ObjectModel::$db->getRow($sql));
}
$result = Cache::retrieve($cache_id);
@@ -219,7 +227,7 @@ abstract class ObjectModelCore
$sql = 'SELECT * FROM `'.pSQL(_DB_PREFIX_.$this->def['table']).'_lang`
WHERE `'.$this->def['primary'].'` = '.(int)$id
.(($this->id_shop && $this->isLangMultishop()) ? ' AND `id_shop` = '.$this->id_shop : '');
$result = Db::getInstance()->executeS($sql);
$result = ObjectModel::$db->executeS($sql);
if ($result)
foreach ($result as $row)
foreach ($row as $key => $value)
@@ -428,6 +436,9 @@ abstract class ObjectModelCore
*/
public function add($autodate = true, $null_values = false)
{
if (!ObjectModel::$db)
ObjectModel::$db = Db::getInstance();
// @hook actionObject*AddBefore
Hook::exec('actionObjectAddBefore', array('object' => $this));
Hook::exec('actionObject'.get_class($this).'AddBefore', array('object' => $this));
@@ -439,11 +450,11 @@ abstract class ObjectModelCore
$this->date_upd = date('Y-m-d H:i:s');
// Database insertion
if (!$result = Db::getInstance()->insert($this->def['table'], $this->getFields(), $null_values))
if (!$result = ObjectModel::$db->insert($this->def['table'], $this->getFields(), $null_values))
return false;
// Get object id in database
$this->id = Db::getInstance()->Insert_ID();
$this->id = ObjectModel::$db->Insert_ID();
// Database insertion for multishop fields related to the object
if (Shop::isTableAssociated($this->def['table']))
@@ -458,7 +469,7 @@ abstract class ObjectModelCore
foreach ($id_shop_list as $id_shop)
{
$fields['id_shop'] = (int)$id_shop;
$result &= Db::getInstance()->insert($this->def['table'].'_shop', $fields, $null_values);
$result &= ObjectModel::$db->insert($this->def['table'].'_shop', $fields, $null_values);
}
}
@@ -485,11 +496,11 @@ abstract class ObjectModelCore
foreach ($shops as $id_shop)
{
$field['id_shop'] = (int)$id_shop;
$result &= Db::getInstance()->insert($this->def['table'].'_lang', $field);
$result &= ObjectModel::$db->insert($this->def['table'].'_lang', $field);
}
}
else
$result &= Db::getInstance()->insert($this->def['table'].'_lang', $field);
$result &= ObjectModel::$db->insert($this->def['table'].'_lang', $field);
}
}
}
@@ -509,6 +520,9 @@ abstract class ObjectModelCore
*/
public function update($null_values = false)
{
if (!ObjectModel::$db)
ObjectModel::$db = Db::getInstance();
// @hook actionObject*UpdateBefore
Hook::exec('actionObjectUpdateBefore', array('object' => $this));
Hook::exec('actionObject'.get_class($this).'UpdateBefore', array('object' => $this));
@@ -520,7 +534,7 @@ abstract class ObjectModelCore
$this->date_upd = date('Y-m-d H:i:s');
// Database update
if (!$result = Db::getInstance()->update($this->def['table'], $this->getFields(), '`'.pSQL($this->def['primary']).'` = '.(int)$this->id, 0, $null_values))
if (!$result = ObjectModel::$db->update($this->def['table'], $this->getFields(), '`'.pSQL($this->def['primary']).'` = '.(int)$this->id, 0, $null_values))
return false;
// Database insertion for multishop fields related to the object
@@ -551,11 +565,11 @@ abstract class ObjectModelCore
// A little explanation of what we do here : we want to create multishop entry when update is called, but
// only if we are in a shop context (if we are in all context, we just want to update entries that alread exists)
$shop_exists = Db::getInstance()->getValue('SELECT '.$this->def['primary'].' FROM '._DB_PREFIX_.$this->def['table'].'_shop WHERE '.$where);
$shop_exists = ObjectModel::$db->getValue('SELECT '.$this->def['primary'].' FROM '._DB_PREFIX_.$this->def['table'].'_shop WHERE '.$where);
if ($shop_exists)
$result &= Db::getInstance()->update($this->def['table'].'_shop', $fields, $where, 0, $null_values);
$result &= ObjectModel::$db->update($this->def['table'].'_shop', $fields, $where, 0, $null_values);
else if (Shop::getContext() == Shop::CONTEXT_SHOP)
$result &= Db::getInstance()->insert($this->def['table'].'_shop', $all_fields, $null_values);
$result &= ObjectModel::$db->insert($this->def['table'].'_shop', $all_fields, $null_values);
}
}
@@ -584,10 +598,10 @@ abstract class ObjectModelCore
.' AND id_lang = '.(int)$field['id_lang']
.' AND id_shop = '.(int)$id_shop;
if (Db::getInstance()->getValue('SELECT COUNT(*) FROM '.pSQL(_DB_PREFIX_.$this->def['table']).'_lang WHERE '.$where))
$result &= Db::getInstance()->update($this->def['table'].'_lang', $field, $where);
if (ObjectModel::$db->getValue('SELECT COUNT(*) FROM '.pSQL(_DB_PREFIX_.$this->def['table']).'_lang WHERE '.$where))
$result &= ObjectModel::$db->update($this->def['table'].'_lang', $field, $where);
else
$result &= Db::getInstance()->insert($this->def['table'].'_lang', $field);
$result &= ObjectModel::$db->insert($this->def['table'].'_lang', $field);
}
}
// If this table is not linked to multishop system ...
@@ -596,9 +610,9 @@ abstract class ObjectModelCore
$where = pSQL($this->def['primary']).' = '.(int)$this->id
.' AND id_lang = '.(int)$field['id_lang'];
if (Db::getInstance()->getValue('SELECT COUNT(*) FROM '.pSQL(_DB_PREFIX_.$this->def['table']).'_lang WHERE '.$where))
$result &= Db::getInstance()->update($this->def['table'].'_lang', $field, $where);
$result &= ObjectModel::$db->update($this->def['table'].'_lang', $field, $where);
else
$result &= Db::getInstance()->insert($this->def['table'].'_lang', $field, 'INSERT');
$result &= ObjectModel::$db->insert($this->def['table'].'_lang', $field, 'INSERT');
}
}
}
@@ -618,6 +632,9 @@ abstract class ObjectModelCore
*/
public function delete()
{
if (!ObjectModel::$db)
ObjectModel::$db = Db::getInstance();
// @hook actionObject*DeleteBefore
Hook::exec('actionObjectDeleteBefore', array('object' => $this));
Hook::exec('actionObject'.get_class($this).'DeleteBefore', array('object' => $this));
@@ -631,20 +648,20 @@ abstract class ObjectModelCore
if (count($this->id_shop_list))
$id_shop_list = $this->id_shop_list;
$result &= Db::getInstance()->delete($this->def['table'].'_shop', '`'.$this->def['primary'].'`='.(int)$this->id.' AND id_shop IN ('.implode(', ', $id_shop_list).')');
$result &= ObjectModel::$db->delete($this->def['table'].'_shop', '`'.$this->def['primary'].'`='.(int)$this->id.' AND id_shop IN ('.implode(', ', $id_shop_list).')');
}
// Database deletion
$has_multishop_entries = $this->hasMultishopEntries();
if ($result && !$has_multishop_entries)
$result &= Db::getInstance()->delete($this->def['table'], '`'.pSQL($this->def['primary']).'` = '.(int)$this->id);
$result &= ObjectModel::$db->delete($this->def['table'], '`'.pSQL($this->def['primary']).'` = '.(int)$this->id);
if (!$result)
return false;
// Database deletion for multilingual fields related to the object
if (!empty($this->def['multilang']) && !$has_multishop_entries)
$result &= Db::getInstance()->delete($this->def['table'].'_lang', '`'.pSQL($this->def['primary']).'` = '.(int)$this->id);
$result &= ObjectModel::$db->delete($this->def['table'].'_lang', '`'.pSQL($this->def['primary']).'` = '.(int)$this->id);
// @hook actionObject*DeleteAfter
Hook::exec('actionObjectDeleteAfter', array('object' => $this));