Index: modules/dblog/dblog.admin.inc
===================================================================
RCS file: /cvs/drupal/drupal/modules/dblog/dblog.admin.inc,v
retrieving revision 1.22
diff -u -r1.22 dblog.admin.inc
--- modules/dblog/dblog.admin.inc	6 Jun 2009 10:27:42 -0000	1.22
+++ modules/dblog/dblog.admin.inc	3 Jul 2009 06:42:25 -0000
@@ -24,7 +24,6 @@
  * Menu callback; displays a listing of log messages.
  */
 function dblog_overview() {
-  $filter = dblog_build_filter_query();
   $rows = array();
   $icons = array(
     WATCHDOG_DEBUG    => '',
@@ -60,17 +59,14 @@
   );
 
   $query = db_select('watchdog', 'w')->extend('PagerDefault')->extend('TableSort');
+  dblog_build_filter_query($query);
   $query->join('users', 'u', 'w.uid = u.uid');
   $query
     ->fields('w', array('wid', 'uid', 'severity', 'type', 'timestamp', 'message', 'variables', 'link'))
-    ->addField('u', 'name');
-  if (!empty($filter['where'])) {
-    $query->where($filter['where'], $filter['args']);
-  }
-  $result = $query
-    ->limit(50)
-    ->orderByHeader($header)
-    ->execute();
+    ->fields('u', array('name'))
+    ->limit(30)
+    ->orderByHeader($header);
+  $result = $query->execute();
 
   foreach ($result as $dblog) {
     $rows[] = array('data' =>
@@ -193,8 +189,12 @@
 
 /**
  * Build query for dblog administration filters based on session.
+ *
+ * @param $query
+ *   A SelectQuery object for the watchdog table.
+ * @see dblog_overview()
  */
-function dblog_build_filter_query() {
+function dblog_build_filter_query(SelectQueryInterface $query) {
   if (empty($_SESSION['dblog_overview_filter'])) {
     return;
   }
@@ -202,26 +202,17 @@
   $filters = dblog_filters();
 
   // Build query
-  $where = $args = array();
   foreach ($_SESSION['dblog_overview_filter'] as $key => $filter) {
-    $filter_where = array();
+    $filter_where = db_or();
     foreach ($filter as $value) {
-      $filter_where[] = $filters[$key]['where'];
-      $args[] = $value;
+      $filter_where->condition($filters[$key]['where'], $value);
     }
-    if (!empty($filter_where)) {
-      $where[] = '(' . implode(' OR ', $filter_where) . ')';
+    if (count($filter_where) > 0) {
+      $query->condition($filter_where);
     }
   }
-  $where = !empty($where) ? implode(' AND ', $where) : '';
-
-  return array(
-    'where' => $where,
-    'args' => $args,
-  );
 }
 
-
 /**
  * List dblog administration filters that can be applied.
  */
@@ -235,14 +226,14 @@
   if (!empty($types)) {
     $filters['type'] = array(
       'title' => t('Type'),
-      'where' => "w.type = ':s'",
+      'where' => 'w.type',
       'options' => $types,
     );
   }
 
   $filters['severity'] = array(
     'title' => t('Severity'),
-    'where' => 'w.severity = :d',
+    'where' => 'w.severity',
     'options' => watchdog_severity_levels(),
   );
 
Index: modules/dblog/dblog.test
===================================================================
RCS file: /cvs/drupal/drupal/modules/dblog/dblog.test,v
retrieving revision 1.21
diff -u -r1.21 dblog.test
--- modules/dblog/dblog.test	12 Jun 2009 08:39:36 -0000	1.21
+++ modules/dblog/dblog.test	3 Jul 2009 06:42:25 -0000
@@ -389,4 +389,69 @@
     $count = db_query('SELECT COUNT(*) FROM {watchdog}')->fetchField();
     $this->assertEqual($count, 0, t('DBLog contains :count records after a clear.', array(':count' => $count)));
   }
+
+  /**
+   * Checks that messages are filtered correctly. Clears the dblog, adds some events then filters them.
+   */
+  function testFilter() {
+    global $base_root;
+    $include_message = 'Log entry added to test filter include at severity !level';
+    $exclude_message = 'Log entry added to test filter exclude at severity !level';
+    $severities = array(WATCHDOG_EMERG, WATCHDOG_ALERT, WATCHDOG_CRITICAL, WATCHDOG_WARNING, WATCHDOG_NOTICE, WATCHDOG_INFO, WATCHDOG_DEBUG);
+    // Login the admin user.
+    $this->drupalLogin($this->big_user);
+    // Clear any current events
+    $this->drupalPost('admin/reports/dblog', array(), t('Clear log messages'));
+    // Create test events
+    foreach ($severities as $severity) {
+      // Make a message to filter out
+      $log = array(
+        'type'        => 'filter-exclude',
+        'message'     => t($exclude_message, array('!level' => $severity)),
+        'variables'   => array(),
+        'severity'    => $severity,
+        'link'        => NULL,
+        'user'        => $this->big_user,
+        'request_uri' => $base_root . request_uri(),
+        'referer'     => $_SERVER['HTTP_REFERER'],
+        'ip'          => ip_address(),
+        'timestamp'   => REQUEST_TIME,
+      );
+      // Add the watchdog entry.
+      dblog_watchdog($log);
+      // Make an event to keep
+      $log = array(
+        'type'        => 'filter-include',
+        'message'     => t($include_message, array('!level' => $severity)),
+        'variables'   => array(),
+        'severity'    => $severity,
+        'link'        => NULL,
+        'user'        => $this->big_user,
+        'request_uri' => $base_root . request_uri(),
+        'referer'     => $_SERVER['HTTP_REFERER'],
+        'ip'          => ip_address(),
+        'timestamp'   => REQUEST_TIME,
+      );
+      // Add the watchdog entry.
+      dblog_watchdog($log);
+    }
+    // Apply a filter to the log.
+    foreach ($severities as $severity) {
+      $edit = array();
+      $edit['type[]'] = 'filter-include';
+      $edit['severity[]'] = $severity;
+      $this->drupalPost('admin/reports/dblog', $edit, t('Filter'));
+      // be sure the log message that should show does and the one that shouldn't doesn't
+      $this->assertText(t($include_message, array('!level' => $severity)), t('Filter includes messages at severity !level', array('!level' => $severity)), 'DBLog');
+      $this->assertNoText(t($exclude_message, array('!level' => $severity)), t('Filter excludes messages at severity !level', array('!level' => $severity)), 'DBLog');
+    }
+    // Reset the filter, we should see excluded messages too
+    $this->drupalPost('admin/reports/dblog', array(), t('Reset'));
+    foreach ($severities as $severity) {
+      $this->assertText(t($exclude_message, array('!level' => $severity)), t('Show previously excluded messages at severity !level', array('!level' => $severity)), 'DBLog');
+    }
+
+    // Clean up - clear the events
+    $this->drupalPost('admin/reports/dblog', array(), t('Clear log messages'));
+  }
 }
