Index: includes/database.inc =================================================================== RCS file: /cvs/drupal/drupal/includes/database.inc,v retrieving revision 1.75 diff -u -p -r1.75 database.inc --- includes/database.inc 6 Aug 2007 10:25:56 -0000 1.75 +++ includes/database.inc 21 Aug 2007 01:18:32 -0000 @@ -445,5 +445,39 @@ function db_field_names($fields) { } /** + * A custom error handler for database queries, to provide the calling + * function's filename and line number, rather than db_query()'s. + * + * @see drupal_error_handler + */ +function db_error_handler($errno, $message, $filename, $line) { + // Reset filename and line to the calling function's. + // Index 3 is used because the calling order is: + // db_error_handler() => trigger_error() => _db_query() => db_query() + $backtrace = debug_backtrace(); + $filename = $backtrace[3]['file']; + $line = $backtrace[3]['line']; + + // Commence copy/paste of drupal_error_handler. + + // If the @ error suppression operator was used, error_reporting is temporarily set to 0 + if (error_reporting() == 0) { + return; + } + + if ($errno & (E_ALL)) { + $types = array(1 => 'error', 2 => 'warning', 4 => 'parse error', 8 => 'notice', 16 => 'core error', 32 => 'core warning', 64 => 'compile error', 128 => 'compile warning', 256 => 'user error', 512 => 'user warning', 1024 => 'user notice', 2048 => 'strict warning'); + $entry = $types[$errno] .': '. $message .' in '. $filename .' on line '. $line .'.'; + + // Force display of error messages in update.php + if (variable_get('error_level', 1) == 1 || strstr($_SERVER['PHP_SELF'], 'update.php')) { + drupal_set_message($entry, 'error'); + } + + watchdog('sql', '%message in %file on line %line.', array('%error' => $types[$errno], '%message' => $message, '%file' => $filename, '%line' => $line), WATCHDOG_ERROR); + } +} + +/** * @} End of "defgroup schemaapi". */ Index: includes/database.mysql.inc =================================================================== RCS file: /cvs/drupal/drupal/includes/database.mysql.inc,v retrieving revision 1.78 diff -u -p -r1.78 database.mysql.inc --- includes/database.mysql.inc 12 Aug 2007 15:55:35 -0000 1.78 +++ includes/database.mysql.inc 21 Aug 2007 01:18:32 -0000 @@ -154,7 +154,11 @@ function _db_query($query, $debug = 0) { return $result; } else { + // Temporarily set a db-specific error handler, so we can see the file name + // and line number of the calling function, not db_query(). + set_error_handler('db_error_handler'); trigger_error(check_plain(mysql_error($active_db) ."\nquery: ". $query), E_USER_WARNING); + restore_error_handler(); return FALSE; } } Index: includes/database.mysqli.inc =================================================================== RCS file: /cvs/drupal/drupal/includes/database.mysqli.inc,v retrieving revision 1.42 diff -u -p -r1.42 database.mysqli.inc --- includes/database.mysqli.inc 12 Aug 2007 15:55:35 -0000 1.42 +++ includes/database.mysqli.inc 21 Aug 2007 01:18:32 -0000 @@ -151,7 +151,11 @@ function _db_query($query, $debug = 0) { return $result; } else { - trigger_error(check_plain(mysqli_error($active_db) ."\nquery: ". $query), E_USER_WARNING); + // Temporarily set a db-specific error handler, so we can see the file name + // and line number of the calling function, not db_query(). + set_error_handler('db_error_handler'); + trigger_error(check_plain(mysql_error($active_db) ."\nquery: ". $query), E_USER_WARNING); + restore_error_handler(); return FALSE; } } Index: includes/database.pgsql.inc =================================================================== RCS file: /cvs/drupal/drupal/includes/database.pgsql.inc,v retrieving revision 1.55 diff -u -p -r1.55 database.pgsql.inc --- includes/database.pgsql.inc 12 Aug 2007 15:55:35 -0000 1.55 +++ includes/database.pgsql.inc 21 Aug 2007 01:18:34 -0000 @@ -171,7 +171,11 @@ function _db_query($query, $debug = 0) { return $last_result; } else { - trigger_error(check_plain(pg_last_error($active_db) ."\nquery: ". $query), E_USER_WARNING); + // Temporarily set a db-specific error handler, so we can see the file name + // and line number of the calling function, not db_query(). + set_error_handler('db_error_handler'); + trigger_error(check_plain(mysql_error($active_db) ."\nquery: ". $query), E_USER_WARNING); + restore_error_handler(); return FALSE; } } Index: modules/block/block.admin.inc =================================================================== RCS file: /cvs/drupal/drupal/modules/block/block.admin.inc,v retrieving revision 1.7 diff -u -p -r1.7 block.admin.inc --- modules/block/block.admin.inc 20 Aug 2007 06:41:38 -0000 1.7 +++ modules/block/block.admin.inc 21 Aug 2007 01:18:38 -0000 @@ -103,7 +103,7 @@ function block_admin_configure(&$form_st $form['module'] = array('#type' => 'value', '#value' => $module); $form['delta'] = array('#type' => 'value', '#value' => $delta); - $edit = db_fetch_array(db_query("SELECT pages, visibility, custom, title FROM {blocks} WHERE module = '%s' AND delta = '%s'", $module, $delta)); + $edit = db_fetch_array(db_query("SELECT pagesskdfhjksfhkd, visibility, custom, title FROM {blocks} WHERE module = '%s' AND delta = '%s'", $module, $delta)); $form['block_settings'] = array( '#type' => 'fieldset', @@ -262,7 +262,7 @@ function block_add_block_form_submit($fo foreach (list_themes() as $key => $theme) { if ($theme->status) { - db_query("INSERT INTO {blocks} (visibility, pages, custom, title, module, theme, status, weight, delta, cache) VALUES(%d, '%s', %d, '%s', '%s', '%s', %d, %d, %d, %d)", $form_state['values']['visibility'], trim($form_state['values']['pages']), $form_state['values']['custom'], $form_state['values']['title'], $form_state['values']['module'], $theme->name, 0, 0, $delta, BLOCK_NO_CACHE); + db_query("INSERT INTO {blocks} (visibility, pages, custom, title, module, theme, status, weight, delta, cache) VALUES(%d, '%s', %d, '%s', '%s', '%s', %d, %d, %d )", $form_state['values']['visibility'], trim($form_state['values']['pages']), $form_state['values']['custom'], $form_state['values']['title'], $form_state['values']['module'], $theme->name, 0, 0, $delta, BLOCK_NO_CACHE); } }