to implement the " ON DUPLICATE KEY UPDATE" i add a $duplicate and these lines in class/model/write.php insert function:
public function insertUpdate(&$object, $duplicate = array(), $force = true)
{
$handler = $this->loadHandler('write');
if (!$object->isDirty()) {
trigger_error("Data entry is not inserted - the object '" . get_class($object) . "' is not dirty", E_USER_NOTICE);
return $object->getVar($this->keyName);
}
if (!$handler->cleanVars($object)) {
trigger_error("Insert failed in method 'cleanVars' of object '" . get_class($object) . "'", E_USER_WARNING);
return $object->getVar($this->keyName);
}
$queryFunc = empty($force) ? "query" : "queryF";
if ($object->isNew()) {
$sql = "INSERT INTO {$this->table}";
if (!empty($object->cleanVars)) {
$keys = array_keys($object->cleanVars);
$vals = array_values($object->cleanVars);
$sql .= " (" . implode(", ", $keys) . ") VALUES (" . implode(",", $vals) . ")";
} else {
trigger_error("Data entry is not inserted - no variable is changed in object of '" . get_class($object) . "'", E_USER_NOTICE);
return $object->getVar($this->keyName);
}
// START ON DUPLICATE KEY UPDATE
if(!empty($duplicate)) {
$sql .= " ON DUPLICATE KEY UPDATE";
$keys = array();
foreach($duplicate as $keyD=>$valD) {
$keys[] = " {$keyD} = {$valD} ";
}
$sql .= implode(", ", $keys);
}
// END ON DUPLICATE KEY UPDATE
if (!$result = $this->db->{$queryFunc}($sql)) {
return false;
}
if (!$object->getVar($this->keyName) && $object_id = $this->db->getInsertId()) {
$object->assignVar($this->keyName, $object_id);
}
} else if (!empty($object->cleanVars)) {
$keys = array();
foreach ($object->cleanVars as $k => $v) {
$keys[] = " `{$k}` = {$v}";
}
$sql = "UPDATE `" . $this->table . "` SET " . implode(",", $keys) . " WHERE `" . $this->keyName . "` = " . $this->db->quote($object->getVar($this->keyName));
if (!$result = $this->db->{$queryFunc}($sql)) {
return false;
}
}
return $object->getVar($this->keyName);
}
then i can use it like this:
$ret = $this->userlog->getHandler('stats')->insertUpdate($statsObj, array("stats_value"=>(empty($increment) ? $value : "stats_value + {$value}"), "time_update"=>time()));
and the query is like this: for example for browser = Chrome 26.0
0.000328 - INSERT INTO mod_userlog_stats (stats_type, stats_link, stats_value, stats_period, time_update) VALUES ('browser','Chrome 26.0',1,0,1367673147) ON DUPLICATE KEY UPDATE stats_value = stats_value + 1 , time_update = 1367673147
is this good enough and
most efficient query for increment? I cannot see any functionality in Core for increments like hits = hits + 1
@redheadedrod:
The logger is good enough. I also think it is good to have an option to show/hide prefix in the tables.
then it is up to the core developers how to implement that.