protected static function LogFilter::_saveFilter in Log Filter 7
Insert/update filter in database.
Parameters
string $name:
array $values:
boolean $create:
- default: FALSE
Return value
void
- throws error on failure
Throws
Exception
2 calls to LogFilter::_saveFilter()
- LogFilter::ajaxCallback in ./
LogFilter.inc - Access permission: 'access site reports'.
- LogFilter::viewerFormSubmit in ./
LogFilter.inc - Called when log viewer form submits.
File
- ./
LogFilter.inc, line 1288 - Drupal Log Filter module
Class
- LogFilter
- @file Drupal Log Filter module
Code
protected static function _saveFilter($name, $values, $create = FALSE) {
$uid = $GLOBALS['user']->uid;
if (!user_access('log_filter edit filters')) {
throw new Exception('You\'re not allowed to edit filters.', self::$_errorCodes['perm_filter_crud']);
}
// Filter metadata and last updated by.
$fields = array(
'editor' => $uid,
'changed' => REQUEST_TIME,
'require_admin' => !empty($values['filter']['require_admin']) ? 1 : 0,
'description' => $values['filter']['description'],
);
if ($create) {
$fields['creator'] = $uid;
$fields['created'] = REQUEST_TIME;
}
// Conditions.
$names =& self::$_fields['conditions'];
$conditions =& $values['conditions'];
foreach ($names as $key) {
switch ($key) {
case 'severity':
if (!empty($conditions[$key])) {
if (!is_array($v = $conditions[$key])) {
throw new Exception('Non-empty condition[' . $key . '], type[' . gettype($v) . '], must be array.', self::$_errorCodes['bad_filter_condition']);
}
// Use array values, but convert 'zero' to zero.
// And make sure it's all integers.
$fields[$key] = preg_replace('/[^\\d,]/', '', str_replace('zero', '0', join(',', $v)));
}
else {
$fields[$key] = '';
}
break;
case 'type':
if (!empty($conditions[$key])) {
if (!is_array($v = $conditions[$key])) {
throw new Exception('Non-empty condition[' . $key . '], type[' . gettype($v) . '], must be array.', self::$_errorCodes['bad_filter_condition']);
}
// Use array values, because key is simply numeric index.
$fields[$key] = check_plain(join(',', $v));
}
else {
$fields[$key] = '';
}
break;
case 'time_range':
$fields[$key] = !empty($conditions[$key]) && ($v = (int) $conditions[$key]) > 0 && $v < 10000 ? $v : 0;
break;
case 'time_from':
case 'time_to':
$fields[$key] = !empty($conditions[$key]) && ($v = (int) $conditions[$key]) > 0 && $v <= PHP_INT_MAX ? $v : 0;
break;
case 'role':
case 'uid':
$fields[$key] = array_key_exists($key, $conditions) ? (int) $conditions[$key] : -1;
break;
case 'hostname':
case 'location':
case 'referer':
$fields[$key] = !empty($conditions[$key]) ? check_plain($conditions[$key]) : '';
break;
default:
}
}
// Order by.
$order_by = '';
if (!empty($values['order_by'])) {
$order_by = array();
foreach ($values['order_by'] as $k => $v) {
if (preg_match('/^[a-z\\d_]{2,32}$/', $k) && ($v === 'DESC' || $v === 'ASC')) {
$order_by[] = $k . ':' . $v;
}
}
$fields['order_by'] = join(',', $order_by);
}
else {
$fields['order_by'] = '';
}
// Use unique key on name column for testing uniqueness.
if ($create) {
$fields['name'] = $name;
try {
db_insert('log_filter')
->fields($fields)
->execute();
} catch (PDOException $xc) {
if ((int) $xc
->getCode() == 23000) {
// Fair chance that it's a duplicate key error, though 23000 may also (MySQL) mean null error.
throw new Exception('Filter name[' . $name . '] already exists.', self::$_errorCodes['filter_name_nonunique']);
}
else {
throw $xc;
}
}
}
elseif (!($filter = self::_readFilter($name))) {
if ($filter === FALSE) {
throw new Exception('Filter name[' . $name . '] doesnt exist.', self::$_errorCodes['filter_doesnt_exist']);
}
throw new Exception('User (' . $uid . ') ' . $GLOBALS['user']->name . ' is not allowed to use filter[' . $name . '].', self::$_errorCodes['perm_filter_restricted']);
}
elseif (!db_update('log_filter')
->fields($fields)
->condition('name', $name)
->execute()) {
throw new Exception('Failed to update filter[' . $name . '].', self::$_errorCodes['unknown']);
}
}