VirtueMart Forum

VirtueMart 2 + 3 + 4 => Virtuemart Development and bug reports => Coding Central => Topic started by: epsoft on January 26, 2015, 09:40:46 AM

Title: VmTable::load possible anomaly if returning data from cache
Post by: epsoft on January 26, 2015, 09:40:46 AM
The VmTable::load function uses Joomla JTable::bind to return cached data
(in latest trunk https://dev.virtuemart.net/projects/virtuemart/repository/entry/trunk/virtuemart/administrator/components/com_virtuemart/helpers/vmtable.php  Row:995)

$this->_lhash = md5($oid. $select . $k . $mainTable . $andWhere . $hashVarsToPush);
//$this->showFullColumns();
if (isset (self::$_cache['l'][$this->_lhash])) {
    $this->bind(self::$_cache['l'][$this->_lhash]);


But this function bind only declared property of the object, as stated in the banner

/**
* Method to bind an associative array or object to the JTable instance.This
* method only binds properties that are publicly accessible and optionally
* takes an array of properties to ignore when binding.
*

and lookin into code

// Bind the source value, excluding the ignored fields.
foreach ($this->getProperties() as $k => $v)
{
// Only process fields not in the ignore array.
if (!in_array($k, $ignore))
{
if (isset($src[$k]))
{
$this->$k = $src[$k];
}
}
}

If a source/cached property/value does not exist in destination object, it won't be returned by the destination object,  without warning or logging

As result, dynamic property and value of the object was not returned if the object is taken from the cache, while it was retured if the object is loaded from database


One example of this behavior will happen on old VM 2.6.14 where product having customfilelds:
the call to VirtueMartModelProduct::getProductSingle return a TableProducts with missing property/value/array if the object is get from cache,
because in the inside function code the $product->load get a cached partial response, and later it test the missing dynamic property $product->virtuemart_customfield_id to determine if need to call getProductCustomsField, so it does not return the expected complete product.

I know that this is a mix issue between VM a Joomla core, where the core has good reason to return clean well-formed object, while VM has no chance to notice the possible anomaly in chached object returned from the core.


I wrote this memo just to warn all programmers / developers on this behavior, maybe it can help someone in need ...



Title: Re: VmTable::load possible anomaly if returning data from cache
Post by: Milbo on January 26, 2015, 14:46:24 PM
Please check this behaviour in vm3, it should be completly fixed there.