You are here

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']);
  }
}