Index: modules/devel/devel.module
===================================================================
RCS file: modules/devel/devel.module
diff -N modules/devel/devel.module
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ modules/devel/devel.module	1 Jan 1970 00:00:00 -0000
@@ -0,0 +1,1140 @@
+<?php
+// $Id: devel.module,v 1.106.4.41 2007/03/29 14:26:15 weitzman Exp $
+
+// This module holds functions useful for Drupal development.
+// Please contribute!
+
+// suggested profiling and stacktrace library from http://www.xdebug.org/index.php
+// if you activate this extension, this module will use it.
+// you probably want these php.ini or .htaccess directives:
+// xdebug.auto_profile=1
+// xdebug.auto_profile_mode=3
+// xdebug.output_dir='/php'
+// xdebug.default_enable
+
+define('DEVEL_QUERY_SORT_BY_SOURCE', 0);
+define('DEVEL_QUERY_SORT_BY_DURATION', 1);
+
+define('DEVEL_ERROR_HANDLER_NONE', 0);
+define('DEVEL_ERROR_HANDLER_STANDARD', 1);
+define('DEVEL_ERROR_HANDLER_BACKTRACE', 2);
+
+define('DEVEL_MIN_TEXTAREA', 50);
+
+/**
+ * Implementation of hook_help().
+ */
+function devel_help($section) {
+  switch ($section) {
+    case 'admin/settings/devel':
+      return '<p>'. t('Helper functions, pages, and blocks to assist Drupal developers. The devel blocks can be managed via the !block page.', array('!block' => l(t('block administration'), 'admin/build/block'))). '</p>';
+    case 'devel/reference':
+      return '<p>'. t('This is a list of defined user functions that generated this current request lifecycle. Click on a function name to view its documention.'). '</p>';
+    case 'devel/reinstall':
+      return '<p>'. t('Clicking a module\'s reinstall button will simulate installing a module. <code>hook_install()</code> will be executed and the schema version number will be set to the most recent update number. Make sure to manually clear out any existing tables first.'). '</p>';
+    case 'devel/session':
+      return '<p>'. t('Here are the contents of your <code>$_SESSION</code> variable.'). '</p>';
+    case 'devel/variable':
+      return '<p>'. t('This is a list of the variables and their values currently stored in variables table and the <code>$conf</code> array of your settings.php file. These variables are usually accessed with <a href="@variable-get-doc">variable_get()</a> and <a href="@variable-set-doc">variable_set()</a>. Variables that are too long can slow down your pages.', array('@variable-get-doc' => 'http://api.drupal.org/api/HEAD/function/variable_get', '@variable-set-doc' => 'http://api.drupal.org/api/HEAD/function/variable_set')).'</p>';
+  }
+}
+
+/**
+ * Implementation of hook_menu().
+ */
+function devel_menu($may_cache) {
+  $items = array();
+
+  if ($may_cache) {
+    $items[] = array('path' => 'devel/cache/clear',
+      'title' => t('Empty cache'),
+      'callback' => 'devel_cache_clear',
+      'access' => user_access('access devel information'),
+      'type' => MENU_CALLBACK,
+    );
+    $items[] = array('path' => 'devel/queries',
+      'title' => t('Database queries'),
+      'callback' => 'devel_queries',
+      'access' => user_access('access devel information'));
+    $items[] = array('path' => 'devel/queries/empty',
+      'title' => t('Empty database queries'),
+      'callback' => 'devel_queries_empty',
+      'access' => user_access('access devel information'),
+      'type' => MENU_CALLBACK);
+    $items[] = array('path' => 'devel/reference',
+      'title' => t('function reference'),
+      'callback' => 'devel_function_reference',
+      'access' => user_access('access devel information'),
+      'type' => MENU_CALLBACK,
+    );
+    $items[] = array('path' => 'devel/reinstall',
+      'title' => t('Reinstall modules'),
+      'callback' => 'devel_reinstall',
+      'access' => user_access('access devel information'),
+      'type' => MENU_CALLBACK,
+    );
+    if (module_exists('menu')) {
+      $items[] = array('path' => 'devel/menu/reset',
+        'title' => t('Reset menus'),
+        'callback' => 'drupal_get_form',
+        'callback arguments' => 'devel_menu_reset_form',
+        'access' => user_access('access devel information'),
+        'type' => MENU_CALLBACK,
+      );
+    }
+    $items[] = array('path' => 'devel/variable',
+      'title' => t('Variable editor'),
+      'callback' => 'devel_variable_page',
+      'access' => user_access('access devel information'),
+      'type' => MENU_CALLBACK,
+    );
+    $items[] = array('path' => 'devel/variable/edit',
+      'title' => t('Variable editor'),
+      'callback' => 'drupal_get_form',
+      'callback arguments' => array('devel_variable_edit'),
+      'access' => user_access('access devel information'),
+      'type' => MENU_CALLBACK,
+    );
+    $items[] = array('path' => 'devel/variable/delete',
+      'title' => t('Variable editor'),
+      'callback' => 'drupal_get_form',
+      'callback arguments' => array('devel_variable_delete'),
+      'access' => user_access('access devel information'),
+      'type' => MENU_CALLBACK,
+    );
+    $items[] = array('path' => 'devel/session',
+      'title' => t('Session viewer'),
+      'callback' => 'devel_session',
+      'access' => user_access('access devel information'),
+      'type' => MENU_CALLBACK,
+    );
+    $items[] = array('path' => 'devel/switch',
+      'title' => t('Switch user'),
+      'callback' => 'devel_switch_user',
+      'access' => user_access('switch users'),
+      'type' => MENU_CALLBACK,
+    );
+    $items[] = array(
+      'path' => 'admin/settings/devel',
+      'title' => t('Devel'),
+      'callback' => 'drupal_get_form',
+      'callback arguments' => array('devel_admin_settings'),
+      'access' => user_access('administer site configuration'),
+      'type' => MENU_NORMAL_ITEM
+    );
+  }
+  else {
+    if (is_numeric(arg(1))) {
+      if (arg(0) == 'node') {
+        $items[] = array('path' => 'node/'. arg(1) .'/load',
+          'title' => t('Dev load'),
+          'callback' => 'devel_load_object',
+          'callback arguments' => array('node', arg(1)),
+          'access' => user_access('access devel information'),
+          'type' => MENU_LOCAL_TASK,
+        );
+        $items[] = array('path' => 'node/'. arg(1) .'/render',
+          'title' => t('Dev render'),
+          'callback' => 'devel_render_object',
+          'callback arguments' => array('node', arg(1)),
+          'access' => user_access('access devel information'),
+          'type' => MENU_LOCAL_TASK,
+        );
+      }
+      elseif (arg(0) == 'user') {
+        $items[] = array('path' => 'user/'. arg(1) .'/load',
+          'title' => t('Devel load'),
+          'callback' => 'devel_load_object',
+          'callback arguments' => array('user', arg(1)),
+          'access' => user_access('access devel information'),
+          'type' => MENU_LOCAL_TASK,
+        );
+      }
+    }
+    drupal_add_css(drupal_get_path('module', 'devel') .'/devel.css');
+  }
+
+  return $items;
+}
+
+/**
+ * Implementation of hook_init(). Avoids custom error handling for better
+ * behavior when stepping though in a debugger.
+ */
+function devel_init() {    
+  if (strstr($_SERVER['PHP_SELF'], 'update.php') || strstr($_GET['q'], 'autocomplete')) {
+    // update.php relies on standard error handler
+  }
+  else {
+    register_shutdown_function('devel_shutdown');
+    if (variable_get('dev_mem', 0) && function_exists('memory_get_usage')) {
+      global $memory_init;
+
+      $memory_init = memory_get_usage();
+    }
+    $handler = variable_get('devel_error_handler', DEVEL_ERROR_HANDLER_STANDARD);
+    switch ($handler) {
+      case DEVEL_ERROR_HANDLER_STANDARD:
+        // do nothing
+        break;
+      case DEVEL_ERROR_HANDLER_BACKTRACE:
+        set_error_handler('backtrace_error_handler');
+        break;
+      case DEVEL_ERROR_HANDLER_NONE:
+        restore_error_handler();
+        break;
+    }
+  }
+}
+
+function backtrace_error_handler($errno, $message, $filename, $line) {
+  if ($errno & (E_ALL ^ E_NOTICE)) {
+    $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 .'.';
+
+    if (variable_get('error_level', 1) == 1) {
+      $backtrace = debug_backtrace();
+      array_shift($backtrace);
+      $rows[0][] = array('data' => '<strong>'. $entry. '</strong>', 'colspan' => 3);
+      $i=1;
+      foreach ($backtrace as $trace) {
+        $rows[$i][] = $trace['class']. $trace['type']. l($trace['function'], "http://api.drupal.org/api/HEAD/function/". $trace['function']);
+        $rows[$i][] = $trace['file'] ? $trace['file']. ': '. $trace['line'] : '';
+        if (!empty($trace['args'])) {
+          foreach ($trace['args'] as $arg) {
+            if (is_array($arg) || is_object($arg)) {
+              $args[] = dpr($arg, TRUE);
+            }
+            else {
+              $args[] = check_plain($arg);
+            }
+          }
+          $rows[$i][] = implode(', ', $args);
+          $i++;
+          unset($args);
+        }
+      }
+      if (function_exists('theme_table')) {
+        $header = array('function', 'file: line', 'arguments');
+        print theme('table', $header, $rows);
+      }
+      else {
+        print_r($rows);
+      }
+    }
+
+    watchdog('php', t('%message in %file on line %line.', array('%error' => $types[$errno], '%message' => $message, '%file' => $filename, '%line' => $line)), WATCHDOG_ERROR);
+  }
+}
+
+/**
+ * Implementation of hook_perm().
+ */
+function devel_perm() {
+  return array('access devel information', 'execute php code', 'switch users');
+}
+
+/**
+ * Implementation of hook_block().
+ */
+function devel_block($op = 'list', $delta = 0) {
+  if ($op == 'list') {
+    $blocks[0]['info'] = t('Switch user');
+    $blocks[1]['info'] = t('Devel');
+    $blocks[2]['info'] = t('Execute PHP');    
+    return $blocks;
+  }
+  else if ($op == 'view') {
+    switch ($delta) {
+      case 0:
+        $block['subject'] = t('switch user');
+        if (user_access('switch users')) {
+          $users = db_query_range('SELECT uid, name FROM {users} WHERE uid > 0 ORDER BY access DESC', 0, 10);
+          while ($account = db_fetch_object($users)) {
+            $dest = drupal_get_destination();
+            $links[] = l(check_plain($account->name), 'devel/switch/'. $account->name, array(), $dest);
+          }
+        }
+        if ($links) {
+          $block['content'] = theme('item_list', $links);
+          $block['content'] .= drupal_get_form('devel_switch_user_form');
+        }
+        break;
+      case 1:
+        $links = array();
+        $block['subject'] = t('devel');
+        if (user_access('access devel information')) {
+          $links[] = l('Devel settings', 'admin/settings/devel', array('title' => t('Adjust module settings for devel module')));
+          $links[] = l('Empty cache', 'devel/cache/clear', array('title' => t('Clear the database cache tables which store page, menu, node, and variable caches.')), drupal_get_destination());
+          $links[] = l('Phpinfo()', 'admin/logs/status/php');
+          $links[] = l('Function reference', 'devel/reference', array('title' => t('View a list of currently defined user functions with documentation links')));
+          $links[] = l('Reinstall modules', 'devel/reinstall', array('title' => t('Re-run hook_install() for a given module')));
+          $links[] = l('Reset menus', 'devel/menu/reset', array('title' => t('Resets all menu items to their default settings')));
+          $links[] = l('Variable editor', 'devel/variable', array('title' => t('Edit and delete site variables')));
+          $links[] = l('Session viewer', 'devel/session', array('title' => t('List the contents of $_SESSION')));
+        }
+        if (function_exists('devel_node_access_perm') && user_access(DNA_ACCESS_VIEW)) {
+          // True only if devel_node_access enabled.
+          $links[] = l('Node access summary', 'devel/node_access/summary');
+        }
+        if ($links) {
+          $block['content'] = theme('item_list', $links);
+        }
+        break;
+      case 2:
+        if (user_access('execute php code')) {
+          $block['subject'] = t('Execute php');
+          $block['content'] = drupal_get_form('devel_execute_form');
+        }
+        break;
+    }
+
+    return $block;
+  }
+}
+
+function devel_switch_user_form() {
+  $form['username'] = array(
+    '#type' => 'textfield',
+    '#description' => t('Enter username'),
+    '#size' => 16,
+    '#maxlength' => 255,
+  );
+  $form['submit'] = array(
+    '#type' => 'submit', 
+    '#value' => t('Switch'),
+  );
+  return $form;
+  
+}
+
+function devel_switch_user_form_validate($form_id, $form_values) {
+  if (!$account = user_load(array('name' => $form_values['username']))) {
+    form_set_error('username', t('Username not found'));
+  } 
+}
+
+function devel_switch_user_form_submit($form_id, $form_values) {
+  return 'devel/switch/'. $form_values['username'];
+}
+
+/**
+ * Implementation of hook_form_alter().
+ */
+function devel_form_alter($form_id, &$form, $key_in = NULL) {
+  if (user_access('access devel information') && variable_get('devel_form_weights', 0)) {
+    $children = element_children($form);
+    if (empty($children)) {
+      if (isset($form['#type']) && !in_array($form['#type'], array('value', 'hidden'))) {
+        if (!isset($form['#title'])) {
+          $form['#title'] = '';
+        }
+        $form['#title'] .= " (key=$key_in, weight=". (isset($form['#weight']) ? $form['#weight'] : 0) .')';
+      }
+    }
+    else {
+      foreach (element_children($form) as $key) {
+        // We need to add the weight to fieldsets.
+        if (element_children($form[$key])) { // Which are a container of others.
+          if (!isset($form[$key]['#title'])) {
+            $form[$key]['#title'] = '';
+          }
+          $form[$key]['#title'] .= " (key=$key, weight=". (isset($form[$key]['#weight']) ? $form[$key]['#weight'] : 0) .')';
+        }
+        devel_form_alter($form_id, $form[$key], $key);
+      }
+    }
+  }
+}
+
+function devel_exit($destination = NULL) {
+  if (isset($destination)) {
+    // The page we are leaving is a drupal_goto(). Present a redirection page
+    // so that the developer can see the intermediate query log.
+    if (user_access('access devel information') && variable_get('devel_redirect_page', 0)) {
+      $output = t('<p>The user is being redirected to <a href="@destination">@destination</a>.</p>', array('@destination' => $destination));
+      print theme('page', $output);
+
+      // Don't allow the automatic redirect to happen.
+      drupal_page_footer();
+      exit();
+    }
+    else {
+      // Make sure not to print anything before the automatic redirect.
+      return;
+    }
+  }
+}
+
+/**
+ * See devel_init() which registers this function as a shutdown function. Displays developer information in the footer.
+ */
+function devel_shutdown() {
+  global $queries, $memory_init;
+
+  $output = '';
+
+  // Try not to break non html pages.
+  if (function_exists('drupal_get_headers')) {
+    $headers = drupal_get_headers();
+    if(strstr($headers, 'xml') || strstr($headers, 'javascript') || strstr($headers, 'plain')) {
+      return;
+    }
+  }
+  
+  if (function_exists('user_access') && user_access('access devel information')) {
+    
+    list($counts, $query_summary) = devel_query_summary();
+    // Query log off, timer on.
+    if (!variable_get('devel_query_display', 0) && variable_get('dev_timer', 0)) {
+      $output = '<div class="dev-timer">'. devel_timer() .' '. $query_summary. '</div>';
+    }
+
+    // Query log on.
+    $sum = 0;
+    if (variable_get('devel_query_display', FALSE)) {
+      $output .= '<div class="dev-query">';
+      $output .= $query_summary;
+      if (function_exists('theme_table')) {
+        $txt .= t(' Queries taking longer than %threshold ms and queries executed more than once, are <span class="marker">highlighted</span>.', array('%threshold' => variable_get('devel_execution', 5)));
+        if (variable_get('dev_timer', 0)) {
+          $txt .= devel_timer();
+        }
+        $output .= $txt. devel_query_table($queries, $counts);
+      }
+      else {
+        $output .= $txt;
+        ob_start();
+        dprint_r($queries);
+        $output .= ob_get_clean();
+      }
+      $output .= '</div>';
+    }
+    
+    if (variable_get('dev_mem', FALSE) && function_exists('memory_get_usage')) {
+      $memory_shutdown = memory_get_usage();
+      $list = array();
+      foreach (array('devel_init()' => $memory_init, 'devel_shutdown()' => $memory_shutdown) as $type => $value) {
+        $list[] = t('Memory used at %type: %value MB', array('%type' => $type, '%value' => round($value / 1024 / 1024, 2)));
+      }
+      $output .= '<div class="dev-memory-usage"><h3>'. 'Memory usage:' .'</h3>'. theme('item_list', $list) .'</div>';
+    }
+    // TODO: gzip this text if we are sending a gzip page. see drupal_page_header(). 
+    
+    // this makes sure all of the HTML is within the <body> even though this <script> is outside it
+    print '<script type="text/javascript">
+      $(document).ready(function() {
+        $("body").append("'. str_replace(array("\r", "\n", "<", ">", "&"),
+                                         array('\r', '\n', '\x3c', '\x3e', '\x26'),
+                                         addslashes($output)) .'");
+      });
+    </script>';
+  }             
+
+  devel_store_queries();
+}
+
+function devel_store_queries() {
+  if (variable_get('devel_store_queries', 0) && rand(1, variable_get('devel_store_random', 1)) == 1) {
+    global $active_db, $queries;
+    $qids = array();
+    $values = array();
+    $fields = array();
+    // We need this for the devel_queries insert below.
+    setlocale(LC_NUMERIC, 'C');
+    foreach ($queries as $value) {
+      list($function, $query) = explode("\n", $value[0]);
+      $query = preg_replace(array("/'.*'/s", "/\d.*\.\d.*/", "/\d.*/"), array("S", "F", "D"), $query);
+      $hash = md5($function . $query);
+      if (!isset($qids[$hash])) {
+        $qids[$hash] = db_result(devel_db_query("SELECT qid FROM {devel_queries} WHERE hash = '%s'", $hash));
+        if (!$qids[$hash]) {
+          devel_db_query("INSERT INTO {devel_queries} (query, function, hash) VALUES ('%s', '%s', '%s')", $query, $function, $hash);
+          $qids[$hash] = mysql_insert_id();
+        }
+      }
+      $fields[] = "(%d, '%f')";
+      $values[] = $qids[$hash];
+      $values[] = $value[1];
+    }
+    if (count($fields)) {
+      devel_db_query('INSERT INTO {devel_times} (qid, time) VALUES '. implode(',', $fields), $values);
+    }
+  }
+}
+
+function devel_query_summary() {
+  if (variable_get('dev_query', FALSE)) {
+    global $queries;
+    foreach ($queries as $query) {
+      $text[] = $query[0];
+      $sum += $query[1];
+    }
+    $counts = array_count_values($text);
+    return array($counts, t('Executed %queries queries in %time milliseconds.', array('%queries' => count($queries), '%time' => round($sum * 1000, 2))));
+  }
+}
+
+/**
+ * Returns a list of all currently defined user functions in the current 
+ * request lifecycle, with links their documentation.
+ */
+function devel_function_reference() {
+  $functions = get_defined_functions();
+  $ufunctions = $functions['user'];
+  sort($ufunctions);
+  foreach($ufunctions as $function) {
+    $links[] = l($function, "http://api.drupal.org/api/HEAD/function/$function");
+  }
+  return theme('item_list', $links);
+}
+ 
+function devel_db_query($query) {
+  global $active_db;
+  $args = func_get_args();
+  array_shift($args);
+  $query = db_prefix_tables($query);
+  if (isset($args[0]) and is_array($args[0])) { // 'All arguments in one array' syntax
+    $args = $args[0];
+  }
+  _db_query_callback($args, TRUE);
+  $query = preg_replace_callback(DB_QUERY_REGEXP, '_db_query_callback', $query);
+  return mysql_query($query, $active_db);
+}
+
+function devel_admin_settings() {
+  $form['queries'] = array('#type' => 'fieldset', '#title' => t('Query log'));
+  $form['queries']['dev_query'] = array('#type' => 'checkbox',
+    '#title' => t('Collect query info'),
+    '#default_value' => variable_get('dev_query', 0),
+    '#description' => t("Collect query info. If disabled, no query log functionality will work."));
+  $form['queries']['devel_query_display'] = array('#type' => 'checkbox',
+    '#title' => t('Display query log'),
+    '#default_value' => variable_get('devel_query_display', 0),
+    '#description' => t('Display a log of the database queries needed to generate the current page, and the execution time for each. Also, queries which are repeated during a single page view are summed in the # column, and printed in red since they are candidates for caching.'));
+  $form['queries']['devel_query_sort'] = array('#type' => 'radios',
+    '#title' => t('Sort query log'),
+    '#default_value' =>   variable_get('devel_query_sort', DEVEL_QUERY_SORT_BY_SOURCE),
+    '#options' => array(t('by source'), t('by duration')),
+    '#description' => t('The query table can be sorted in the order that the queries were executed or by descending duration.'),
+  );
+  $form['queries']['devel_execution'] = array('#type' => 'textfield',
+    '#title' => t('Slow query highlighting'),
+    '#default_value' => variable_get('devel_execution', 5),
+    '#size' => 4,
+    '#maxlength' => 4,
+    '#description' => t('Enter an integer in milliseconds. Any query which takes longer than this many milliseconds will be highlighted in the query log. This indicates a possibly inefficient query, or a candidate for caching.'),
+  );
+  $form['queries']['devel_store_queries'] = array('#type' => 'checkbox', 
+    '#title' => t('Store executed queries'), 
+    '#default_value' => variable_get('devel_store_queries', 0), 
+    '#description' => t('Store statistics about executed queries. See the devel_x tables. This feature is currently only available for the MySQL database backend.'));
+  $form['queries']['devel_store_random'] = array('#type' => 'textfield', 
+    '#title' => t('Sampling interval'), 
+    '#default_value' => variable_get('devel_store_random', 1), 
+    '#size' => 4, 
+    '#description' => t('If storing query statistics, only store every nth page view. 1 means every page view, 2 every second, and so on.'));
+  
+  $form['dev_timer'] = array('#type' => 'checkbox',
+    '#title' => t('Display page timer'),
+    '#default_value' => variable_get('dev_timer', 0),
+    '#description' => t('Display page execution time in the query log box.'),
+  );
+  $form['dev_mem'] = array('#type' => 'checkbox',
+    '#title' => t('Display memory usage'),
+    '#default_value' => variable_get('dev_mem', 0),
+    '#description' => t('Display how much memory is used to generate the current page. This will show memory usage when devel_init() is called and when devel_exit() is called. PHP must have been compiled with the <em>--enable-memory-limit</em> configuration option for this feature to work.'),
+  );
+  $form['devel_redirect_page'] = array('#type' => 'checkbox',
+    '#title' => t('Display redirection page'),
+    '#default_value' => variable_get('devel_redirect_page', 0),
+    '#description' => t('When a module executes drupal_goto(), the query log and other developer information is lost. Enabling this setting presents an intermediate page to developers so that the log can be examined before continuing to the destination page.'),
+  );
+  $form['devel_form_weights'] = array('#type' => 'checkbox',
+    '#title' => t('Display form element keys and weights'),
+    '#default_value' => variable_get('devel_form_weights', 0),
+    '#description' => t('Form element names are needed for performing themeing or altering a form. Their weights determine the position of the element. Enabling this setting will show these keys and weights beside each form item.'),
+  );
+  $form['devel_error_handler'] = array('#type' => 'radios',
+    '#title' => t('Error handler'),
+    '#default_value' => variable_get('devel_error_handler', DEVEL_ERROR_HANDLER_STANDARD),
+    '#options' => array(DEVEL_ERROR_HANDLER_NONE => t('None'), DEVEL_ERROR_HANDLER_STANDARD => t('Standard drupal'), DEVEL_ERROR_HANDLER_BACKTRACE => t('Backtrace')),
+    '#description' => t('Choose an error handler for your site. <em>Backtrace</em> prints nice debug information when an error is noticed, and you !choose. <em>None</em> is a good option when stepping through the site in your debugger.', array('!choose' => l(t('to show errors on screen'), 'admin/settings/error-reporting'))),
+  );
+
+  // Save any old SMTP library
+  if (variable_get('smtp_library', '') != '' && variable_get('smtp_library', '') != drupal_get_filename('module', 'devel')) {
+    variable_set('devel_old_smtp_library', variable_get('smtp_library', ''));
+  }
+  $smtp_options = array(
+    '' => t('Default'),
+    drupal_get_filename('module', 'devel') => t('Log only'),
+  );
+  if (variable_get('devel_old_smtp_library', '') != '') {
+    $smtp_options[variable_get('devel_old_smtp_library', '')] = t('Other (%library)', array('%library' => variable_get('devel_old_smtp_library', '')));
+  }
+  $form['smtp_library'] = array(
+    '#type' => 'radios',
+    '#title' => t('SMTP library'),
+    '#options' => $smtp_options,
+    '#default_value' => variable_get('smtp_library', ''),
+  );
+
+  return system_settings_form($form);
+}
+
+/**
+ * Menu callback; clears all caches, then redirects to the previous page.
+ */
+function devel_cache_clear() {
+  // clear preprocessor cache
+  drupal_clear_css_cache();
+  
+  // clear core tables
+  $core = array('cache', 'cache_filter', 'cache_menu', 'cache_page');  
+  $alltables = $core + module_invoke_all('devel_caches');
+  foreach ($alltables as $table) {
+    cache_clear_all('*', $table, TRUE);
+  }
+  drupal_set_message('Cache cleared.');
+  drupal_goto();
+}
+
+/**
+ * Generates the execute block form.
+ */
+function devel_execute_form() {
+  $form['code'] = array(
+    '#type' => 'textarea',
+    '#title' => t('PHP code to execute'),
+    '#description' => t('Enter some code. Do not use <code>&lt;?php ?&gt;</code> tags.')
+  );
+  $form['op'] = array('#type' => 'submit', '#value' => t('Execute'));
+  $form['#redirect'] = FALSE;
+  return $form;
+}
+
+/**
+ * Process PHP execute form submissions.
+ */
+function devel_execute_form_submit($form_id, $form) {
+  ob_start();
+  print eval($form['code']);
+  dsm(ob_get_clean());
+}
+
+/**
+ * Menu callback; clear the database, resetting the menu to factory defaults.
+ */
+function devel_menu_reset_form() {
+  return confirm_form(array(), 
+    t('Are you sure you want to reset all menu items to their default settings?'), 
+    'admin/build/menu', 
+    t('Any custom additions or changes to the menu will be lost.'), 
+    t('Reset all'),
+    t('Cancel')
+  );
+}
+
+/**
+ * Process menu reset form submission.
+ */
+function devel_menu_reset_form_submit() {
+  db_query('DELETE FROM {menu}');
+  $mid = module_invoke('menu', 'edit_item_save', array('title' => t('Primary links'), 'pid' => 0, 'type' => MENU_CUSTOM_MENU));
+  variable_set('menu_primary_menu', $mid);
+  variable_set('menu_secondary_menu', $mid);
+
+  drupal_set_message(t('The menu items have been reset to their default settings.'));
+
+  return 'admin/build/menu';
+}
+
+/**
+ * Implementation of hook_forms().
+ */
+function devel_forms() {
+  $forms = array();
+  if (user_access('access devel information')) {
+    // registers each devel_reinstall_$module form_id
+    $modules = module_list();
+    foreach ($modules as $module) {
+      $forms['devel_reinstall_'. $module]['callback'] = 'devel_reinstall_form';
+    }
+  }
+  return $forms;
+}
+
+function devel_reinstall_form($module) {
+  $form = array(
+    '#base' => 'devel_reinstall',
+    'submit' => array(
+      '#type' => 'submit',
+      '#value' => t('Reinstall @name module', array('@name' => $module))
+    ),
+  );
+  return $form;
+}
+
+/**
+ * Menu callback; Display a list of installed modules with the option to reinstall them via hook_install.
+ */
+function devel_reinstall() {
+  $output = '';
+  $modules = module_list();
+  sort($modules);
+  foreach ($modules as $module) {
+    $output .= drupal_get_form('devel_reinstall_'. $module, $module);
+  }
+
+  return $output;
+}
+
+/**
+ * Process reinstall menu form submissions.
+ */
+function devel_reinstall_submit($form_id, $form_values) {
+  include_once './includes/install.inc';
+  $module = str_replace('devel_reinstall_', '', $form_id);
+  $versions = drupal_get_schema_versions($module);
+  drupal_set_installed_schema_version($module, $versions ? max($versions) : SCHEMA_INSTALLED);
+  module_invoke($module, 'install');
+  drupal_set_message(t('Reinstalled the %name module.', array('%name' => $module)));
+}
+
+/**
+ * Menu callback; display all variables.
+ */
+function devel_variable_page() {
+  // we print our own page so as to avoid blocks
+  $output = drupal_get_form('devel_variable');
+  print theme('page', $output, FALSE);
+}
+
+function devel_variable() {
+  $header = array(
+    array(''),
+    array('data' => t('Name'), 'field' => 'name', 'sort' => 'asc'),
+    array('data' => t('Value'), 'field' => 'value'),
+    array('data' => t('Length'), 'field' => 'length'),
+    array('data' => t('Operations')),
+  );
+  // TODO: we could get variables out of $conf but that would include hard coded ones too. ideally i would highlight overrridden/hard coded variables
+  $sql = "SELECT *, LENGTH(value) AS length FROM {variable}";
+  $result = db_query($sql. tablesort_sql($header));
+  while ($row = db_fetch_object($result)) {
+    $variables[$row->name] = '';
+    $form['name'][$row->name] = array('#value' => $row->name);
+    if (drupal_strlen($row->value) > 70) {
+      $value = drupal_substr($row->value, 0, 65) .'...';
+    }
+    else {
+      $value = $row->value;
+    }
+    $form[$row->name]['value'] = array('#value' => $value);
+    $form[$row->name]['length'] = array('#value' => $row->length);
+    $form[$row->name]['edit'] = array('#value' => l(t('edit'), "devel/variable/edit/$row->name"));
+  }
+  $form['variables'] = array('#type' => 'checkboxes', '#options' => $variables);
+  $form['submit'] = array(
+    '#type' => 'submit', 
+    '#value' => t('Delete'),
+  );
+  return $form;
+}
+
+function theme_devel_variable($form) {
+  $children = element_children($form['name']);
+  foreach ($children as $key) {      
+    $rows[] = array(
+      drupal_render($form['variables'][$key]),
+      drupal_render($form['name'][$key]),
+      drupal_render($form[$key]['value']),
+      drupal_render($form[$key]['length']),
+      drupal_render($form[$key]['edit']),
+    );
+  }
+  $header = array(
+    theme('table_select_header_cell'),
+    array('data' => t('Name'), 'field' => 'name', 'sort' => 'asc'),
+    array('data' => t('Value'), 'field' => 'value'),
+    array('data' => t('Length'), 'field' => 'length'),
+    array('data' => t('Operations'), 'colspan' => 2),
+  );
+  $output = theme('table', $header, $rows);
+  $output .= drupal_render($form);
+
+  return $output;
+}
+
+function devel_variable_submit($form_id, $form_values) {
+  $deletes = array_filter($form_values['variables']);
+  array_walk($deletes, 'variable_del');
+  drupal_set_message(format_plural(count($deletes), 'one variable deleted', '@count variables deleted'));
+}
+
+function devel_variable_edit($name) {
+  $value = variable_get($name, 'not found');
+  $form['name'] = array(
+    '#type' => 'value', 
+    '#value' => $name
+  );
+  $form['value'] = array(
+    '#type' => 'item',
+    '#title' => t('Old value'), // maybe check_plain() done by fapi
+    '#value' => dpr($value, TRUE),
+  );
+  if (is_string($value)) {
+    $form['new'] = array(
+      '#type' => 'textarea', 
+      '#title' => t('New value'),
+      '#default_value' => $value
+    );
+    $form['submit'] = array(
+      '#type' => 'submit', 
+      '#value' => t('Submit'),
+    );
+  }
+  else {
+    $form['new'] = array(
+      '#type' => 'item', 
+      '#title' => t('New value'),
+      '#value' => t('Sorry, complex variable types may not be edited yet. Use the <em>Execute PHP</em> block and the <a href="@variable-set-doc">variable_set()</a> function.', array('@variable-set-doc' => 'http://api.drupal.org/api/HEAD/function/variable_set'))
+    );
+  }
+  drupal_set_title($name);
+  return $form;
+}
+
+function devel_variable_edit_submit($form_id, $form_values) {
+  variable_set($form_values['name'], $form_values['new']);
+  drupal_set_message(t('Saved new value for %name', array('%name' => $form_values['name'])));
+  return 'devel/variable';
+}
+
+/**
+ * Menu callback: display the session.
+ */
+function devel_session() {
+  return dprint_r($_SESSION, TRUE);
+}
+
+/**
+ * Switch from original user to another user and back.
+ *
+ * Note: taken from mailhandler.module.
+ *
+ * Note: You first need to run devel_switch_user without
+ * argument to store the current user. Call devel_switch_user
+ * without argument to set the user back to the original user.
+ *
+ * @param $name The username to switch to.
+ *
+ */
+function devel_switch_user($name = NULL) {
+  global $user;
+  static $orig_user = array();
+
+  if (isset($name)) {
+    $user = user_load(array('name' => $name));
+  }
+  // Retrieve the initial user. Can be called multiple times.
+  else if (count($orig_user)) {
+    $user = array_shift($orig_user);
+    array_unshift($orig_user, $user);
+  }
+  // Store the initial user.
+  else {
+    $orig_user[] = $user;
+  }
+  drupal_goto();
+}
+
+/**
+ * Menu callback; prints the loaded structure of the current node/user.
+ */
+function devel_load_object($type, $id) {
+  $output = '';
+
+  switch ($type) {
+    case 'node':
+      $object = node_load($id);
+      drupal_set_title(check_plain($object->title));
+      break;
+
+    case 'user':
+      $object = user_load(array('uid' => $id));
+      drupal_set_title(check_plain($object->name));
+      break;
+  }
+
+  return devel_print_object($object);
+}
+
+/**
+ * Menu callback; prints the renderstructure of the current node.
+ */
+function devel_render_object($type, $id) {
+  $output = '';
+
+  switch ($type) {
+    case 'node':
+      $object = node_build_content(node_load($id), FALSE, FALSE);
+      drupal_set_title(check_plain($object->title));
+      break;
+
+    case 'user':
+      // not yet using fapi render model
+      break;
+  }
+
+  return devel_print_object($object);
+}
+
+function devel_print_object($object) {
+  foreach ($object as $field => $value) {
+    if (is_null($value)) {
+      $printed_value = 'NULL';
+    }
+    else if (is_array($value) || is_object($value)) {
+      ob_start();
+      print_r($value);
+      $printed_value = ob_get_clean();
+      $printed_value = '<pre>'. check_plain($printed_value) .'</pre>';
+    }
+    else {
+      $printed_value = check_plain($value);
+    }
+
+    $output .= theme('box', $field, $printed_value);
+  }
+  return $output;
+}
+
+/**
+ * Adds a table at the bottom of the page cataloguing data on all the database queries that were made to
+ * generate the page.
+ */
+function devel_query_table($queries, $counts) {
+  $header = array ('ms', '#', 'where', 'query');
+  $i = 0;
+  foreach ($queries as $query) {
+    // dprint_r($query);
+    $ar = explode("\n", $query[0]);
+    $function=array_shift($ar);
+    $count = isset($counts[$query[0]]) ? $counts[$query[0]] : 0;
+    $query[0]=join(' ',$ar);
+
+    $diff = round($query[1] * 1000, 2);
+    if ($diff > variable_get('devel_execution', 5)) {
+      $cell[$i][] = array ('data' => $diff, 'class' => 'marker');
+    }
+    else {
+      $cell[$i][] = $diff;
+    }
+    if ($count > 1) {
+      $cell[$i][] = array ('data' => $count, 'class' => 'marker');
+    }
+    else {
+      $cell[$i][] = $count;
+    }
+    $cell[$i][] = l($function, "http://api.drupal.org/api/HEAD/function/$function");
+    $cell[$i][] = check_plain($query[0]);
+    $i++;
+    unset($diff, $count);
+  }
+  if (variable_get('devel_query_sort', DEVEL_QUERY_SORT_BY_SOURCE)) {
+    usort($cell, '_devel_table_sort');
+  }
+  return theme('table', $header, $cell);
+}
+
+function _devel_table_sort($a, $b) {
+	$a = is_array($a[0]) ? $a[0]['data'] : $a[0];
+	$b = is_array($b[0]) ? $b[0]['data'] : $b[0];
+	if ($a < $b) { return 1; }
+	if ($a > $b) { return -1; }
+	return 0;	
+}
+
+/**
+ * Displays page execution time at the bottom of the page.
+ */
+function devel_timer() {
+  $time = timer_read('page');
+  return t(' Page execution time was %time ms.', array('%time' => $time));
+}
+
+/**
+ * Prints the arguments for passed into the current function
+ */
+function dargs($always = TRUE) {
+  static $printed;
+  if ($always || !$printed) {
+    $bt = debug_backtrace();
+    dsm($bt[1]['args']);
+    $printed = TRUE;
+  }
+} 
+
+/**
+ * Print a variable to the 'message' area of the page. Uses drupal_set_message()
+ */
+function dpm($input, $name = NULL) {
+  if (user_access('access devel information')) {
+    $export = dprint_r($input, TRUE, $name);
+    drupal_set_message($export);
+  }
+}
+
+/**
+ * Var_dump() a variable to the 'message' area of the page. Uses drupal_set_message()
+ */
+function dvm($input, $name = NULL) {
+  if (user_access('access devel information')) {
+    $export = dprint_r($input, TRUE, $name, 'var_dump');
+    drupal_set_message($export);
+  }
+}
+
+// legacy function that was poorly named. use dpm() instead, since the 'p' maps to 'print_r'
+function dsm($input, $name = NULL) {
+  dpm($input, $name = NULL);
+}
+
+/**
+ * An alias for dprint_r(). Saves carpal tunnel syndrome.
+ */
+function dpr($input, $return = FALSE, $name = NULL) {
+  return dprint_r($input, $return, $name);
+}
+
+/**
+ * Like dpr, but uses var_dump() instead
+ */
+function dvr($input, $return = FALSE, $name = NULL) {
+  return dprint_r($input, $return, $name, 'var_dump');
+}
+
+/**
+ * Pretty-print a variable to the browser.
+ * Displays only for users with proper permissions. If
+ * you want a string returned instead of a print, use the 2nd param.
+ */
+function dprint_r($input, $return = FALSE, $name = NULL, $function = 'print_r') {
+  if (user_access('access devel information')) {
+  	if ($name) {
+  	  $name .= ' => ';
+  	}
+  	ob_start();
+  	$function($input);
+  	$output = check_plain(ob_get_clean());
+    if (count($input, COUNT_RECURSIVE) > DEVEL_MIN_TEXTAREA) {
+      // direction:ltr; comes from http://drupal.org/node/105732
+      // don't use fapi here because sometimes fapi will not be loaded
+      $printed_value = "<textarea rows=30 style=\"width: 100%;\">\n". $name . $output . '</textarea>';
+    }
+  	else {
+    	$printed_value = '<pre>' . $name . $output . '</pre>';
+  	}
+    if ($return) {
+      return $printed_value;
+    } 
+    else {
+      print $printed_value;
+    }
+  }
+}
+
+/**
+ * Print the function call stack. This works even without xdebug installed.
+ */
+function ddebug_backtrace() {
+  if (user_access('access devel information')) {
+    if (function_exists('debug_print_backtrace')) {
+      debug_print_backtrace();
+    }
+    else {
+      dprint_r(debug_backtrace());
+    }
+  }
+}
+
+/**
+ * Debugging version of db_query().
+ *
+ * Echoes the query to the browser.
+ */
+function db_queryd($query) {
+  $args = func_get_args();
+  array_shift($args);
+  $query = db_prefix_tables($query);
+  if (isset($args[0]) and is_array($args[0])) { // 'All arguments in one array' syntax
+    $args = $args[0];
+  }
+  _db_query_callback($args, TRUE);
+  $query = preg_replace_callback(DB_QUERY_REGEXP, '_db_query_callback', $query);
+  return _db_query($query, 1);
+}
+
+// Only define our mail wrapper if the devel module is the current mail
+// wrapper.
+if (variable_get('smtp_library', '') == drupal_get_filename('module', 'devel')) {
+  /**
+   * Log the mails sent out instead of mailing.
+   */
+  function drupal_mail_wrapper($mailkey, $to, $subject, $body, $from, $headers) {
+    $mimeheaders = array();
+    foreach ($headers as $name => $value) {
+      // the check_plain nicely encodes <> chars for web presentation
+      $mimeheaders[] = check_plain($name .': '. mime_header_encode($value));
+    }
+    watchdog('devel', t('Mail sent:<br />Key: %mailkey<br />To: %to<br />From: %from<br />Subject: %subject<br />Body: %body<br /><br />Additional headers: !header', array(
+      '%mailkey' => $mailkey,
+      '%to' => $to,
+      '%from' => $from,
+      '%subject' => $subject,
+      '%body' => $body,
+      '!header' => implode("<br />", $mimeheaders),
+    )));
+    return TRUE;
+  }
+}
+
+function devel_queries() {
+  $header = array(
+                  array('data' => t('Total (ms)'), 'field' => 'total_time', 'sort' => 'desc'),
+                  array('data' => t('Average (ms)'), 'field' => 'average', 'sort' => 'desc'),
+                  array('data' => t('Std deviation (ms)')),
+                  array('data' => t('Count'), 'field' => 'count'),
+                  array('data' => t('Function'), 'field' => 'q.function'),
+                  array('data' => t('Query'), 'field' => 'q.query'),
+                  );
+
+  $result = pager_query('SELECT q.qid, q.query, q.function, t.*, COUNT(t.qid) AS count, SUM(t.time) AS total_time, AVG(t.time) AS average, STDDEV(t.time) AS stddev FROM {devel_queries} q INNER JOIN {devel_times} t ON q.qid = t.qid GROUP BY t.qid '. tablesort_sql($header), 30, 0, 'SELECT COUNT(qid) FROM {devel_queries}');
+  while ($log = db_fetch_object($result)) {
+    $rows[] = array(
+                    round($log->total_time * 1000, 3),
+                    round($log->average * 1000, 3),
+                    round($log->stddev * 1000, 3),
+                    $log->count,
+                    $log->function,
+                    check_plain($log->query)
+                    );
+  }
+
+  drupal_set_title(check_plain($node->title));
+  $output = theme('table', $header, $rows);
+  $output .= theme('pager', NULL, 30, 0);
+  $output .= l(t('Delete collected query statistics'), 'devel/queries/empty');
+
+  print theme('page', $output, FALSE);
+}
+
+function devel_queries_empty() {
+  db_query('DELETE FROM {devel_queries}');
+  db_query('DELETE FROM {devel_times}');
+  drupal_set_message(t('Stored query statistics deleted.'));
+  drupal_goto('devel/queries');
+}
+
Index: modules/devel/generate/import-taxonomy-terms.php
===================================================================
RCS file: modules/devel/generate/import-taxonomy-terms.php
diff -N modules/devel/generate/import-taxonomy-terms.php
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ modules/devel/generate/import-taxonomy-terms.php	1 Jan 1970 00:00:00 -0000
@@ -0,0 +1,44 @@
+<?php
+
+// written by Moshe Weitzman - weitzman at tejasa.com - July 2003
+
+// BEWARE! this script adds data to your database
+
+// -------------------------
+// CONFIGURATION
+
+    // Change the value below to TRUE when you want to run the script After running, immediately
+    // change back to FALSE in order to prevent accidentally executing this script twice.
+    $active = FALSE;
+    
+    // Enter the vocabulary ID into which you want to insert terms
+    $vid = 88;
+    
+    // create an array of term names. order doesn't
+    // matter since Drupal will present them alphabetically
+    $terms = array (
+      "Alabama","Alaska","Arizona","Arkansas","California","Colorado","Connecticut","Delaware","Florida","Georgia","Hawaii","Idaho","Illinois","Indiana","Iowa","Kansas","Kentucky","Louisiana","Maine","Maryland","Massachusetts","Michigan","Minnesota","Mississippi","Missouri","Montana","Nebraska","Nevada","New Hampshire","New Jersey","New Mexico","New York","North Carolina","North Dakota","Ohio","Oklahoma","Oregon","Pennsylvania","Rhode Island","South Carolina","South Dakota","Tennessee","Texas","Utah","Vermont","Virginia","Washington","West Virginia","Wisconsin","Wyoming","Washington D.C."
+    );
+// -------------------------
+// CODE
+
+    include_once "includes/bootstrap.inc";
+    include_once("includes/common.inc");
+    
+    if ($active) {
+      if (user_access("administer taxonomy")) {
+        foreach ($terms as $term) {
+          $edit = array ("vid" => $vid, "name" => $term );
+          $msg = taxonomy_save_term($edit);
+          print $msg;
+        }
+      }
+      else {
+        print "You have insufficent permission to  administer taxonomy";
+      }  
+    }
+    else {
+      print "You have not activated term_loader. See $active variable at top of the source code";
+    }
+
+?>
Index: modules/devel/po/hu.po
===================================================================
RCS file: modules/devel/po/hu.po
diff -N modules/devel/po/hu.po
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ modules/devel/po/hu.po	1 Jan 1970 00:00:00 -0000
@@ -0,0 +1,67 @@
+# Hungarian translation of Drupal devel.module
+# Copyright Weblabor Team <info [at] weblabor.hu>
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: 1.28\n"
+"POT-Creation-Date: 2004-03-06 14:27+0100\n"
+"PO-Revision-Date: 2003-03-06 14:44+0100\n"
+"Last-Translator: Weblabor Team <info [at] weblabor.hu>\n"
+"Language-Team: hu\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+#: devel.module:56
+msgid "Query log"
+msgstr "SQL napló"
+
+#: devel.module:116
+msgid "Development helper functions"
+msgstr "Fejlesztést segítő eszközök"
+
+#: devel.module:123
+msgid "Display Page Timer"
+msgstr "Oldal idémérő megjelenítése"
+
+#: devel.module:123 ;124
+# msgid "Disabled"
+# msgstr ""
+
+#: devel.module:123 ;124
+# msgid "Enabled"
+# msgstr ""
+
+#: devel.module:123
+msgid "Display page execution time in the query log box."
+msgstr "Az oldal előállításához szükséges idő megjelenítése."
+
+#: devel.module:124
+msgid "Display query log"
+msgstr "SQL napló megjelenítése"
+
+#: devel.module:124
+msgid ""
+"Display a log of the database queries needed to generate the current page, "
+"the and the execution time for each. Also, a queries which are repeated "
+"during a single page view are summed in the # column, and printed in red "
+"since they are candidates for caching."
+msgstr ""
+"Az oldal előállításához szükséges adatbázis lekérdezések naplóját jeleníti "
+"meg azok futási idejével. Ismétlődő lekérdezések piros színben jelennek meg, "
+"hiszen éppen ezek azok, amelyek gyorsítótárazásra a legjobb jelöltek."
+
+#: devel.module:125
+msgid ""
+"Enter an integer in milliseconds. Any query which takes longer than this "
+"many milliseconds will be highlighted in the query log. This indicates a "
+"possibliy inefficient query, or a candidate for caching."
+msgstr ""
+"Adj meg egy egész számot. Bármely lekérdezés, mely ennyi milliszekundumnál "
+"hosszabban fut kiemelt lesz az SQL naplóban. Ezek általában rossz "
+"hatékonyságú parancsok vagy gyorsítótárazható lekérdezések."
+
+#: devel.module:130
+msgid "access devel information"
+msgstr "elérés: fejlesztői információk"
Index: modules/devel/po/devel-module.pot
===================================================================
RCS file: modules/devel/po/devel-module.pot
diff -N modules/devel/po/devel-module.pot
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ modules/devel/po/devel-module.pot	1 Jan 1970 00:00:00 -0000
@@ -0,0 +1,87 @@
+Content-type: text/html
+X-Powered-By: PHP/4.3.9
+
+# LANGUAGE translation of PROJECT
+# Copyright YEAR NAME <EMAIL@ADDRESS>
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: V 1.00\n"
+"POT-Creation-Date: 2005-07-25 17:54+0200\n"
+"PO-Revision-Date: YYYY-mm-DD HH:MM+ZZZZ\n"
+"Last-Translator: MATTEO <m.ferrari@tiscali.it>\n"
+"Language-Team:  MATTEO <m.ferrari@tiscali.it>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+#: d:\Drupal-contributions-CVS\modules\devel\devel.module:30
+msgid "empty cache"
+msgstr ""
+
+#: d:\Drupal-contributions-CVS\modules\devel\devel.module:33
+msgid "variable viewer"
+msgstr ""
+
+#: d:\Drupal-contributions-CVS\modules\devel\devel.module:48
+msgid " Page execution time was %time ms."
+msgstr ""
+
+#: d:\Drupal-contributions-CVS\modules\devel\devel.module:64
+msgid "<p>The user is being redirected to %destination.</p>"
+msgstr ""
+
+#: d:\Drupal-contributions-CVS\modules\devel\devel.module:191
+msgid "Development helper functions"
+msgstr ""
+
+#: d:\Drupal-contributions-CVS\modules\devel\devel.module:199
+msgid "Display page timer"
+msgstr ""
+
+#: d:\Drupal-contributions-CVS\modules\devel\devel.module:199;200;202
+msgid "Disabled"
+msgstr ""
+
+#: d:\Drupal-contributions-CVS\modules\devel\devel.module:199;200;202
+msgid "Enabled"
+msgstr ""
+
+#: d:\Drupal-contributions-CVS\modules\devel\devel.module:199
+msgid "Display page execution time in the query log box."
+msgstr ""
+
+#: d:\Drupal-contributions-CVS\modules\devel\devel.module:200
+msgid "Display query log"
+msgstr ""
+
+#: d:\Drupal-contributions-CVS\modules\devel\devel.module:200
+msgid "Display a log of the database queries needed to generate the current page, the and the execution time for each. Also, a queries which are repeated during a single page view are summed in the # column, and printed in red since they are candidates for caching."
+msgstr ""
+
+#: d:\Drupal-contributions-CVS\modules\devel\devel.module:201
+msgid "Query execution threshhold"
+msgstr ""
+
+#: d:\Drupal-contributions-CVS\modules\devel\devel.module:201
+msgid "Enter an integer in milliseconds. Any query which takes longer than this many milliseconds will be highlighted in the query log. This indicates a possibliy inefficient query, or a candidate for caching."
+msgstr ""
+
+#: d:\Drupal-contributions-CVS\modules\devel\devel.module:202
+msgid "Display redirection page"
+msgstr ""
+
+#: d:\Drupal-contributions-CVS\modules\devel\devel.module:202
+msgid "When a module executes drupal_goto(), the query log and other developer information is lost. Enabling this setting presents an intermediate page to developers so that the log can be examined before continuing to the destination page."
+msgstr ""
+
+#: d:\Drupal-contributions-CVS\modules\devel\devel.module:210
+msgid "access devel information"
+msgstr ""
+
+#: d:\Drupal-contributions-CVS\modules\devel\devel.module:0
+msgid "devel"
+msgstr ""
+
Index: includes/install.mssql.inc
===================================================================
RCS file: includes/install.mssql.inc
diff -N includes/install.mssql.inc
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ includes/install.mssql.inc	1 Jan 1970 00:00:00 -0000
@@ -0,0 +1,139 @@
+<?php
+// $Id: $
+
+// MS SQL specific install functions
+
+/**
+ * Check if MS SQL is available.
+ *
+ * @return
+ *  TRUE/FALSE
+ */
+function mssql_is_available() {
+  return function_exists('mssql_connect');
+}
+
+/**
+ * Check if we can connect to MS SQL.
+ *
+ * @return
+ *  TRUE/FALSE
+ */
+function drupal_test_mssql($url, &$success) {
+  if (!mssql_is_available()) {
+    drupal_set_message('PHP MS SQL support not enabled.', 'error');
+    return FALSE;
+  }
+
+  $url = parse_url($url);
+
+  // Decode url-encoded information in the db connection string.
+  $url['user'] = urldecode($url['user']);
+  $url['pass'] = urldecode($url['pass']);
+  $url['host'] = stripslashes(urldecode($url['host']));
+  $url['path'] = urldecode($url['path']);
+
+  // Allow for non-standard MS SQL port.
+  if (isset($url['port'])) {
+     $url['host'] = $url['host'] .','. $url['port'];
+  }
+
+  // Test connecting to the database.
+  $connection = mssql_connect($url['host'], $url['user'], $url['pass']);
+  if (!$connection) {
+    drupal_set_message(st('Failure to connect to your MS SQL database server. MS SQL reports the following message: %error.<ul><li>Are you sure you have the correct username and password?</li><li>Are you sure that you have typed the correct database hostname?</li><li>Are you sure that the database server is running?</li></ul>For more help, see the <a href="http://drupal.org/node/258">Installation and upgrading handbook</a>. If you are unsure what these terms mean you should probably contact your hosting provider.', array('%error' => $php_errormsg)), 'error');
+    return FALSE;
+  }
+
+  // Test selecting the database.
+  if (!mssql_select_db(substr($url['path'], 1))) {
+    drupal_set_message(st('We were able to connect to the MS SQL database server (which means your username and password are valid) but not able to select your database. MS SQL reports the following message: %error.<ul><li>Are you sure you have the correct database name?</li><li>Are you sure the database exists?</li><li>Are you sure the username has permission to access the database?</li></ul>For more help, see the <a href="http://drupal.org/node/258">Installation and upgrading handbook</a>. If you are unsure what these terms mean you should probably contact your hosting provider.', array('%error' => mssql_get_last_message())), 'error');
+    return FALSE;
+  }
+
+  $success = array('CONNECT');
+
+  // Test CREATE.
+  $query = 'CREATE TABLE drupal_install_test (id int NULL)';
+  $result = mssql_query($query);
+  if ($result === FALSE) {
+    drupal_set_message(st('We were unable to create a test table on your MS SQL database server with the command %query. MS SQL reports the following message: %error.<ul><li>Are you sure the configured username has the necessary MS SQL permissions to create tables in the database?</li></ul>For more help, see the <a href="http://drupal.org/node/258">Installation and upgrading handbook</a>. If you are unsure what these terms mean you should probably contact your hosting provider.', array('%query' => $query, '%error' => $php_errormsg)), 'error');
+    return FALSE;
+  }
+  $err = FALSE;
+  $success[] = 'SELECT';
+  $success[] = 'CREATE';
+
+  // Test INSERT.
+  $query = 'INSERT INTO drupal_install_test (id) VALUES (1)';
+  $result = mssql_query($query);
+  if ($result === FALSE) {
+    drupal_set_message(st('We were unable to insert a value into a test table on your MS SQL database server. We tried inserting a value with the command %query and MS SQL reported the following error: %error.', array('%query' => $query, '%error' => $php_errormsg)), 'error');
+    $err = TRUE;
+  }
+  else {
+    $success[] = 'INSERT';
+  }
+
+  // Test UPDATE.
+  $query = 'UPDATE drupal_install_test SET id = 2';
+  $result = mssql_query($query);
+  if ($result === FALSE) {
+    drupal_set_message(st('We were unable to update a value in a test table on your MS SQL database server. We tried updating a value with the command %query and MS SQL reported the following error: %error.', array('%query' => $query, '%error' => $php_errormsg)), 'error');
+    $err = TRUE;
+  }
+  else {
+    $success[] = 'UPDATE';
+  }
+
+  // Test LOCK.
+  $query = 'BEGIN TRANSACTION';
+  $result = mssql_query($query);
+  if ($result === FALSE) {
+    drupal_set_message(st('We were unable to lock a test table on your MS SQL database server. We tried locking a table with the command %query and MS SQL reported the following error: %error.', array('%query' => $query, '%error' => $php_errormsg)), 'error');
+    $err = TRUE;
+  }
+  else {
+    $success[] = 'LOCK';
+  }
+
+  // Test UNLOCK.
+  $query = 'COMMIT TRANSACTION';
+  $result = mssql_query($query);
+  if ($result === FALSE) {
+    drupal_set_message(st('We were unable to unlock a test table on your MS SQL database server. We tried unlocking a table with the command %query and MS SQL reported the following error: %error.', array('%query' => $query, '%error' => $php_errormsg)), 'error');
+    $err = TRUE;
+  }
+  else {
+    $success[] = 'UNLOCK';
+  }
+
+  // Test DELETE.
+  $query = 'DELETE FROM drupal_install_test';
+  $result = mssql_query($query);
+  if ($result === FALSE) {
+    drupal_set_message(st('We were unable to delete a value from a test table on your MS SQL database server. We tried deleting a value with the command %query and MS SQL reported the following error: %error.', array('%query' => $query, '%error' => $php_errormsg)), 'error');
+    $err = TRUE;
+  }
+  else {
+    $success[] = 'DELETE';
+  }
+
+  // Test DROP.
+  $query = 'DROP TABLE drupal_install_test';
+  $result = mssql_query($query);
+  if ($result === FALSE) {
+    drupal_set_message(st('We were unable to drop a test table from your MS SQL database server. We tried dropping a table with the command %query and MS SQL reported the following error %error.', array('%query' => $query, '%error' => $php_errormsg)), 'error');
+    $err = TRUE;
+  }
+  else {
+    $success[] = 'DROP';
+  }
+
+  if ($err) {
+    return FALSE;
+  }
+
+  mssql_close($connection);
+  return TRUE;
+}
Index: modules/devel/devel_generate.info
===================================================================
RCS file: modules/devel/devel_generate.info
diff -N modules/devel/devel_generate.info
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ modules/devel/devel_generate.info	1 Jan 1970 00:00:00 -0000
@@ -0,0 +1,10 @@
+; $Id: devel.info,v 1.1.4.3 2006/12/27 03:47:18 weitzman Exp $
+name = Devel Generate
+description = Generate dummy users, nodes, and taxonomy terms.
+version = "$Name: DRUPAL-5 $"
+package = Development
+
+; Information added by drupal.org packaging script on 2007-04-01
+version = "5.x-1.x-dev"
+project = "devel"
+
Index: .project
===================================================================
RCS file: .project
diff -N .project
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ .project	1 Jan 1970 00:00:00 -0000
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>Drupal F50 (MSSQL)</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>net.sourceforge.phpeclipse.parserbuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>net.sourceforge.phpeclipse.phpnature</nature>
+	</natures>
+</projectDescription>
Index: modules/devel/devel.info
===================================================================
RCS file: modules/devel/devel.info
diff -N modules/devel/devel.info
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ modules/devel/devel.info	1 Jan 1970 00:00:00 -0000
@@ -0,0 +1,10 @@
+; $Id: devel.info,v 1.1.4.3 2006/12/27 03:47:18 weitzman Exp $
+name = Devel
+description = Various blocks, pages, and functions for developers.
+version = "$Name: DRUPAL-5 $"
+package = Development
+
+; Information added by drupal.org packaging script on 2007-04-01
+version = "5.x-1.x-dev"
+project = "devel"
+
Index: modules/devel/po/it.po
===================================================================
RCS file: modules/devel/po/it.po
diff -N modules/devel/po/it.po
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ modules/devel/po/it.po	1 Jan 1970 00:00:00 -0000
@@ -0,0 +1,85 @@
+# Hungarian translation of Drupal devel.module
+# Copyright Weblabor Team <info [at] weblabor.hu>
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: 1.0\n"
+"POT-Creation-Date: 2004-03-06 14:27+0100\n"
+"PO-Revision-Date: 2005-07-25 18:04+0100\n"
+"Last-Translator: Matteo Ferrari <webmaster@cantincoro.org>\n"
+"Language-Team: DrupalItalia\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Poedit-Language: Italian\n"
+"X-Poedit-Country: ITALY\n"
+
+# d:\Drupal-contributions-CVS\modules\devel\devel.module:30
+msgid "empty cache"
+msgstr "svuota cache"
+
+# d:\Drupal-contributions-CVS\modules\devel\devel.module:33
+msgid "variable viewer"
+msgstr "visualizzatore variabili"
+
+# msgid "Disabled"
+# msgstr ""
+# msgid "Enabled"
+# msgstr ""
+msgid " Page execution time was %time ms."
+msgstr "Il tempo esecuzione pagine è stato %time ms."
+
+# d:\Drupal-contributions-CVS\modules\devel\devel.module:64
+msgid "<p>The user is being redirected to %destination.</p>"
+msgstr "<p>L'untente è stato rediretto verso %destination.</p>"
+
+msgid "Development helper functions"
+msgstr "Funzioni di aiuto alla programmazione"
+
+msgid "Display page timer"
+msgstr "Mostra i tempi della pagina"
+
+# d:\Drupal-contributions-CVS\modules\devel\devel.module:199;200;202
+msgid "Disabled"
+msgstr "Disabilitato"
+
+# d:\Drupal-contributions-CVS\modules\devel\devel.module:199;200;202
+msgid "Enabled"
+msgstr "Abilitato"
+
+# msgid "Disabled"
+# msgstr ""
+# msgid "Enabled"
+# msgstr ""
+msgid "Display page execution time in the query log box."
+msgstr "Mostra i tempi di esecuzione della pagina nel riquadro delle query"
+
+msgid "Display query log"
+msgstr "Mostra il log delle query"
+
+msgid "Display a log of the database queries needed to generate the current page, the and the execution time for each. Also, a queries which are repeated during a single page view are summed in the # column, and printed in red since they are candidates for caching."
+msgstr "Visualizza un logo delle query database che servono per generare la seguente pagina, ed il tempo di esecuzione per ognuna. Inoltre, le query che sono ripetute in una pagina singola sono sommarizzate nella colonna #, e visualizzate in rosso, sicocme sono candidate al caching."
+
+# d:\Drupal-contributions-CVS\modules\devel\devel.module:201
+msgid "Query execution threshhold"
+msgstr "Soglia esecuzione query"
+
+msgid "Enter an integer in milliseconds. Any query which takes longer than this many milliseconds will be highlighted in the query log. This indicates a possibliy inefficient query, or a candidate for caching."
+msgstr "Inserire un numero intero di millisecondi. Qualsiasi query che dura più di questo valore in millisencondi verrà evidenziata nel log delle query. Ciò indica una possibile query inefficiente, o un candidato per il caching."
+
+# d:\Drupal-contributions-CVS\modules\devel\devel.module:202
+msgid "Display redirection page"
+msgstr "Mostra redirezione pagine"
+
+# d:\Drupal-contributions-CVS\modules\devel\devel.module:202
+msgid "When a module executes drupal_goto(), the query log and other developer information is lost. Enabling this setting presents an intermediate page to developers so that the log can be examined before continuing to the destination page."
+msgstr "Quando un modulo esegue drupal_goto(), il log delle query e altre informazioni utili agli sviluppatori sono perse. Abilitando questo parametro viene presentata una pagina per gli sviluppatori, così il log puù essere esaminato prima di continuare con la pagina di destinazione."
+
+msgid "access devel information"
+msgstr "accedere alle funzioni di aiuto allo sviluppo"
+
+# d:\Drupal-contributions-CVS\modules\devel\devel.module:0
+msgid "devel"
+msgstr "devel"
+
Index: modules/devel/devel_node_access.module
===================================================================
RCS file: modules/devel/devel_node_access.module
diff -N modules/devel/devel_node_access.module
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ modules/devel/devel_node_access.module	1 Jan 1970 00:00:00 -0000
@@ -0,0 +1,302 @@
+<?php
+// $Id: devel_node_access.module,v 1.7.4.2 2006/12/27 06:15:13 weitzman Exp $
+/**
+ * @file
+ *
+ * This module gives developers feedback as to what there
+ * node_access table contains, and which nodes are protected or
+ * visible to the public.
+ *
+ */
+
+define('DNA_ACCESS_VIEW', 'view devel_node_access information');
+
+function devel_node_access_perm() {
+  return array(DNA_ACCESS_VIEW);
+}
+
+/**
+ * Implementation of hook_help().
+ */
+function devel_node_access_help($section) {
+  switch ($section) {
+  case 'admin/settings/modules#description':
+	return t('Development helper for node_access table');
+	break;
+  case 'admin/help#devel_node_access':
+	$output .= '<p>'.t('This module helps in site development.  Specifically, when an access control module is used to limit access to some or all nodes, this module provides some feedback showing the node_access table in the database.') ."</p>\n";
+	$output .= '<p>'.t('The node_access table is one method Drupal provides to hide content from some users while displaying it to others.  By default, Drupal shows all nodes to all users.  There are a number of optional modules which may be installed to hide content from some users.')."</p>\n";
+	$output .= '<p>'.t('If you have not installed one of these modules, you really have no need for the devel_node_access module.  This module is intended for use during development, so that developers and admins can confirm that node_access table is working as expected.  You probably do not want this module enabled on a production site.')."</p>\n";
+	$output .= '<p>'.t('This module provides a %summary_page which shows show general information about your node_access table.  If you have installed the Views module, you may %browse_link.  This module also provides a block showing the rows of the node_access table relevant to whatever node(s) are shown on a given page.  Because the table shown is wide, it is recommended to enable the block in the page footer rather than a sidebar.',
+					   array('%summary_page' => l(t('summary page'), 'devel/node_access/summary'),
+							 '%browse_link' => l(t('browse node_access by realm'), 'devel/node_access/view'))
+					   )."</p>\n";
+	$output .= '<p>'.t('')."</p>\n";
+	return $output;
+  }
+}
+
+
+function devel_node_access_menu($may_cache) {
+  $items = array();
+  if ($may_cache) {
+	$items[] = array('path' => 'devel/node_access/summary',
+					 'title' => t('node_access summary'),
+					 'callback' => 'dna_summary',
+					 'access' => user_access(DNA_ACCESS_VIEW),
+					 'type' => MENU_CALLBACK,
+					 );
+  }
+  return $items;
+}
+
+function dna_summary() {
+  // Warn user if they have any entries that could grant access to all nodes
+  $result = db_query('SELECT DISTINCT realm FROM {node_access} WHERE nid=0 AND gid=0');
+  if (db_num_rows($result)) {
+	$output .= '<h3>'.t('Access Granted to All Nodes (All Users)')."</h3>\n";
+	$output .= '<p>'.t('Your node_access table contains entries that may be granting all users access to all nodes.  Depending on which access control module(s) you use, you may want to delete these entries.  If you are not using an access control module, you should probably leave these entries as is.')."</p>\n";
+	$headers = array(t('realm'));
+	$rows = array();
+	while ($row = db_fetch_object($result)) {
+	  $rows[] = array($row->realm);
+	}
+	$output .= theme_table($headers, $rows);
+  }
+
+  // how many nodes are not represented in the node_access table
+  $result = db_fetch_object(db_query('SELECT COUNT(n.nid) as num_nodes FROM {node} n LEFT JOIN {node_access} na ON n.nid = na.nid WHERE na.nid IS NULL'));
+  if ($num = $result->num_nodes) {
+	$output .= '<h3>'.t('Legacy Nodes')."</h3>\n";
+	$output .= '<p>'.
+	  t('You have !num nodes in your node table which are not represented in your node_access table.  If you have an access control module installed, these nodes may be hidden from all users.  This could be caused by publishing nodes before enabling the access control module.  If this is the case, manually updating each node should add it to the node_access table and fix the problem.', array('!num' => l($num, 'devel/node_access/view/NULL'))).
+	  "</p>\n";
+  }
+  else {
+	$output .= '<h3>'.t('All Nodes Represented')."</h3>\n";
+	$output .= '<p>'.
+	  t('All nodes are represented in the node_access table.').
+	  "</p>\n";
+  }
+
+
+  // a similar warning to the one above, but slightly more specific
+  $result = db_query('SELECT DISTINCT realm FROM {node_access} WHERE nid=0 AND gid!=0');
+  if (db_num_rows($result)) {
+	$output .= '<h3>'.t('Access Granted to All Nodes (Some Users)')."</h3>\n";
+	$output .= '<p>'.t('Your node_access table contains entries that may be granting some users access to all nodes.  This may be perfectly normal, depending on which access control module(s) you use.')."</p>\n";
+	$headers = array(t('realm'));
+	$rows = array();
+	while ($row = db_fetch_object($result)) {
+	  $rows[] = array($row->realm);
+	}
+	$output .= theme_table($headers, $rows);
+  }
+
+
+  // find specific nodes which may be visible to all users
+  $result = db_query('SELECT DISTINCT realm, COUNT(DISTINCT nid) as node_count FROM {node_access} WHERE gid=0 AND nid > 0 GROUP BY realm');
+  if (db_num_rows($result)) {
+	$output .= '<h3>'.t('Access Granted to Some Nodes')."</h3>\n";
+	$output .= '<p>'.
+	  t('The following realms appear to grant all users access to some specific nodes.  This may be perfectly normal, if some of your content is available to the public.').
+	  "</p>\n";
+	$headers = array(t('realm'), t('public nodes'));
+	$rows = array();
+	while ($row = db_fetch_object($result)) {
+	  $rows[] = array($row->realm,
+					  array('data' => $row->node_count,
+							'align' => 'center'));
+	}
+	$output .= theme_table($headers, $rows, array(), t('Public Nodes'));
+  }
+
+
+  // find specific nodes protected by node_access table
+  $result = db_query('SELECT DISTINCT realm, COUNT(DISTINCT nid) as node_count FROM {node_access} WHERE gid != 0 AND nid > 0 GROUP BY realm');
+  if (db_num_rows($result)) {
+	$output .= '<h3>'.t('Summary by Realm')."</h3>\n";
+	$output .= '<p>'.
+	  t('The following realms grant limited access to some specific nodes.').
+	  "</p>\n";
+	$headers = array(t('realm'), t('private nodes'));
+	$rows = array();
+	while ($row = db_fetch_object($result)) {
+	  $rows[] = array(l($row->realm, "devel/node_access/view/$row->realm"),
+					  array('data' => $row->node_count,
+							'align' => 'center'));
+	}
+	$output .= theme_table($headers, $rows, array(), t('Protected Nodes'));
+  }
+
+
+
+  return $output;
+}
+
+function dna_visible_nodes($nid = null) {
+  static $nids = array();
+  if ($nid) {
+	$nids[$nid] = $nid;
+  }
+  return $nids;
+}
+
+function devel_node_access_nodeapi(&$node, $op, $teaser = NULL, $page = NULL) {
+  if ($op == 'view') {
+	// remember this node, for display in our block
+	dna_visible_nodes($node->nid);
+  }
+}
+
+function devel_node_access_block($op = 'list', $delta = 0) {
+  switch ($op) {
+  case 'list':
+	  $blocks[0]['info'] = t('Devel Node Access');
+	  $blocks[0]['status'] = 1;
+	  $blocks[0]['region'] = 'footer';
+	return $blocks;
+	break;
+  case 'view':
+	if (!user_access(DNA_ACCESS_VIEW))
+	  return;
+	if (!count(dna_visible_nodes()))
+	  return;
+	
+	// include rows where nid == 0
+	$nids = array_merge(array(0 => 0), dna_visible_nodes());
+	$result = db_query('SELECT na.*, n.title FROM {node_access} na LEFT JOIN {node} n ON n.nid = na.nid WHERE na.nid IN (%s) ORDER BY na.nid',
+					   implode(',', $nids));
+	$headers = array(t('node'), t('realm'), t('gid'), t('view'), t('update'), t('delete'));
+	$rows = array();
+	while ($row = db_fetch_object($result)) {
+	  $rows[] = array($row->title ? $row->title : $row->nid,
+					  $row->realm,
+					  $row->gid,
+					  $row->grant_view,
+					  $row->grant_update,
+					  $row->grant_delete);
+	}
+	$output = theme_table($headers, $rows);
+	$subject = t('node_access entries for nodes shown on this page');
+	return array('subject' => $subject, 'content' => $output);
+	break;
+	
+  }
+}
+
+
+function devel_node_access_views_tables() {
+  $tables['node_access'] =
+	array('name' => 'node_access',
+		  'join' => array('left' => array('table' => 'node',
+										  'field' => 'nid'),
+						  'right' => array('field' => 'nid')),
+		  'fields' => array('realm' =>
+							array('name' => t('Node Access: realm'),
+								  'sortable' => true,
+								  ),
+							),
+		  'filters' =>
+		  array('realm' =>
+				array('name' => t('Node Access Realm'),
+					  'operator' => 'views_handler_operator_eqneq',
+					  ),
+				),
+		
+		  );
+  return $tables;
+}
+
+function devel_node_access_views_arguments() {
+  $arguments =
+	array('realm' =>
+		  array('name' => t('Node Access: Realm'),
+				'handler' => 'dna_handler_arg_realm',
+				),
+		  );
+  return $arguments;
+}
+
+function dna_handler_arg_realm($op, &$query, $argtype, $arg = '') {
+  switch ($op) {
+  case 'summary':
+	$query->ensure_table('node_access', true);
+	$query->add_field('realm', 'node_access');
+	$fieldinfo['field'] = 'realm';
+	$query->add_orderby('node_access', 'realm', 'ASC');
+	return $fieldinfo;
+	break;
+  case 'filter':
+	$query->ensure_table('node_access');
+	if ($arg == 'NULL')
+	  $query->add_where("node_access.realm IS NULL");
+	else
+	  $query->add_where("node_access.realm = '$arg'");
+	break;
+  case 'link':
+	if ($query->realm)
+	  return l($query->realm, "$arg/$query->realm");
+	else
+	  return l('NULL', "$arg/NULL");
+	break;
+  case 'title':
+	return $query;
+	break;
+  }
+}
+
+function devel_node_access_views_default_views() {
+  $view = new stdClass();
+  $view->name = 'devel_node_access';
+  $view->description = 'View nodes in node_access table';
+  $view->access = array (
+);
+  $view->page = TRUE;
+  $view->page_title = 'Nodes in node_access table';
+  $view->page_header = '';
+  $view->page_header_format = '1';
+  $view->page_type = 'table';
+  $view->url = 'devel/node_access/view';
+  $view->use_pager = TRUE;
+  $view->nodes_per_page = '100';
+  $view->sort = array (
+  );
+  $view->argument = array (
+    array (
+      'type' => 'realm',
+      'argdefault' => '3',
+      'title' => 'Nodes in node_access table where realm is %1',
+      'options' => '',
+    ),
+  );
+  $view->field = array (
+    array (
+      'tablename' => 'node',
+      'field' => 'title',
+      'label' => 'Title',
+      'handler' => 'views_handler_field_nodelink',
+      'sortable' => '1',
+      'defaultsort' => 'ASC',
+    ),
+    array (
+      'tablename' => 'node',
+      'field' => 'type',
+      'label' => 'Type',
+      'sortable' => '1',
+    ),
+    array (
+      'tablename' => 'node',
+      'field' => 'changed',
+      'label' => 'Updated',
+      'handler' => 'views_handler_field_date_small',
+      'sortable' => '1',
+    ),
+  );
+  $view->filter = array (
+  );
+  $view->requires = array(node);
+  $views[$view->name] = $view;
+
+  return $views;
+}
Index: modules/devel/README_devel_node_access.txt
===================================================================
RCS file: modules/devel/README_devel_node_access.txt
diff -N modules/devel/README_devel_node_access.txt
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ modules/devel/README_devel_node_access.txt	1 Jan 1970 00:00:00 -0000
@@ -0,0 +1,41 @@
+README
+======
+
+This module contains tools for developers using access control modules
+to restrict access to some nodes.  It is intended to help catch some
+common mistakes and provide feedback to confirm that restricted nodes
+are in fact visible only to the intended users.
+
+Provides a summary page which queries the node_access table and
+reports common mistakes such as the presence of Drupal's default entry
+which grants all users read access to all nodes.  Also reports the
+presence of nodes not represented in node_access table.  This may
+occur when an access control module is installed after nodes have
+already been created.
+
+Provides a block which shows all node_access entries for the nodes
+shown on a given page.  This gives developers a quick check to see
+that grants are provided as they should be.  This block auto-enables to the footer region. You may move it as desired.
+
+If Views module is installed, allows browsing of nodes by realm,
+including those nodes not in the node_access table (NULL realm).
+
+WISHLIST
+========
+
+Things I'd like to see but haven't had time to do:
+
+* Automatically solve common problems.  I.e. delete the "all" realm
+  entry, and automatically save all nodes not in the node_access table.
+
+* Nicer feedback indicating whether nodes are visible to the public or
+  not.  I.e. use color coding or icons.
+
+* Summary does not differentiate between view grants and other types
+  of grants.  I personally use node_access only for view grants so I'm
+  not sure exactly what else it should show.
+
+AUTHOR
+======
+
+Dave Cohen AKA yogadex on drupal.org
Index: modules/devel/po/tr.po
===================================================================
RCS file: modules/devel/po/tr.po
diff -N modules/devel/po/tr.po
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ modules/devel/po/tr.po	1 Jan 1970 00:00:00 -0000
@@ -0,0 +1,450 @@
+# LANGUAGE translation of PROJECT
+# Copyright YEAR NAME <EMAIL@ADDRESS>
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Drupal Devel Module\n"
+"POT-Creation-Date: 2005-07-25 17:54+0200\n"
+"PO-Revision-Date: 2007-02-01 23:35+0200\n"
+"Last-Translator: Erdem Köse <erdemkose@erdemkose.com>\n"
+"Language-Team: Turkish <ceviri@drupaltr.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+"X-Poedit-Language: Turkish\n"
+"X-Poedit-Country: Turkey\n"
+"X-Poedit-SourceCharset: utf-8\n"
+
+#: devel.module:30
+msgid "Helper functions, pages, and blocks to assist Drupal developers. The devel blocks can be managed via the !block page."
+msgstr "Drupal geliştiricilerine kolaylık sağlamak için yardımcı işlevler, sayfalar ve bloklar. Geliştirici blokları !block sayfasından yönetilebilir."
+
+#: devel.module:30
+msgid "block administration"
+msgstr "blok yönetimi"
+
+#: devel.module:32
+msgid "This is a list of defined user functions that generated this current request lifecycle. Click on a function name to view its documention."
+msgstr "Geçerli istek yaşam döngüsünü oluştururken tanımlanan kullanıcı işlevlerinin listesidir. Dokümantasyonunu görmek için bir işlevin adına tıklayın."
+
+#: devel.module:34
+msgid "Clicking a module's reinstall button will simulate installing a module. <code>hook_install()</code> will be executed and the schema version number will be set to the most recent update number. Make sure to manually clear out any existing tables first."
+msgstr "Bir eklentinin yeniden yükleme düğmesine basmak eklenti kurulumunu canlandıracaktır. <code>hook_install()</code> çalıştırılacak ve şema numarası en son güncelleme numarasına ayarlanacaktır. Öncelikle var olan tabloları sildiğinizden emin olun."
+
+#: devel.module:36
+msgid "Here are the contents of your <code>$_SESSION</code> variable."
+msgstr "<code>$_SESSION</code> değişkeninizin içeriği."
+
+#: devel.module:38
+msgid "This is a list of the variables and their values currently stored in variables table and the <code>$conf</code> array of your settings.php file. These variables are usually accessed with <a href=\"@variable-get-doc\">variable_get()</a> and <a href=\"@variable-set-doc\">variable_set()</a>. Variables that re too long can slow down your pages."
+msgstr "Bunlar değişkenler tablonuzdaki ve settings.php dosyanızdaki <code>$conf</code> dizisindeki değişkenlerin ve değerlerinin listesidir. Bu değişkenler genelde <a href=\"@variable-get-doc\">variable_get()</a> ve <a href=\"@variable-set-doc\">variable_set()</a> işlevleriyle erişilirler. Çok uzun değişkenler sayfalarınızı yavaşlatabilir."
+
+#: devel.module:50
+msgid "Empty cache"
+msgstr "Önbelleği boşalt"
+
+#: devel.module:56
+msgid "Database queries"
+msgstr "Veritabanı sorguları"
+
+#: devel.module:60
+msgid "Empty database queries"
+msgstr "Boş veritabanı sorguları"
+
+#: devel.module:65
+msgid "function reference"
+msgstr "fonksiyon başvuruları"
+
+#: devel.module:71
+msgid "Reinstall modules"
+msgstr "Eklentileri tekrar kur"
+
+#: devel.module:78
+msgid "Reset menus"
+msgstr "Menüleri sıfırla"
+
+#: devel.module:86
+#: ;92;99
+msgid "Variable editor"
+msgstr "değişkenleri görüntüle"
+
+#: devel.module:106
+msgid "Session viewer"
+msgstr "Oturum görüntüleyicisi"
+
+#: devel.module:112
+#: ;243
+msgid "Switch user"
+msgstr "Kullanıcı değiştir"
+
+#: devel.module:119
+#: ;244 devel.info:0
+msgid "Devel"
+msgstr "geliştirici"
+
+#: devel.module:130
+msgid "Dev load"
+msgstr "Gelişticisi Yükle"
+
+#: devel.module:137
+msgid "Dev render"
+msgstr "Geliştirici Render"
+
+#: devel.module:146
+msgid "Devel load"
+msgstr "Geliştirici Yükle"
+
+#: devel.module:227
+msgid "%message in %file on line %line."
+msgstr "%file dosyasında %line satırında %message"
+
+#: devel.module:245
+msgid "Execute PHP"
+msgstr "PHP çalıştır"
+
+#: devel.module:251
+msgid "switch user"
+msgstr "kullanıcı değiştir"
+
+#: devel.module:265
+#: ;1058;0 devel.info:0
+#: devel_node_access.info:0
+#: macro.info:0
+msgid "devel"
+msgstr "geliştirici"
+
+#: devel.module:267
+msgid "Adjust module settings for devel module"
+msgstr "Devel eklentisi için eklenti ayarlarını belirle"
+
+#: devel.module:268
+msgid "Clear the database cache tables which store page, menu, node, and variable caches."
+msgstr "Sayfa, menü, düğüm ve değişken önbelleklerinin saklandığı önbellek tablolarını temizler."
+
+#: devel.module:270
+msgid "View a list of currently defined user functions with documentation links"
+msgstr "Şu anda tanımlı kullanıcı işlevlerinin ve dokümantasyon bağlantılarının bir listesini görüntüle"
+
+#: devel.module:271
+msgid "Re-run hook_install() for a given module"
+msgstr "Belirtilen eklenti için kurulum işlevini(hook_install) tekrar çalıştır"
+
+#: devel.module:272
+msgid "Resets all menu items to their default settings"
+msgstr "Tüm menü öğelerini öntanımlı ayarlarına getir"
+
+#: devel.module:273
+msgid "Edit and delete site variables"
+msgstr "Site değişkenlerini düzenle ve sil"
+
+#: devel.module:274
+msgid "List the contents of $_SESSION"
+msgstr "$_SESSION içeriğini listele"
+
+#: devel.module:286
+msgid "Execute php"
+msgstr "PHP çalıştır"
+
+#: devel.module:330
+msgid "<p>The user is being redirected to <a href=\"@destination\">@destination</a>.</p>"
+msgstr "<p>Kullanıcı <a href=\"@destination\">@destination</a> adresine yönlendiriliyor.</p>"
+
+#: devel.module:374
+msgid " Queries taking longer than %threshold ms and queries executed more than once, are <span class=\"marker\">highlighted</span>."
+msgstr "%threshold milisaniyeden uzun süren veya birden fazla çalıştırılan sorgular, <span class=\"marker\">belirgin</span> yazılır."
+
+#: devel.module:393
+msgid "Memory used at %type: %value MB"
+msgstr "%type kullanılan bellek: %value MB"
+
+#: devel.module:441
+msgid "Executed %queries queries in %time milliseconds."
+msgstr "%time milisaniyede %queries sorgu çalıştırıldı"
+
+#: devel.module:473
+msgid "Query log"
+msgstr "Sorgu kayıtları"
+
+#: devel.module:475
+msgid "Collect query info"
+msgstr "Sorgu bilgisi topla"
+
+#: devel.module:477
+msgid "Collect query info. If disabled, no query log functionality will work."
+msgstr "Dorgu bilgisi topla. Devre dışı iken sorgu kayıt işlevleri çalışmaz."
+
+#: devel.module:479
+msgid "Display query log"
+msgstr "Sorgu kayıtlarını görüntüle"
+
+#: devel.module:481
+msgid "Display a log of the database queries needed to generate the current page, and the execution time for each. Also, queries which are repeated during a single page view are summed in the # column, and printed in red since they are candidates for caching."
+msgstr "Bu sayfanın üretilmesinde kullanılan tüm veritabanı sorgularını ve her biri için harcanan süreyi görüntüle. Ayrıca tekrarlanan sorgular # sütununda kaç kere tekrarlandığı belirtilir ve bunlar önbellekleme adayı oldukları için kırmızı ile yazılırlar."
+
+#: devel.module:483
+msgid "Sort query log"
+msgstr "Sorgu kayıtlarını sırala"
+
+#: devel.module:485
+msgid "by source"
+msgstr "kaynağa göre"
+
+#: devel.module:485
+msgid "by duration"
+msgstr "süreye göre"
+
+#: devel.module:486
+msgid "The query table can be sorted in the order that the queries were executed or by descending duration."
+msgstr "Sorgu tablosu çalışma sırasına veya azalan süreye göre sıralanabilir."
+
+#: devel.module:489
+msgid "Slow query highlighting"
+msgstr "Yavaş sorgunun belirgin yazılması"
+
+#: devel.module:493
+msgid "Enter an integer in milliseconds. Any query which takes longer than this many milliseconds will be highlighted in the query log. This indicates a possibly inefficient query, or a candidate for caching."
+msgstr "Milisaniye cinsinden bir tamsayı giriniz. Burada yazan milisaniyeden daha uzun süren sorgular, sorgu kayıtlarında dikkat çekecek şekilde yazılacaktır. Bu verimsiz bir sorgunun veya önbellekleme gereğinin bir işareti olabilir."
+
+#: devel.module:496
+msgid "Store executed queries"
+msgstr "Çalıştırılan sorguları depola"
+
+#: devel.module:498
+msgid "Store statistics about executed queries. See the devel_x tables. This feature is currently only available for the MySQL database backend."
+msgstr "Çalıştırılan sorgular hakkında istatistik tut. devel_x tablolarına bakın. Bu özellik şimdilik sadece MySQL tablolarında desteklenmektedir."
+
+#: devel.module:500
+msgid "Sampling interval"
+msgstr "Örnekleme aralığı"
+
+#: devel.module:503
+msgid "If storing query statistics, only store every nth page view. 1 means every page view, 2 every second, and so on."
+msgstr "Eğer sorgu istatistiği tutuluyorsa, yalnızca n. sayfa gösterimini kaydet. 1 her sayfa gösterimi, 2 her ikinci, vb."
+
+#: devel.module:506
+msgid "Display page timer"
+msgstr "Sayfa zaman sayacını görüntüle"
+
+#: devel.module:508
+msgid "Display page execution time in the query log box."
+msgstr "Sorgu kayıt kutusunda sayfa üretim süresini görüntüle."
+
+#: devel.module:511
+msgid "Display memory usage"
+msgstr "Bellek kullanımını görüntüle"
+
+#: devel.module:513
+msgid "Display how much memory is used to generate the current page. This will show memory usage when devel_init() is called and when devel_exit() is called. PHP must have been compiled with the <em>--enable-memory-limit</em> configuration option for this feature to work."
+msgstr "Bu sayfanın üretiminde ne kadar bellek kullanıldığını görüntüle. devel_init() ve devel_exit() çalıştırıldığı andaki bellek kullanımını görüntüler. Bu özelliğin çalışması için PHP'nin <em>--enable-memory-limit</em> yapılandırma seçeneğiyle derlenmiş olması gerekmektedir."
+
+#: devel.module:516
+msgid "Display redirection page"
+msgstr "Yönlendirme sayfasını görüntüle"
+
+#: devel.module:518
+msgid "When a module executes drupal_goto(), the query log and other developer information is lost. Enabling this setting presents an intermediate page to developers so that the log can be examined before continuing to the destination page."
+msgstr "Bir eklenti drupal_goto() komutunu çalıştırırsa sorgu kayıtları ve diğer geliştirici bilgileri kaybolur. Bu ayarı etkinleştirmek geliştiricilere hedef sayfaya gidilmeden önce bilgileri inceleme fırsatı verecek ara bir sayfa sunar."
+
+#: devel.module:521
+msgid "Display form element keys and weights"
+msgstr "Form elemanlarını ve ağırlıklarını görüntüle"
+
+#: devel.module:523
+msgid "Form element names are needed for performing themeing or altering a form. Their weights determine the position of the element. Enabling this setting will show these keys and weights beside each form item."
+msgstr "Form elemanı isimleri tema ve form düzenleme çalışmasında gereklidir. Ağırlıkları elemanların konumunu belirler. Bu ayarı etkinleştirmek bu anahtarların ve ağırlıkların her form öğesinin yanında görünmesini sağlar."
+
+#: devel.module:526
+msgid "Error handler"
+msgstr "Hata işleyicisi"
+
+#: devel.module:528
+msgid "None"
+msgstr "Hiçbiri"
+
+#: devel.module:528
+msgid "Standard drupal"
+msgstr "Standart Drupal"
+
+#: devel.module:528
+msgid "Backtrace"
+msgstr "Geritakip"
+
+#: devel.module:529
+msgid "Choose an error handler for your site. <em>Backtrace</em> prints nice debug information when an error is noticed, and you !choose. <em>None</em> is a good option when stepping through the site in your debugger."
+msgstr "Siteniz için bir hata işleyicisi seçin. <em>Geritakip</em> bir hata farkedildiğinde güzel bir hata ayıklama bilgisi yazdırır, sizin hata gösterim ayarınız !choose. <em>Hiçbiri</em> hata ayıklayıcınızda çalışırken iyi bir seçenektir."
+
+#: devel.module:529
+msgid "to show errors on screen"
+msgstr "hataları ekranda göstermek için"
+
+#: devel.module:537
+msgid "Default"
+msgstr "Öntanımlı"
+
+#: devel.module:538
+msgid "Log only"
+msgstr "Sadece kaydını tut"
+
+#: devel.module:541
+msgid "Other (%library)"
+msgstr "Diğer (%library)"
+
+#: devel.module:545
+msgid "SMTP library"
+msgstr "SMTP kitaplığı"
+
+#: devel.module:576
+msgid "PHP code to execute"
+msgstr "Çalıştırılacak PHP kodu"
+
+#: devel.module:577
+msgid "Enter some code. Do not use <code>&lt;?php ?&gt;</code> tags."
+msgstr "Biraz kod girin. <code>&lt;?php ?&gt;</code> etiketlerini kullanmayın."
+
+#: devel.module:579
+msgid "Execute"
+msgstr "Çalıştır"
+
+#: devel.module:598
+msgid "Are you sure you want to reset all menu items to their default settings?"
+msgstr "Tüm menü öğelerini öntanımlı ayarlarına getirmek istediğinizden emin misiniz?"
+
+#: devel.module:600
+msgid "Any custom additions or changes to the menu will be lost."
+msgstr "Menüe yapılan tüm ekleme ve değişiklikler kaybolacaktır."
+
+#: devel.module:601
+msgid "Reset all"
+msgstr "Hepsini sıfırla"
+
+#: devel.module:602
+msgid "Cancel"
+msgstr "Vazgeç"
+
+#: devel.module:611
+msgid "Primary links"
+msgstr "Birincil bağlantılar"
+
+#: devel.module:615
+msgid "The menu items have been reset to their default settings."
+msgstr "Menü öğeleri öntanımlı ayarlarına getirildi."
+
+#: devel.module:640
+msgid "Reinstall @name module"
+msgstr "@name eklentisini yeniden yükle"
+
+#: devel.module:669
+msgid "Reinstalled the %name module."
+msgstr "@name eklentisi yeniden yüklendi."
+
+#: devel.module:684
+#: ;726
+msgid "Name"
+msgstr "İsim"
+
+#: devel.module:685
+#: ;727
+msgid "Value"
+msgstr "Değer"
+
+#: devel.module:686
+#: ;728
+msgid "Length"
+msgstr "Uzunluk"
+
+#: devel.module:687
+#: ;729
+msgid "Operations"
+msgstr "İşlemler"
+
+#: devel.module:703
+msgid "edit"
+msgstr "düzenle"
+
+#: devel.module:708
+msgid "Delete"
+msgstr "Sil"
+
+#: devel.module:751
+msgid "Old value"
+msgstr "Eski değer"
+
+#: devel.module:757
+#: ;768
+msgid "New value"
+msgstr "Yeni değer"
+
+#: devel.module:762
+msgid "Submit"
+msgstr "Gönder"
+
+#: devel.module:769
+msgid "Sorry, complex variable types may not be edited yet. Use the <em>Execute PHP</em> block and the <a href=\"@variable-set-doc\">variable_set()</a> function."
+msgstr "Üzgünüz, karmaşık değişken türleri şimdilik düzenlenemiyor. <em>PHP çalıştır</em> bloğunu ve <a href=\"@variable-set-doc\">variable_set()</a> işlevini kullanınız."
+
+#: devel.module:778
+msgid "Saved new value for %name"
+msgstr "%name için yeni değer kaydedildi."
+
+#: devel.module:932
+msgid " Page execution time was %time ms."
+msgstr "Sayfa üretim süresi %time ms."
+
+#: devel.module:1058
+msgid "Mail sent:<br />Key: %mailkey<br />To: %to<br />From: %from<br />Subject: %subject<br />Body: %body<br /><br />Additional headers: !header"
+msgstr "Posta gönderildi:<br />Anahtar: %mailkey<br />Kime: %to<br />Kimden: %from<br />Konu: %subject<br />Gövde: %body<br /><br />Ek başlıklar: !header"
+
+#: devel.module:1072
+msgid "Total (ms)"
+msgstr "Toplam (ms)"
+
+#: devel.module:1073
+msgid "Average (ms)"
+msgstr "Ortalama (ms)"
+
+#: devel.module:1074
+msgid "Std deviation (ms)"
+msgstr "Standart sapma (ms)"
+
+#: devel.module:1075
+msgid "Count"
+msgstr "Sayı"
+
+#: devel.module:1076
+msgid "Function"
+msgstr "İşlev"
+
+#: devel.module:1077
+msgid "Query"
+msgstr "Sorgu"
+
+#: devel.module:1095
+msgid "Delete collected query statistics"
+msgstr "Toplanan sorgu istatistiklerini sil"
+
+#: devel.module:1103
+msgid "Stored query statistics deleted."
+msgstr "Toplanan sorgu istatistikleri silindi."
+
+#: devel.module:227
+msgid "php"
+msgstr "php"
+
+#: devel.module:740
+msgid "one variable deleted"
+msgid_plural "@count variables deleted"
+msgstr[0] "@count değişken silindi"
+
+#: devel.module:235
+msgid "access devel information"
+msgstr "geliştirici bilgilerine erişim"
+
+#: devel.module:235
+msgid "execute php code"
+msgstr "php kodu çalıştır"
+
+#: devel.module:235
+msgid "switch users"
+msgstr "kullanıcı değiştir"
+
Index: modules/devel/generate/update-teaser.php
===================================================================
RCS file: modules/devel/generate/update-teaser.php
diff -N modules/devel/generate/update-teaser.php
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ modules/devel/generate/update-teaser.php	1 Jan 1970 00:00:00 -0000
@@ -0,0 +1,13 @@
+<?php
+// $Id: update-teaser.php,v 1.2 2004/03/04 22:58:04 killes Exp $
+include "includes/bootstrap.inc";
+include "includes/common.inc";
+
+$result = db_query("SELECT nid,body,teaser FROM node");
+
+while ($node = db_fetch_object($result)) {
+  $teaser = node_teaser($node->body);
+  db_query("UPDATE node SET teaser = '%s' WHERE nid = %d", $teaser, $node->nid);
+}
+
+?>
Index: modules/devel/po/da.po
===================================================================
RCS file: modules/devel/po/da.po
diff -N modules/devel/po/da.po
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ modules/devel/po/da.po	1 Jan 1970 00:00:00 -0000
@@ -0,0 +1,388 @@
+# Danish translation of Drupal (devel.module)
+# Copyright 2006-2007 Morten Wulff <wulff@ratatosk.net>
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Danish translation of Drupal (devel.module) $Id: da.po,v 1.1.6.1 2007/01/29 15:34:22 wulff Exp $\n"
+"POT-Creation-Date: 2005-07-25 17:54+0200\n"
+"PO-Revision-Date: 2007-01-29 16:33+0100\n"
+"Last-Translator: Morten Wulff <wulff@ratatosk.net>\n"
+"Language-Team: Danish <l10n@drupaldanmark.dk>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Poedit-Language: Danish\n"
+"X-Poedit-Country: DENMARK\n"
+
+#: devel.module:28
+msgid "Helper functions, pages, and blocks to assist Drupal developers. The devel blocks can be managed via the !block page."
+msgstr "Hjælpefunktioner, sider og blokke der støtter Drupal-udvikling. Blokken kan styres via !block-siden."
+
+#: devel.module:28
+msgid "block administration"
+msgstr "indstil blok"
+
+#: devel.module:30
+msgid "This is a list of defined user functions that generated this current request lifecycle. Click on a function name to view its documention."
+msgstr "En liste af de funktioner, der startede denne forespørgsels livscyklus. Klik på en funktions navn for at se den tilhørende dokumentation."
+
+#: devel.module:32
+msgid "Clicking a module's reinstall button will simulate installing a module. <code>hook_install()</code> will be executed and the schema version number will be set to the most recent update number. Make sure to manually clear out any existing tables first."
+msgstr "Klik på knappen geninstallér for at simulere en installation af et modul. <code>hook_install()</code> kaldes og schema versionsnummeret sættes til det seneste opdateringsnummer. Du skal selv fjerne evt. eksisterende tabeller."
+
+#: devel.module:34
+msgid "Here are the contents of your <code>$_SESSION</code> variable."
+msgstr "Indholdet af din <code>$_SESSION</code> variabel."
+
+#: devel.module:36
+msgid "This is a list of the variables and their values currently stored in variables table and the <code>$conf</code> array of your settings.php file. These variables are usually accessed with <a href=\"@variable-get-doc\">variable_get()</a> and <a href=\"@variable-set-doc\">variable_set()</a>."
+msgstr "En liste af variable og deres værdier gemt i variables-tabellen og <code>$conf</code>-tabellen i settings.php. Disse variable tilgås oftest med <a href=\"@variable-get-doc\">variable_get()</a> og <a href=\"@variable-set-doc\">variable_set()</a>."
+
+# d:\Drupal-contributions-CVS\modules\devel\devel.module:30
+#: devel.module:48
+msgid "Empty cache"
+msgstr "Tøm mellemlager"
+
+#: devel.module:54
+msgid "Database queries"
+msgstr "Databaseforespørgsler"
+
+#: devel.module:58
+msgid "Empty database queries"
+msgstr "Tøm databaseforespørgsler"
+
+#: devel.module:63
+msgid "phpinfo()"
+msgstr "phpinfo()"
+
+#: devel.module:69
+msgid "function reference"
+msgstr "funktionsreference"
+
+#: devel.module:75
+msgid "Reinstall modules"
+msgstr "Geninstallér moduler"
+
+#: devel.module:82
+msgid "Reset menus"
+msgstr "Nulstil menuer"
+
+# d:\Drupal-contributions-CVS\modules\devel\devel.module:33
+#: devel.module:90
+msgid "Variable viewer"
+msgstr "Vis variable"
+
+#: devel.module:96
+msgid "Session viewer"
+msgstr "Vis sessioner"
+
+#: devel.module:102
+#: ;232
+msgid "Switch user"
+msgstr "Skift bruger"
+
+# d:\Drupal-contributions-CVS\modules\devel\devel.module:0
+#: devel.module:109
+#: ;233
+msgid "Devel"
+msgstr "Udvikling"
+
+#: devel.module:120
+#: ;136
+msgid "Devel load"
+msgstr "Devel load"
+
+#: devel.module:127
+msgid "Devel render"
+msgstr "Devel render"
+
+#: devel.module:216
+msgid "%message in %file on line %line."
+msgstr "%message i %file på linje %line."
+
+#: devel.module:234
+msgid "Execute PHP"
+msgstr "Udfør PHP"
+
+#: devel.module:246
+msgid "switch user"
+msgstr "skift bruger"
+
+# d:\Drupal-contributions-CVS\modules\devel\devel.module:0
+#: devel.module:260
+#: ;940;0
+msgid "devel"
+msgstr "udvikling"
+
+#: devel.module:262
+msgid "Adjust module settings for devel module"
+msgstr "Tilpas indstillingerne for devel-modulet."
+
+#: devel.module:263
+msgid "Clear the database cache tables which store page, menu, node, and variable caches."
+msgstr "Ryd mellemlageret i databasen."
+
+#: devel.module:265
+msgid "View a list of currently defined user functions with documentation links"
+msgstr "Vis en liste af brugerfunktioner med links til dokumentationen"
+
+#: devel.module:266
+msgid "Re-run hook_install() for a given module"
+msgstr "Kør hook_install() igen for et givet modul"
+
+#: devel.module:267
+msgid "Resets all menu items to their default settings"
+msgstr "Gendanner standardindstillingerne for alle menupunkter"
+
+#: devel.module:268
+msgid "List the variables and their values currently stored in variables table"
+msgstr "Viser variable og deres værdier fra variables-tabellen."
+
+#: devel.module:269
+msgid "List the contents of $_SESSION"
+msgstr "Vis indholdet af $_SESSION"
+
+#: devel.module:281
+msgid "Execute php"
+msgstr "Udfør php"
+
+# d:\Drupal-contributions-CVS\modules\devel\devel.module:200
+#: devel.module:462
+msgid "Query log"
+msgstr "Forespørgselslog"
+
+#: devel.module:464
+msgid "Collect query info"
+msgstr "Indsaml information om forespørgsler"
+
+#: devel.module:466
+msgid "Collect query info. If disabled, no query log functionality will work."
+msgstr "Forespørgselsloggen virker ikke hvis denne funktion slås fra."
+
+# d:\Drupal-contributions-CVS\modules\devel\devel.module:200
+#: devel.module:468
+msgid "Display query log"
+msgstr "Vis forespørgselslog"
+
+# d:\Drupal-contributions-CVS\modules\devel\devel.module:200
+#: devel.module:470
+msgid "Display a log of the database queries needed to generate the current page, and the execution time for each. Also, queries which are repeated during a single page view are summed in the # column, and printed in red since they are candidates for caching."
+msgstr "Vis en log over de databaseforespørgsler der blev foretaget for at bygge den aktuelle side samt deres afviklingstider. Desuden bliver alle gentagne forespørgsler markeret i '#'-kolonnen, da de er kandidater til mellemlagring."
+
+# d:\Drupal-contributions-CVS\modules\devel\devel.module:200
+#: devel.module:472
+msgid "Sort query log"
+msgstr "Sorter forespørgselslog"
+
+#: devel.module:474
+msgid "by source"
+msgstr "efter kilde"
+
+#: devel.module:474
+msgid "by duration"
+msgstr "efter varighed"
+
+#: devel.module:475
+msgid "The query table can be sorted in the order that the queries were executed or by descending duration."
+msgstr "Tabellen kan sorteres efter den rækkefølge forespørgslerne blev udført eller efter faldende varighed."
+
+#: devel.module:478
+msgid "Slow query highlighting"
+msgstr "Fremhæv langsomme forespørgsler"
+
+# d:\Drupal-contributions-CVS\modules\devel\devel.module:201
+#: devel.module:482
+msgid "Enter an integer in milliseconds. Any query which takes longer than this many milliseconds will be highlighted in the query log. This indicates a possibly inefficient query, or a candidate for caching."
+msgstr "Indtast et antal millisekunder. Enhver forespørgsel der tager længere end det angivne antal millisekunder bliver fremhævet i forespørgselsloggen. Det indikerer en muligvis ineffektiv forespørgsel eller en kandidat til mellemlagring."
+
+#: devel.module:485
+msgid "Store executed queries"
+msgstr "Gem udførte forespørgsler"
+
+#: devel.module:487
+msgid "Store statistics about executed queries. See the devel_x tables. This feature is currently only available for the MySQL database backend."
+msgstr "Gem statistik om udførte forespørgsler. Se devel_x-tabellerne. Denne funktion findes i øjeblikket kun til MySQL."
+
+#: devel.module:489
+msgid "Sampling interval"
+msgstr "Opdateringsinterval"
+
+#: devel.module:492
+msgid "If storing query statistics, only store every nth page view. 1 means every page view, 2 every second, and so on."
+msgstr "Gem kun hver n'te sidevisning. 1 betyder alle sidevisninger, 2 betyder hver anden, osv."
+
+# d:\Drupal-contributions-CVS\modules\devel\devel.module:199
+#: devel.module:495
+msgid "Display page timer"
+msgstr "Vis tidsforbrug"
+
+# d:\Drupal-contributions-CVS\modules\devel\devel.module:199
+#: devel.module:497
+msgid "Display page execution time in the query log box."
+msgstr "Hvis sidens afviklingstid i kassen med forespørgselsloggen."
+
+# d:\Drupal-contributions-CVS\modules\devel\devel.module:200
+#: devel.module:500
+msgid "Display memory usage"
+msgstr "Vis hukommelsesforbrug"
+
+#: devel.module:502
+msgid "Display how much memory is used to generate the current page. This will show memory usage when devel_init() is called and when devel_exit() is called. PHP must have been compiled with the <em>--enable-memory-limit</em> configuration option for this feature to work."
+msgstr "Vis hvor meget hukommelse der bruges til at vise den aktuelle side. Vise hukommelsesforbrug når devel_init() kaldes og når devel_exit() kaldes. PHP skal være kompileret med <em>--enable-memory-limit</em> for at denne funktionalitet virker."
+
+# d:\Drupal-contributions-CVS\modules\devel\devel.module:202
+#: devel.module:505
+msgid "Display redirection page"
+msgstr "Vis omdirigeringsside"
+
+# d:\Drupal-contributions-CVS\modules\devel\devel.module:202
+#: devel.module:507
+msgid "When a module executes drupal_goto(), the query log and other developer information is lost. Enabling this setting presents an intermediate page to developers so that the log can be examined before continuing to the destination page."
+msgstr "Når et modul kalder drupal_goto() mistes forespørgselsloggen og anden udviklingsinformation. Aktiver denne indstilling for at se en mellemliggende side, der viser loggen før der fortsættes til næste side."
+
+#: devel.module:510
+msgid "Display form element keys and weights"
+msgstr "Vis nøgler og vægte af formular-elementer"
+
+#: devel.module:512
+msgid "Form element names are needed for performing themeing or altering a form. Their weights determine the position of the element. Enabling this setting will show these keys and weights beside each form item."
+msgstr "Navne på formular-elementer er nødvendige når man skal lave temaer eller ændre en formular. Vægtene bestemmer rækkefølgen af elementerne."
+
+#: devel.module:515
+msgid "Error handler"
+msgstr "Fejlhåndtering"
+
+#: devel.module:517
+msgid "None"
+msgstr "Ingen"
+
+#: devel.module:517
+msgid "Standard drupal"
+msgstr "Standard Drupal"
+
+#: devel.module:517
+msgid "Backtrace"
+msgstr "Sporing"
+
+#: devel.module:518
+msgid "Choose an error handler for your site. <em>Backtrace</em> prints nice debug information when an error is noticed, and you !choose. <em>None</em> is a good option when stepping through the site in your debugger."
+msgstr "Vælg hvordan fejl håndteres af dit site. <em>Sporing</em> udskriver debug information når der opstår en fejl og du !choose. <em>Ingen</em> er et godt valg når du gennemgår kode i din debugger."
+
+#: devel.module:518
+msgid "to show errors on screen"
+msgstr "for at vise fejl på skærmen"
+
+#: devel.module:526
+msgid "Default"
+msgstr "Standard"
+
+#: devel.module:527
+msgid "Log only"
+msgstr "Kun log"
+
+#: devel.module:530
+msgid "Other (%library)"
+msgstr "Andet (%library)"
+
+#: devel.module:534
+msgid "SMTP library"
+msgstr "SMTP bibliotek"
+
+#: devel.module:561
+msgid "PHP code to execute"
+msgstr "Udfør PHP kode"
+
+#: devel.module:562
+msgid "Enter some code. Do not use <code>&lt;?php ?&gt;</code> tags."
+msgstr "Indtast noget kode. Du skal ikke bruge <code>&lt;?php ?&gt;</code>-tags."
+
+#: devel.module:564
+msgid "Execute"
+msgstr "Udfør"
+
+#: devel.module:595
+msgid "Are you sure you want to reset all menu items to their default settings?"
+msgstr "Ønsker du at gendanne standardindstillinger for alle menupunkter?"
+
+#: devel.module:597
+msgid "Any custom additions or changes to the menu will be lost."
+msgstr "Alle tilføjelser til og ændringer af menuen går tabt."
+
+#: devel.module:598
+msgid "Reset all"
+msgstr "Gendan alle"
+
+#: devel.module:599
+msgid "Cancel"
+msgstr "Annuller"
+
+#: devel.module:608
+msgid "Primary links"
+msgstr "Primære henvisninger"
+
+#: devel.module:612
+msgid "The menu items have been reset to their default settings."
+msgstr "Menupunkternes standardindstillinger gendannet."
+
+#: devel.module:637
+msgid "Reinstall @name module"
+msgstr "Geninstallér modulet @name."
+
+#: devel.module:666
+msgid "Reinstalled the %name module."
+msgstr "%name geninstalleret."
+
+#: devel.module:940
+msgid "Mail sent:<br />Key: %mailkey<br />To: %to<br />From: %from<br />Subject: %subject<br />Body: %body<br /><br />Additional headers: !header"
+msgstr "Mail sendt:<br />Nøgle: %mailkey<br />Til: %to<br />Fra: %from<br />Emne: %subject<br />Indhold: %body<br /><br />Yderligere brevhoveder: !header"
+
+#: devel.module:954
+msgid "Total time (ms)"
+msgstr "Samlet tid (ms)"
+
+#: devel.module:955
+msgid "Average (ms)"
+msgstr "Gennemsnit (ms)"
+
+#: devel.module:956
+msgid "Standard deviation (ms)"
+msgstr "Standardafvigelse (ms)"
+
+#: devel.module:957
+msgid "Count"
+msgstr "Tæl"
+
+#: devel.module:958
+msgid "Function"
+msgstr "Funktion"
+
+#: devel.module:959
+msgid "Query"
+msgstr "Forespørgsel"
+
+#: devel.module:977
+msgid "Delete collected query statistics"
+msgstr "Slet indsamlet forespørgselsstatistik"
+
+#: devel.module:985
+msgid "Stored query statistics deleted."
+msgstr "Indsamlet forespørgselsstatistik slettet."
+
+#: devel.module:216
+msgid "php"
+msgstr "php"
+
+# d:\Drupal-contributions-CVS\modules\devel\devel.module:210
+#: devel.module:224
+msgid "access devel information"
+msgstr "tilgå udviklingsinformation"
+
+#: devel.module:224
+msgid "execute php code"
+msgstr "udfør PHP-kode"
+
+#: devel.module:224
+msgid "switch users"
+msgstr "skift bruger"
+
Index: modules/devel/generate/import-users.php
===================================================================
RCS file: modules/devel/generate/import-users.php
diff -N modules/devel/generate/import-users.php
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ modules/devel/generate/import-users.php	1 Jan 1970 00:00:00 -0000
@@ -0,0 +1,14 @@
+<?php
+// Reads a csv formatted file and creates users.
+// $Id: import-users.php,v 1.1 2005/09/06 14:06:39 weitzman Exp $
+include "includes/bootstrap.inc";
+include "includes/common.inc";
+
+$handle = fopen("daten.csv", "r");
+while ($data = fgetcsv ($handle, 1000, ";")) {
+  $array = array("name" => $data[0], "pass" => $data[1], "mail" => $data[2], "status" => 1, "rid" => _user_authenticated_id());
+  user_save($account, $array);
+}
+fclose ($handle);
+
+?>
Index: modules/devel/macro.info
===================================================================
RCS file: modules/devel/macro.info
diff -N modules/devel/macro.info
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ modules/devel/macro.info	1 Jan 1970 00:00:00 -0000
@@ -0,0 +1,8 @@
+; $Id
+name = Macro
+description = Allows administrators to record and playback form submissions.
+package = Development
+; Information added by drupal.org packaging script on 2007-04-01
+version = "5.x-1.x-dev"
+project = "devel"
+
Index: modules/devel/devel.css
===================================================================
RCS file: modules/devel/devel.css
diff -N modules/devel/devel.css
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ modules/devel/devel.css	1 Jan 1970 00:00:00 -0000
@@ -0,0 +1,3 @@
+.dev-query, .dev-timer, .dev-memory-usage {
+  padding-top: 2em;
+}
Index: modules/devel/devel_generate.module
===================================================================
RCS file: modules/devel/devel_generate.module
diff -N modules/devel/devel_generate.module
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ modules/devel/devel_generate.module	1 Jan 1970 00:00:00 -0000
@@ -0,0 +1,310 @@
+<?php
+// $Id: devel_generate.module,v 1.1.2.1 2007/03/29 00:00:25 jjeff Exp $
+
+/**
+ * Implementation of hook_menu().
+ */
+function devel_generate_menu($may_cache) {
+  $items = array();
+
+  if ($may_cache) {
+    $items[] = array(
+      'path' => 'admin/user/generate',
+      'title' => t('Generate users'),
+      'callback' => 'drupal_get_form',
+      'description' => t('Generate a given number of users. Optionally delete current users.'),
+      'callback arguments' => array('devel_generate_users_form'),
+      'access' => user_access('administer users'),
+      'type' => MENU_NORMAL_ITEM
+    );
+    $items[] = array(
+      'path' => 'admin/content/generate',
+      'title' => t('Generate content'),
+      'description' => t('Generate a given number of nodes and comments. Optionally delete current items.'),
+      'callback' => 'drupal_get_form',
+      'callback arguments' => array('devel_generate_content_form'),
+      'access' => user_access('administer nodes'),
+      'type' => MENU_NORMAL_ITEM
+    );
+    $items[] = array(
+      'path' => 'admin/content/generate_taxonomy',
+      'title' => t('Generate categories'),
+      'description' => t('Generate a given number of vocabularies and terms. Optionally delete current categories.'),
+      'callback' => 'drupal_get_form',
+      'callback arguments' => array('devel_generate_taxonomy_form'),
+      'access' => user_access('administer nodes'),
+      'type' => MENU_NORMAL_ITEM
+    );
+  }
+
+  return $items;
+}
+
+
+/**
+ * Overview page for admin/generate page
+ */
+function devel_generate_overview() {
+
+  $menu = menu_get_item(NULL, 'admin/generate');
+  $content = system_admin_menu_block($menu);
+
+  $output = theme('admin_block_content', $content);
+
+  return $output;
+}
+
+function devel_generate_users_form() {
+  $form['num'] = array(
+    '#type' => 'textfield',
+    '#title' => t('How many users would you like to generate?'),
+    '#default_value' => 50,
+    '#size' => 10,
+  );
+  $form['kill_users'] = array(
+    '#type' => 'checkbox',
+    '#title' => t('Delete all users but user 1 before generating new users.'),
+    '#default_value' => FALSE,  
+  );
+  $form['submit'] = array(
+    '#type' => 'submit',
+    '#value' => t('Do it!'),
+  );
+  return $form;
+}
+
+function devel_generate_users_form_submit($form_id, $form_values) {
+  $url = parse_url($GLOBALS['base_url']);
+  $num = $form_values['num'];
+  // If not in 'safe mode', increase the maximum execution time:
+	if (!ini_get('safe_mode')) {
+	  set_time_limit(240);
+	}
+  if ($form_values['kill_users']) {
+    db_query('DELETE FROM {users} WHERE uid > 1');
+    drupal_set_message(t('Users deleted.'));
+  }
+  for ($i = 2; $i <= $num; $i++) {
+    $uid = db_next_id('{users_uid}');
+    $length = rand(4, 12);
+    $name = devel_generate_word($length);
+    $pass = md5(user_password());
+    $mail = $name .'@'. $url['host'];
+    $status = 1;
+    db_query("INSERT INTO {users} (uid, name, pass, mail, status, created, access) VALUES (%d, '%s', '%s', '%s', %d, %d, %d)", $uid, $name, $pass, $mail, $status, time(), time());
+  }
+  db_query("UPDATE {sequences} SET id = %d WHERE name = 'users_uid'", $uid);
+  drupal_set_message(t('%num users created.', array('%num' => $num)));
+}
+
+function devel_generate_word($length){
+    srand((double)microtime()*1000000); 
+    
+    $vowels = array("a", "e", "i", "o", "u"); 
+    $cons = array("b", "c", "d", "g", "h", "j", "k", "l", "m", "n", "p", "r", "s", "t", "u", "v", "w", "tr", 
+    "cr", "br", "fr", "th", "dr", "ch", "ph", "wr", "st", "sp", "sw", "pr", "sl", "cl", "sh"); 
+     
+    $num_vowels = count($vowels); 
+    $num_cons = count($cons); 
+     
+    while(strlen($word) < $length){ 
+      $word .= $cons[rand(0, $num_cons - 1)] . $vowels[rand(0, $num_vowels - 1)]; 
+    } 
+    
+    return substr($word, 0, $length);
+}
+
+function devel_generate_content_form() {
+  $form['num_nodes'] = array(
+    '#type' => 'textfield',
+    '#title' => t('How many nodes would you like to generate?'),
+    '#default_value' => 100,
+    '#size' => 10,
+  );
+  $form['num_comments'] = array(
+    '#type' => 'textfield',
+    '#title' => t('How many comments would you like to generate?'),
+    '#default_value' => 500,
+    '#size' => 10,
+  );
+  $form['kill_content'] = array(
+    '#type' => 'checkbox',
+    '#title' => t('Delete existing content before generating new content.'),
+    '#default_value' => FALSE,  
+  );
+  $form['title_length'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Max word length of titles'),
+    '#default_value' => 8,
+    '#size' => 10,
+  );
+  $form['submit'] = array(
+    '#type' => 'submit',
+    '#value' => t('Do it!'),
+  );
+  return $form;
+}
+
+function devel_generate_content_form_submit($form_id, $form_values) {
+	$path = drupal_get_path('module', 'devel');
+  require_once('devel_generate.inc');
+  if ($form_values['kill_content']) {
+	  db_query("DELETE FROM {comments}");
+		db_query("DELETE FROM {node}");
+		db_query("DELETE FROM {node_revisions}");
+		db_query("DELETE FROM {node_comment_statistics}");
+		if (db_table_exists(forum)) { db_query("DELETE FROM {forum}"); }
+		db_query("DELETE FROM {url_alias}");
+		db_query("UPDATE {sequences} SET id = '0' WHERE name = 'node_nid'");
+		db_query("UPDATE {sequences} SET id = '0' WHERE name = 'comments_cid'");
+		db_query("ALTER TABLE {node} AUTO_INCREMENT = 1");
+		db_query("ALTER TABLE {comments} AUTO_INCREMENT = 1");
+		drupal_set_message(t('Content deleted.'));
+  }
+  else {
+  	$next_nid = db_result(db_query("SELECT id FROM {sequences} WHERE name = '{node}_nid'"))+1;
+  }
+	
+	// get user id
+	$users = devel_get_users();
+	
+	$terms = devel_get_terms();
+	
+	// create 100 pseudo-random nodes:
+	devel_create_nodes($form_values['num_nodes'], $users, $form_values['title_length']);
+	drupal_set_message(t('%num nodes created.', array('%num' => $form_values['num_nodes'])));
+	
+	$nodes = devel_get_nodes($next_nid);
+	
+	devel_add_terms($nodes, $terms);
+	
+	$comments = devel_get_comments();
+	
+	devel_create_comments($form_values['num_comments'], $users, $nodes, $comments);
+    drupal_set_message(t('%num comments created.', array('%num' => $form_values['num_comments'])));
+}
+
+function devel_generate_vocabs($records, $maxlength = 12) {
+  $types = array("story", "blog", "forum", "page");
+
+  // Insert new data:
+  for ($i = 1; $i <= $records; $i++) {
+    $voc = array();
+    $voc['name'] = devel_generate_word(rand(2, $maxlength));
+    $voc['description'] = "description of ". $voc['name'];
+    $voc['nodes'] = array_flip(array($types[array_rand($types)]));
+    foreach ($voc['nodes'] as $key => $value) {
+      $voc['nodes'][$key] = $key;
+    }
+    $voc['multiple'] = 1;
+    $voc['required'] = 0;
+    $voc['relations'] = 1;
+    $voc['hierarchy'] = 1;
+    $voc['weight'] = rand(0,10);    
+
+    taxonomy_save_vocabulary($voc);
+    $output .= "created vocabulary ". $voc['name'];
+  }
+  return $output;
+}
+
+function devel_generate_terms($records, $vocs, $maxlength = 12) {
+  // Insert new data:
+  for ($i = 1; $i <= $records; $i++) {
+
+    switch ($i % 2) {
+      case 1:
+        $term['vid'] = $vocs[array_rand($vocs)];
+        // dont set a parent. handled by taxonomy_save_term()
+        // $term->parent = 0;
+        break;
+      case 2:
+      default:
+        $parent = db_fetch_object(db_query_range("SELECT t.tid, v.vid FROM {term_data} t INNER JOIN {vocabulary} v ON t.vid = v.vid ORDER BY RAND()", 0, 1));
+        $term['parent'] = array($parent->tid);
+        $term['vid'] = $parent->vid;
+        break;
+    }
+ 
+    $term['name'] = devel_generate_word(rand(2, $maxlength));
+    $term['description'] = "description of ". $term['name'];
+    $term['weight'] = rand(0,10);
+   
+    $status = taxonomy_save_term($term);
+    
+    if ($status) {
+      $output .= t("Created term @term", array('@term' => $term['name'])). "<br />";
+    }
+    else {
+      $output .= t("There was an error creating term @term", array('@term' => $term['name'])). "<br />";
+    }
+    unset($term);
+  }
+  return $output;
+}
+
+function devel_generate_get_vocabs() {
+  $vocs = array();
+  $result = db_query("SELECT vid FROM {vocabulary}");
+  while($voc = db_fetch_object($result)){
+    $vocs[] = $voc->vid;
+  }
+  return $vocs;
+}
+
+function devel_generate_taxonomy_form() {
+  $form['num_vocab'] = array(
+    '#type' => 'textfield',
+    '#title' => t('How many vocabularies would you like to generate?'),
+    '#default_value' => 3,
+    '#size' => 10,
+  );
+  $form['num_terms'] = array(
+    '#type' => 'textfield',
+    '#title' => t('How many terms would you like to generate?'),
+    '#default_value' => 50,
+    '#size' => 10,
+  );
+  $form['kill_taxonomy'] = array(
+    '#type' => 'checkbox',
+    '#title' => t('Delete existing terms and vocabularies before generating new content.'),
+    '#default_value' => FALSE,  
+  );
+  $form['title_length'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Max word length of term/vocab names'),
+    '#default_value' => 12,
+    '#size' => 10,
+  );
+  $form['submit'] = array(
+    '#type' => 'submit',
+    '#value' => t('Do it!'),
+  );
+  return $form;
+}
+
+function devel_generate_taxonomy_form_submit($form_id, $form_values) {
+  
+  $vocs = array();
+  $result = db_query("SELECT vid FROM {vocabulary}");
+  while($voc = db_fetch_object($result)){
+    $vocs[] = $voc->vid;
+  }
+
+  if ($form_values['kill_taxonomy']) {
+    db_query("DELETE FROM {term_data}");
+    db_query("DELETE FROM {term_node}");
+    db_query("DELETE FROM {term_hierarchy}");
+    db_query("DELETE FROM {term_relation}");
+    db_query("DELETE FROM {term_synonym}");
+    db_query("DELETE FROM {vocabulary}");
+    db_query("DELETE FROM {vocabulary_node_types}");
+    db_query("UPDATE {sequences} SET id = '0' WHERE name = '{vocabulary_vid}'");
+    db_query("UPDATE {sequences} SET id = '0' WHERE name = '{term_data_tid}'");
+  }
+  
+  $output = devel_generate_vocabs($form_values['num_vocab'], $form_values['title_length']);
+  $vocs = devel_generate_get_vocabs();
+  $output .= devel_generate_terms($form_values['num_terms'], $vocs, $form_values['title_length']);
+  drupal_set_message($output);
+}
Index: modules/devel/generate/generate-og-users.php
===================================================================
RCS file: modules/devel/generate/generate-og-users.php
diff -N modules/devel/generate/generate-og-users.php
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ modules/devel/generate/generate-og-users.php	1 Jan 1970 00:00:00 -0000
@@ -0,0 +1,51 @@
+<?php
+
+// $Id: generate-og-users.php,v 1.3 2006/06/11 00:43:25 killes Exp $:
+
+/**
+ * This script assigns existing users to existing groups.
+ * Requires Drupal 4.7 and OG module.
+ *
+ * Takes all groups, and assines a decreasing number of random users
+ * as members.
+ *
+ * If n is the total number of registered users, the first group gets
+ * all of them, the next gets half of them, etc. Admins are excluded.
+ *
+ * Sponsored by CivicSpace Labs
+ */
+require_once './includes/bootstrap.inc';
+drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);
+
+function gou_get_groups() {
+  $result = db_query("SELECT nid, uid FROM {og_uid} WHERE is_admin >= 1");
+  $groups = array();
+  while ($group = db_fetch_array($result)) {
+    $groups[$group['nid']][] = $group['uid'];
+  }
+
+  return $groups;
+}
+
+function gou_count_users() {
+  return db_result(db_query('SELECT COUNT(*) FROM {users} WHERE uid > 0'));
+}
+
+function gou_assign_users($nid, $admins, $limit = NULL) {
+  $sql = 'INSERT INTO og_uid (nid, uid, is_active, mail_type) SELECT %d, uid, 1, 1 FROM users u WHERE u.uid NOT IN ('. str_pad('', count($admins) * 3 - 1, '%d,') .') ORDER BY RAND()';
+  if ($limit) {
+    $sql .= " LIMIT $limit";
+  }
+  db_query($sql, $nid, implode(',', $admins));
+}
+
+
+$users = gou_count_users();
+$groups = gou_get_groups();
+
+foreach ($groups as $nid => $group) {
+  $node = node_load($nid);
+  drupal_set_message(t('Assigned %n users to group %t.', array('%n' => $users, '%t' => theme('placeholder', $node->title))));
+  gou_assign_users($nid, $group, $users);
+  $users = floor($users / 2 + count($group));
+}
Index: modules/devel/generate/README.txt
===================================================================
RCS file: modules/devel/generate/README.txt
diff -N modules/devel/generate/README.txt
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ modules/devel/generate/README.txt	1 Jan 1970 00:00:00 -0000
@@ -0,0 +1,24 @@
+GENERAL
+===========================
+To use these scripts, copy them to the root of your Drupal site.
+When you are done, delete them since they are not access controlled.
+
+To generate users, taxonomy terms, and content items (nodes and comments), you should 
+use the Devel Generate module.
+
+import-taxonomy-terms.php
+===========================
+
+This simple script creates terms out of an array of names which you provide. unlike
+the other scripts in this directory, this one is meant for live sites which need to bulk
+import data into the term table. See the source code comments for config instructions
+
+update-teaser.php
+=================
+
+Use this script to regenerate the teasers in the node table.
+
+import-users.php
+==================
+
+A small script that reads users from a csv formatted file and puts them into your database.
Index: modules/devel/LICENSE.txt
===================================================================
RCS file: modules/devel/LICENSE.txt
diff -N modules/devel/LICENSE.txt
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ modules/devel/LICENSE.txt	1 Jan 1970 00:00:00 -0000
@@ -0,0 +1,274 @@
+GNU GENERAL PUBLIC LICENSE
+
+              Version 2, June 1991
+
+Copyright (C) 1989, 1991 Free Software Foundation, Inc. 675 Mass Ave,
+Cambridge, MA 02139, USA. Everyone is permitted to copy and distribute
+verbatim copies of this license document, but changing it is not allowed.
+
+                  Preamble
+
+The licenses for most software are designed to take away your freedom to
+share and change it. By contrast, the GNU General Public License is
+intended to guarantee your freedom to share and change free software--to
+make sure the software is free for all its users. This General Public License
+applies to most of the Free Software Foundation's software and to any other
+program whose authors commit to using it. (Some other Free Software
+Foundation software is covered by the GNU Library General Public License
+instead.) You can apply it to your programs, too.
+
+When we speak of free software, we are referring to freedom, not price. Our
+General Public Licenses are designed to make sure that you have the
+freedom to distribute copies of free software (and charge for this service if
+you wish), that you receive source code or can get it if you want it, that you
+can change the software or use pieces of it in new free programs; and that
+you know you can do these things.
+
+To protect your rights, we need to make restrictions that forbid anyone to
+deny you these rights or to ask you to surrender the rights. These restrictions
+translate to certain responsibilities for you if you distribute copies of the
+software, or if you modify it.
+
+For example, if you distribute copies of such a program, whether gratis or for
+a fee, you must give the recipients all the rights that you have. You must make
+sure that they, too, receive or can get the source code. And you must show
+them these terms so they know their rights.
+
+We protect your rights with two steps: (1) copyright the software, and (2)
+offer you this license which gives you legal permission to copy, distribute
+and/or modify the software.
+
+Also, for each author's protection and ours, we want to make certain that
+everyone understands that there is no warranty for this free software. If the
+software is modified by someone else and passed on, we want its recipients
+to know that what they have is not the original, so that any problems
+introduced by others will not reflect on the original authors' reputations.
+
+Finally, any free program is threatened constantly by software patents. We
+wish to avoid the danger that redistributors of a free program will individually
+obtain patent licenses, in effect making the program proprietary. To prevent
+this, we have made it clear that any patent must be licensed for everyone's
+free use or not licensed at all.
+
+The precise terms and conditions for copying, distribution and modification
+follow.
+
+           GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND
+               MODIFICATION
+
+0. This License applies to any program or other work which contains a notice
+placed by the copyright holder saying it may be distributed under the terms
+of this General Public License. The "Program", below, refers to any such
+program or work, and a "work based on the Program" means either the
+Program or any derivative work under copyright law: that is to say, a work
+containing the Program or a portion of it, either verbatim or with
+modifications and/or translated into another language. (Hereinafter, translation
+is included without limitation in the term "modification".) Each licensee is
+addressed as "you".
+
+Activities other than copying, distribution and modification are not covered
+by this License; they are outside its scope. The act of running the Program is
+not restricted, and the output from the Program is covered only if its contents
+constitute a work based on the Program (independent of having been made
+by running the Program). Whether that is true depends on what the Program
+does.
+
+1. You may copy and distribute verbatim copies of the Program's source
+code as you receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice and
+disclaimer of warranty; keep intact all the notices that refer to this License
+and to the absence of any warranty; and give any other recipients of the
+Program a copy of this License along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and you
+may at your option offer warranty protection in exchange for a fee.
+
+2. You may modify your copy or copies of the Program or any portion of it,
+thus forming a work based on the Program, and copy and distribute such
+modifications or work under the terms of Section 1 above, provided that you
+also meet all of these conditions:
+
+a) You must cause the modified files to carry prominent notices stating that
+you changed the files and the date of any change.
+
+b) You must cause any work that you distribute or publish, that in whole or in
+part contains or is derived from the Program or any part thereof, to be
+licensed as a whole at no charge to all third parties under the terms of this
+License.
+
+c) If the modified program normally reads commands interactively when run,
+you must cause it, when started running for such interactive use in the most
+ordinary way, to print or display an announcement including an appropriate
+copyright notice and a notice that there is no warranty (or else, saying that
+you provide a warranty) and that users may redistribute the program under
+these conditions, and telling the user how to view a copy of this License.
+(Exception: if the Program itself is interactive but does not normally print such
+an announcement, your work based on the Program is not required to print
+an announcement.)
+
+These requirements apply to the modified work as a whole. If identifiable
+sections of that work are not derived from the Program, and can be
+reasonably considered independent and separate works in themselves, then
+this License, and its terms, do not apply to those sections when you distribute
+them as separate works. But when you distribute the same sections as part
+of a whole which is a work based on the Program, the distribution of the
+whole must be on the terms of this License, whose permissions for other
+licensees extend to the entire whole, and thus to each and every part
+regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest your rights to
+work written entirely by you; rather, the intent is to exercise the right to
+control the distribution of derivative or collective works based on the
+Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of a
+storage or distribution medium does not bring the other work under the scope
+of this License.
+
+3. You may copy and distribute the Program (or a work based on it, under
+Section 2) in object code or executable form under the terms of Sections 1
+and 2 above provided that you also do one of the following:
+
+a) Accompany it with the complete corresponding machine-readable source
+code, which must be distributed under the terms of Sections 1 and 2 above
+on a medium customarily used for software interchange; or,
+
+b) Accompany it with a written offer, valid for at least three years, to give
+any third party, for a charge no more than your cost of physically performing
+source distribution, a complete machine-readable copy of the corresponding
+source code, to be distributed under the terms of Sections 1 and 2 above on
+a medium customarily used for software interchange; or,
+
+c) Accompany it with the information you received as to the offer to distribute
+corresponding source code. (This alternative is allowed only for
+noncommercial distribution and only if you received the program in object
+code or executable form with such an offer, in accord with Subsection b
+above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source code
+means all the source code for all modules it contains, plus any associated
+interface definition files, plus the scripts used to control compilation and
+installation of the executable. However, as a special exception, the source
+code distributed need not include anything that is normally distributed (in
+either source or binary form) with the major components (compiler, kernel,
+and so on) of the operating system on which the executable runs, unless that
+component itself accompanies the executable.
+
+If distribution of executable or object code is made by offering access to
+copy from a designated place, then offering equivalent access to copy the
+source code from the same place counts as distribution of the source code,
+even though third parties are not compelled to copy the source along with the
+object code.
+
+4. You may not copy, modify, sublicense, or distribute the Program except as
+expressly provided under this License. Any attempt otherwise to copy,
+modify, sublicense or distribute the Program is void, and will automatically
+terminate your rights under this License. However, parties who have received
+copies, or rights, from you under this License will not have their licenses
+terminated so long as such parties remain in full compliance.
+
+5. You are not required to accept this License, since you have not signed it.
+However, nothing else grants you permission to modify or distribute the
+Program or its derivative works. These actions are prohibited by law if you
+do not accept this License. Therefore, by modifying or distributing the
+Program (or any work based on the Program), you indicate your acceptance
+of this License to do so, and all its terms and conditions for copying,
+distributing or modifying the Program or works based on it.
+
+6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the original
+licensor to copy, distribute or modify the Program subject to these terms and
+conditions. You may not impose any further restrictions on the recipients'
+exercise of the rights granted herein. You are not responsible for enforcing
+compliance by third parties to this License.
+
+7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues), conditions
+are imposed on you (whether by court order, agreement or otherwise) that
+contradict the conditions of this License, they do not excuse you from the
+conditions of this License. If you cannot distribute so as to satisfy
+simultaneously your obligations under this License and any other pertinent
+obligations, then as a consequence you may not distribute the Program at all.
+For example, if a patent license would not permit royalty-free redistribution
+of the Program by all those who receive copies directly or indirectly through
+you, then the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply and
+the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any patents or
+other property right claims or to contest validity of any such claims; this
+section has the sole purpose of protecting the integrity of the free software
+distribution system, which is implemented by public license practices. Many
+people have made generous contributions to the wide range of software
+distributed through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing to
+distribute software through any other system and a licensee cannot impose
+that choice.
+
+This section is intended to make thoroughly clear what is believed to be a
+consequence of the rest of this License.
+
+8. If the distribution and/or use of the Program is restricted in certain
+countries either by patents or by copyrighted interfaces, the original copyright
+holder who places the Program under this License may add an explicit
+geographical distribution limitation excluding those countries, so that
+distribution is permitted only in or among countries not thus excluded. In such
+case, this License incorporates the limitation as if written in the body of this
+License.
+
+9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will be
+similar in spirit to the present version, but may differ in detail to address new
+problems or concerns.
+
+Each version is given a distinguishing version number. If the Program specifies
+a version number of this License which applies to it and "any later version",
+you have the option of following the terms and conditions either of that
+version or of any later version published by the Free Software Foundation. If
+the Program does not specify a version number of this License, you may
+choose any version ever published by the Free Software Foundation.
+
+10. If you wish to incorporate parts of the Program into other free programs
+whose distribution conditions are different, write to the author to ask for
+permission. For software which is copyrighted by the Free Software
+Foundation, write to the Free Software Foundation; we sometimes make
+exceptions for this. Our decision will be guided by the two goals of
+preserving the free status of all derivatives of our free software and of
+promoting the sharing and reuse of software generally.
+
+               NO WARRANTY
+
+11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE,
+THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT
+PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE
+STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT
+WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED,
+INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND
+PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL
+NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR
+AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR
+ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE
+LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL,
+SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES
+ARISING OUT OF THE USE OR INABILITY TO USE THE
+PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA
+OR DATA BEING RENDERED INACCURATE OR LOSSES
+SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE
+PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN
+IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF
+THE POSSIBILITY OF SUCH DAMAGES.
+
+          END OF TERMS AND CONDITIONS
Index: modules/devel/devel_generate.inc
===================================================================
RCS file: modules/devel/devel_generate.inc
diff -N modules/devel/devel_generate.inc
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ modules/devel/devel_generate.inc	1 Jan 1970 00:00:00 -0000
@@ -0,0 +1,241 @@
+<?php
+// $Id: devel_generate.inc,v 1.1.2.1 2007/03/29 00:00:25 jjeff Exp $
+// If not in 'safe mode', increase the maximum execution time:
+if (!ini_get('safe_mode')) {
+  set_time_limit(240);
+}
+
+function devel_create_nodes($records, $users, $title_length = 8) {
+
+  $possible_types = array("story", "blog", "forum", "page");
+  // Only use types that exist.
+  $installed_types = array_keys(node_get_types('types'));
+  foreach ($possible_types as $type) {
+    if (in_array($type, $installed_types)) {
+      $types[] = $type;
+    }
+  }
+  $users = array_merge($users, array('0'));
+
+  if (is_array($types)) {
+    // Insert new data:
+    for ($i = 1; $i <= $records; $i++) {
+      $node->uid = $users[array_rand($users)];
+      $node->type = $types[array_rand($types)];
+      // get the next nid without incrementing it
+      $next_nid = db_result(db_query("SELECT id FROM {sequences} WHERE name = '{node}_nid'"))+1;
+      
+      $title = devel_create_greeking(rand(1, $title_length), TRUE);
+      /*
+      $title_words = rand(1, 8);
+      while($i < $title_words){
+      	$title .= devel_generate_word(rand(4, 9));
+      	$i;
+      }
+      */
+      $node->title = $title;
+      $node->body = "node #$next_nid ($node->type) - ". devel_create_content();
+      $node->teaser = node_teaser($node->body);
+      $node->filter = variable_get('filter_default_format', 1);
+      $node->status = 1;
+      $node->revision = rand(0,1);
+      $node->promote = rand(0, 1);
+      $node->comment = 2;
+      $node->created = time();
+      $node->changed = time();
+
+      // Save the node:
+      node_save($node);
+
+      // Setup a path:
+      db_query("INSERT INTO {url_alias} (src, dst) VALUES ('%s', '%s')", "node/$node->nid", "node-$node->nid-$node->type");
+      unset($node);
+    }
+  }
+}
+
+function devel_create_comments($records, $users, $nodes, $comments) {
+  $users = array_merge($users, array('0'));
+  // Insert new data:
+  for ($i = 1; $i <= $records; $i++) {
+    $comment->cid = db_next_id("{comments}_cid");
+    $comment->nid = array_rand($nodes);
+
+    switch ($i % 3) {
+      case 1:
+        $comment->pid = db_result(db_query("SELECT cid FROM {comments} WHERE pid = 0 AND nid = %d ORDER BY RAND() LIMIT 1", $comment->nid));
+        break;
+      case 2:
+        $comment->pid = db_result(db_query("SELECT cid FROM {comments} WHERE pid > 0 AND nid = %d ORDER BY RAND() LIMIT 1", $comment->nid));
+        break;
+      default:
+        $comment->pid = 0;
+    }
+
+    $comment->subject = "comment #". $comment->cid;
+    $comment->comment = "body of comment #". $comment->cid;
+    $comment->uid = $users[array_rand($users)];
+
+    db_query("INSERT INTO {comments} (cid, nid, pid, uid, subject, comment, status, thread, timestamp) VALUES (%d, %d, %d, %d, '%s', '%s', %d, %d, %d)", $comment->cid, $comment->nid, $comment->pid, $comment->uid, $comment->subject, $comment->comment, 0, 0, time());
+  }
+}
+
+function devel_create_content() {
+  $nparas = rand(1,12);
+  $type = rand(0,3);
+
+  $output = "";
+  switch($type % 3) {
+    case 1: // html
+      for ($i = 1; $i <= $nparas; $i++) {
+        $output .= devel_create_para(rand(10,60),1);
+      }
+      break;
+
+    case 2: // brs only
+      for ($i = 1; $i <= $nparas; $i++) {
+        $output .= devel_create_para(rand(10,60),2);
+      }
+      break;
+
+    default: // plain text
+      for ($i = 1; $i <= $nparas; $i++) {
+        $output .= devel_create_para(rand(10,60)) ."\n\n";
+      }
+  }
+
+  return $output;
+}
+
+function devel_create_para($words, $type = 0) {
+  $output = "";
+  switch ($type) {
+    case 1:
+      $output .= "<p>";
+      $output .= devel_create_greeking($words);
+      $output = trim($output) ."</p>";
+      break;
+
+    case 2:
+      $output .= devel_create_greeking($words);
+      $output = trim($output) ."<br />";
+      break;
+
+    default:
+      $output .= devel_create_greeking($words);
+      $output = trim($output);
+  }
+  return $output;
+}
+
+function devel_create_greeking($words, $title = FALSE) {
+  $dictionary = array("abbas", "abdo", "abico", "abigo", "abluo", "accumsan",
+    "acsi", "ad", "adipiscing", "aliquam", "aliquip", "amet", "antehabeo",
+    "appellatio", "aptent", "at", "augue", "autem", "bene", "blandit",
+    "brevitas", "caecus", "camur", "capto", "causa", "cogo", "comis",
+    "commodo", "commoveo", "consectetuer", "consequat", "conventio", "cui",
+    "damnum", "decet", "defui", "diam", "dignissim", "distineo", "dolor",
+    "dolore", "dolus", "duis", "ea", "eligo", "elit", "enim", "erat",
+    "eros", "esca", "esse", "et", "eu", "euismod", "eum", "ex", "exerci",
+    "exputo", "facilisi", "facilisis", "fere", "feugiat", "gemino",
+    "genitus", "gilvus", "gravis", "haero", "hendrerit", "hos", "huic",
+    "humo", "iaceo", "ibidem", "ideo", "ille", "illum", "immitto",
+    "importunus", "imputo", "in", "incassum", "inhibeo", "interdico",
+    "iriure", "iusto", "iustum", "jugis", "jumentum", "jus", "laoreet",
+    "lenis", "letalis", "lobortis", "loquor", "lucidus", "luctus", "ludus",
+    "luptatum", "macto", "magna", "mauris", "melior", "metuo", "meus",
+    "minim", "modo", "molior", "mos", "natu", "neo", "neque", "nibh",
+    "nimis", "nisl", "nobis", "nostrud", "nulla", "nunc", "nutus", "obruo",
+    "occuro", "odio", "olim", "oppeto", "os", "pagus", "pala", "paratus",
+    "patria", "paulatim", "pecus", "persto", "pertineo", "plaga", "pneum",
+    "populus", "praemitto", "praesent", "premo", "probo", "proprius",
+    "quadrum", "quae", "qui", "quia", "quibus", "quidem", "quidne", "quis",
+    "ratis", "refero", "refoveo", "roto", "rusticus", "saepius",
+    "sagaciter", "saluto", "scisco", "secundum", "sed", "si", "similis",
+    "singularis", "sino", "sit", "sudo", "suscipere", "suscipit", "tamen",
+    "tation", "te", "tego", "tincidunt", "torqueo", "tum", "turpis",
+    "typicus", "ulciscor", "ullamcorper", "usitas", "ut", "utinam",
+    "utrum", "uxor", "valde", "valetudo", "validus", "vel", "velit",
+    "veniam", "venio", "vereor", "vero", "verto", "vicis", "vindico",
+    "virtus", "voco", "volutpat", "vulpes", "vulputate", "wisi", "ymo",
+    "zelus");
+
+  $greeking = "";
+
+  if (!$title) {
+	  while ($words > 0) {
+	    $sentence_length = rand(3,10);
+	
+	    $greeking .= ucfirst($dictionary[array_rand($dictionary)]);
+	    for ($i = 1; $i < $sentence_length; $i++) {
+	      $greeking .= " " . $dictionary[array_rand($dictionary)];
+	    }
+	
+	    $greeking .= ". ";
+	    $words -= $sentence_length;
+	  }
+  }
+  else {
+  	// use different method for titles
+  	$title_length = $words;
+  	$array = array();
+  	for ($i = 0; $i < $words; $i++) {
+  		$array[] = $dictionary[array_rand($dictionary)];
+  	}
+  	$greeking = ucwords(implode(' ', $array));
+  }
+  return $greeking;
+}
+
+function devel_add_terms($nodes, $terms) {
+  if(count($terms) > 0){
+    foreach($nodes as $nid => $type) {
+      $rand = rand(1, 6);
+      while ($rand--) {
+      $tid = $terms[$type][@array_rand($terms[$type])];
+        if ($tid) {
+          db_query("INSERT INTO {term_node} (nid, tid) VALUES (%d, %d)", $nid, $tid);
+        }
+      }
+    }
+  }
+}
+
+function devel_get_users() {
+  $users = array();
+  $result = db_query("SELECT uid FROM {users}");
+  while($user = db_fetch_object($result)){
+    $users[] = $user->uid;
+  }
+  return $users;
+}
+
+function devel_get_nodes($nid = 0) {
+  $nodes = array();
+  $result = db_query("SELECT nid, type FROM {node} WHERE type IN ('story', 'blog', 'forum', 'page') AND comment = 2 AND nid > %d", $nid);
+  while($node = db_fetch_object($result)){
+    $nodes[$node->nid] = $node->type ;
+  }
+  return $nodes;
+}
+
+function devel_get_comments() {
+  $comments = array();
+  $result = db_query("SELECT nid, cid FROM {comments}");
+  while($comment = db_fetch_object($result)){
+    $comments[$comment->nid][] = $comment->cid ;
+  }
+  return comments;
+}
+
+function devel_get_terms() {
+  $terms = array();
+  $result = db_query("SELECT d.tid, v.vid FROM {vocabulary} v, {term_data} d WHERE v.vid = d.vid");
+  while($term = db_fetch_object($result)){
+    $result2 = db_query("SELECT n.type FROM {vocabulary_node_types} n WHERE n.vid = %d", $term->vid);
+    while ($nt = db_fetch_object($result2)) {
+      $terms[$nt->type][] = $term->tid;
+    }
+  }
+  return $terms;
+}
Index: modules/devel/devel_node_access.install
===================================================================
RCS file: modules/devel/devel_node_access.install
diff -N modules/devel/devel_node_access.install
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ modules/devel/devel_node_access.install	1 Jan 1970 00:00:00 -0000
@@ -0,0 +1,6 @@
+<?php
+
+function devel_node_access_install() {
+  // force drupal to auto-enable the block
+  _block_rehash();
+}
Index: modules/devel/README.txt
===================================================================
RCS file: modules/devel/README.txt
diff -N modules/devel/README.txt
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ modules/devel/README.txt	1 Jan 1970 00:00:00 -0000
@@ -0,0 +1,28 @@
+README.txt
+==========
+
+A module containing helper functions for Drupal developers and
+inquisitive admins. This module can print a log of
+all database queries for each page request at the bottom of each page. The
+summary includes how many times each query was executed on a page
+(shouldn't run same query multiple times), and how long each query
+ took (short is good - use cache for complex queries).
+
+Also a dpr() function is provided, which pretty prints arrays and strings. Useful during
+development.
+
+Included in this package is also: 
+- devel_node_access module which prints out the node_access records for a given node._
+- macro.module which records form submissions and can pay them back later or on another site. More
+information available at http://drupal.org/node/79900.
+
+
+AUTHOR/MAINTAINER
+======================
+-moshe weitzman
+weitzman at tejasa DOT com
+
+NOTE
+====
+The subdirectory generate/ includes some scripts that can be used to help testing
+on a Drupal site. See generate/README.txt for details.
Index: modules/devel/generate/AUTHOR
===================================================================
RCS file: modules/devel/generate/AUTHOR
diff -N modules/devel/generate/AUTHOR
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ modules/devel/generate/AUTHOR	1 Jan 1970 00:00:00 -0000
@@ -0,0 +1,1 @@
+Authors are Moshe Weitzman, Dries Buytaert, Jonathan Chaffer, and Gerhard Killesreiter.
Index: modules/devel/macro.module
===================================================================
RCS file: modules/devel/macro.module
diff -N modules/devel/macro.module
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ modules/devel/macro.module	1 Jan 1970 00:00:00 -0000
@@ -0,0 +1,214 @@
+<?php
+// $Id: macro.module,v 1.1.2.3 2006/11/21 15:32:24 weitzman Exp $
+
+/**
+ * @file
+ * Allows administrators to record form sumissions and play back the recordings.
+ */
+
+/**
+ * Implementation of hook_help().
+ */
+function macro_help($section) {
+  switch ($section) {
+    case 'admin/help#macro':
+      $output = t('Todo: Add help text.');
+    case 'admin/build/macro/export' :
+      return t('This output can be saved to the profile`s .macro file, to be automatically played back upon completed install or used on an import on another site.');
+    case 'admin/build/macro/import' :
+      return t('Insert recorded macro here to be played into your site. All referenced modules needs to be enabled.');
+    case 'admin/build/macro':
+      return t('Configuration settings for the drupal macro engine.');
+  }
+}
+
+/**
+ * Implementation of hook_menu().
+ */
+function macro_menu($may_cache) {
+  $items = array();
+
+  if ($may_cache) {
+    $items[] = array('path' => 'admin/build/macro',
+      'title' => t('Macro engine'),
+      'description' => t('Configure the Drupal macro engine. Export recorded macros or import previously recorded macros.'),
+      'callback' => 'drupal_get_form',
+      'callback arguments' => array('macro_admin_settings'),
+      'access' => user_access('administer macro settings'),
+      'type' => MENU_NORMAL_ITEM,
+    );
+    $items[] = array(
+      'title' => t('Export'),
+      'path' => 'admin/build/macro/export', 
+      'access' => true, 
+      'callback' => 'drupal_get_form',
+      'callback arguments' => array(t('macro_export_macro')),
+      'access' => user_access('macro access'),
+      'type' => MENU_LOCAL_TASK,
+    );
+    $items[] = array(
+      'title' => t('Import'),
+      'path' => 'admin/build/macro/import', 
+      'access' => true, 
+      'callback' => 'drupal_get_form',
+      'callback arguments' => array(t('macro_import_macro')),
+      'access' => user_access('macro access'),
+      'type' => MENU_LOCAL_TASK,
+    );
+    $items[] = array('path' => 'admin/build/macro/settings',
+      'title' => t('Configure'),
+      'description' => t('Configure the Drupal macro engine. Export recorded macros or import previously recorded macros.'),
+      'callback' => 'drupal_get_form',
+      'callback arguments' => array('macro_admin_settings'),
+      'access' => user_access('administer macro settings'),
+      'type' => MENU_DEFAULT_LOCAL_TASK,
+    );
+
+  }
+
+  return $items;
+}
+
+
+/**
+ * Implementation of hook_perm().
+ */
+function macro_perm() {
+  return array('macro access');
+}
+
+/**
+ * Implementation of hook_form_alter().
+ * Optionally record all form submissions, for later use in building distributions
+ */
+function macro_form_alter($form_id, &$form) {
+  if ($form_id != 'macro_import_macro' && variable_get('macro_enabled', FALSE)) {
+    $form['#submit']['macro_record_macro'] = array($form);
+  }
+  if (variable_get('macro_delete', FALSE)) {
+    variable_set('macro_submissions', array());
+    variable_set('macro_delete', FALSE);
+  }
+}
+
+/**
+ * A form submission handler, that stores the form submissions into the variables table
+ */
+function macro_record_macro($form_id, $edit, $form) {
+  $subs = variable_get('macro_submissions', array());
+  $subs[] = array('form_id' => $form_id, 'parameters' => $form['#parameters'], 'values' => $edit);
+  variable_set('macro_submissions', $subs);
+}
+
+
+/**
+ * A form callback that displays the macro exported.
+ *
+ * The output of this callback should be saved to the profiles/$profile/macros.inc file, to be 
+ * automatically played back upon completed install.
+ * @return a textarea containing the recorded macros
+ */
+function macro_export_macro() {
+  $form['code'] = array(
+    '#type' => 'textarea',
+    '#title' => 'macros exported',
+    '#default_value' => macro_get_macro(),
+    '#rows' => 20,
+  );
+  return $form;	
+
+}
+
+/**
+ * The output of this callback should be saved to the profiles/$profile/macros.inc file, to be 
+ * automatically played back upon completed install.
+ * @return a code representation of the recorded macro.
+ */
+function macro_get_macro() {  
+  $subs = variable_get('macro_submissions', array());
+  foreach ($subs as $key => $form) {
+    $string .= "\$macro[$key]['form_id'] = " . var_export($form['form_id'], TRUE) . ";\n";
+    $string .= "\$macro[$key]['values']  = " . var_export((array) $form['values'], TRUE) . ";\n";
+
+    // the form parameters are being used here. 
+    array_shift($form['parameters']);
+    $string .= "\$macro[$key]['parameters']  = " . var_export(serialize($form['parameters']), TRUE) . ";\n\n";
+    
+  }
+
+  return $string;
+}
+
+/**
+ * A form callback that displays the macro import form.
+ *
+ * @return a form for importing a previously recorded macro
+ */
+function macro_import_macro() {
+  $form['macro'] = array(
+    '#type' => 'textarea',
+    '#title' => 'macro to import',
+    '#rows' => 20,
+  );
+  $form['submit'] = array(
+    '#type' => 'submit',
+    '#value' => t('play macro'),
+  );
+  return $form; 
+}
+
+/**
+ * Implementation of macro_import_macro hook_submit function.
+ * 
+ * Plays back the submitted macro.
+ */
+function macro_import_macro_submit($form_id, $form_values) {
+  include_once './includes/install.inc';
+  eval($form_values['macro']);
+  drupal_execute_macro($macro);
+}
+
+
+/**
+ * Menu callback for the macro settings form.
+ */
+function macro_admin_settings() {
+
+  $form['settings_general'] = array(
+    '#type' => 'fieldset',
+    '#title' => t('Macro settings'),
+    '#collapsible' => TRUE,
+  );
+  $form['settings_general']['macro_enabled'] = array(
+    '#type' => 'checkbox',
+    '#title' => t('Enable macro recording'),
+    '#default_value' => variable_get('macro_enabled', FALSE),
+    '#description' => t('Set whether the macro engine will record form submissions.'),
+  );
+  $form['settings_general']['macro_delete'] = array(
+    '#type' => 'checkbox',
+    '#title' => t('Delete recorded macro'),
+    '#default_value' => variable_get('macro_delete', FALSE),
+    '#description' => t('Set whether to clear previously recorded macro.'),
+  );
+  
+  return system_settings_form($form);
+}
+
+/**
++ * Attempts to programmatically submit all the forms that have been specified in the $macros collection.
++ */
+function drupal_execute_macro($macro) {
+  foreach ($macro as $key => $data) {
+    // print_r($data);
+    $param = unserialize($data['parameters']);
+    $args = array($data['form_id'], $data['values']);
+    $args = array_merge($args, $param);
+    call_user_func_array('drupal_execute', $args);
+    if (form_get_errors()) {
+       drupal_set_message(t("An error has occured with macro #%macro_number , form_id %form_id. Please check the errors displayed for more details.", array('%macro_number' => $key, '%form_id' => $data['form_id'])));
+    }
+  }
+}
+ 
+ 
Index: modules/devel/devel.install
===================================================================
RCS file: modules/devel/devel.install
diff -N modules/devel/devel.install
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ modules/devel/devel.install	1 Jan 1970 00:00:00 -0000
@@ -0,0 +1,113 @@
+<?php
+// $Id: devel.install,v 1.8.4.3 2007/04/01 02:01:36 weitzman Exp $
+/**
+ * Implementation of hook_install()
+ */
+function devel_install() {
+  // New module weights in core: put devel as the very last in the chain.
+  db_query("UPDATE {system} SET weight = 88 WHERE name = 'devel'");
+
+  switch ($GLOBALS['db_type']) {
+    case 'mysqli':
+    case 'mysql':
+      $sql = "CREATE TABLE {devel_queries} (
+        qid int(10) NOT NULL auto_increment,
+        function varchar(255) NOT NULL default '',
+        query text NOT NULL,
+        hash varchar(255) NOT NULL default '',
+        PRIMARY KEY (`hash`),
+        KEY qid (qid)
+        ) /*!40100 DEFAULT CHARACTER SET utf8 */;";
+      db_query($sql);
+
+      $sql = "CREATE TABLE {devel_times} (
+        tid int(10) NOT NULL auto_increment,
+        qid int(10) NOT NULL default 0,
+        time float default NULL,
+        PRIMARY KEY (tid),
+        KEY qid (qid)
+      ) /*!40100 DEFAULT CHARACTER SET utf8 */;";
+      db_query($sql);
+      break;
+    case 'mssql':
+      $sql = "CREATE TABLE {devel_queries} (
+        qid INT IDENTITY(1,1),
+        \"function\" varchar(255) NOT NULL default '',
+        query text NOT NULL,
+        hash varchar(255) NOT NULL default '',
+        PRIMARY KEY (qid));";
+      db_query($sql);
+
+      $sql = "CREATE TABLE {devel_times} (
+        tid INT IDENTITY(1,1),
+        qid INT NOT NULL default 0,
+        time FLOAT default NULL,
+        PRIMARY KEY (tid)
+      );";
+      db_query($sql);
+      
+  }
+}
+
+/**
+ * Do update 1 again as the hook_install() was missing and new
+ * installations are not having the weight set.
+ */
+function devel_update_2() {
+  // New module weights in core: put devel as the very last in the chain.
+  $ret[] = update_sql("UPDATE {system} SET weight = 10 WHERE name = 'devel'");
+  return $ret;
+}
+
+function devel_update_3() {
+  switch ($GLOBALS['db_type']) {
+    case 'mysqli':
+    case 'mysql':
+      $sql = "CREATE TABLE {devel_queries} (
+        qid int(10) NOT NULL auto_increment,
+        query varchar(255) NOT NULL default '',
+        hash varchar(255) NOT NULL default '',
+        PRIMARY KEY (`hash`),
+        KEY qid (qid)
+        ) /*!40100 DEFAULT CHARACTER SET utf8 */;";
+      $ret[] = update_sql($sql);
+
+      $sql = "CREATE TABLE {devel_times} (
+        tid int(10) NOT NULL auto_increment,
+        qid int(10) NOT NULL default 0,
+        time float default NULL,
+        PRIMARY KEY (tid),
+        KEY qid (qid)
+      ) /*!40100 DEFAULT CHARACTER SET utf8 */;";
+      $ret[] = update_sql($sql);
+      return $ret;
+  }
+}
+
+function devel_update_4() {
+  $ret = array();
+  switch ($GLOBALS['db_type']) {
+    case 'mysqli':
+    case 'mysql':
+      $ret[] = update_sql("ALTER TABLE {devel_queries} ADD `function` varchar(255) NOT NULL default ''");
+  }
+  return $ret;
+}
+
+function devel_update_5() {
+  $ret = array();
+  switch ($GLOBALS['db_type']) {
+    case 'mysqli':
+    case 'mysql':
+      $ret[] = update_sql("ALTER TABLE {devel_queries} CHANGE query query text NOT NULL");
+  }
+  return $ret;
+}
+
+/**
+ * Implementation of hook_enable().
+ */
+function devel_enable() {
+  // Enable the blocks automatically at install.
+  _block_rehash();
+}
Index: modules/devel/generate/generate-og2list-mail.php
===================================================================
RCS file: modules/devel/generate/generate-og2list-mail.php
diff -N modules/devel/generate/generate-og2list-mail.php
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ modules/devel/generate/generate-og2list-mail.php	1 Jan 1970 00:00:00 -0000
@@ -0,0 +1,47 @@
+<?php
+
+// $Id: generate-og2list-mail.php,v 1.4 2006/06/27 21:51:29 killes Exp $:
+
+/**
+ * This script creates bogus mails from existing users to existing groups.
+ * Requires Drupal 4.7, OG2list and OG module.
+ *
+ * If n is the total number of members of a group, this script will
+ * generate n*(n-1) mails. Use with caution.
+ *
+ * Sponsored by CivicSpace Labs
+ */
+require_once './includes/bootstrap.inc';
+drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);
+
+function gom_get_groups() {
+  $result = db_query("SELECT g.nid, g.recipient, u.uid, u.name, u.mail FROM {og2list_groups} g INNER JOIN {og_uid} o ON o.nid = g.nid INNER JOIN {users} u ON o.uid = u.uid WHERE u.status >= 1");
+  $groups = array();
+  while ($group = db_fetch_array($result)) {
+    $groups[$group['nid']]['recipient'] = $group['recipient'];
+    $groups[$group['nid']]['users'][] = array(
+      'uid' => $group['uid'],
+      'mail' => $group['mail'],
+      'name' => $group['name'],
+      );
+  }
+
+  return $groups;
+}
+
+function gom_create_content($groups) {
+  foreach ($groups as $nid => $group) {
+    foreach ($group['users'] as $user) {
+      $msg_id = '<'. time() .'.'. mt_rand() .'@'. strtolower(variable_get('og2list_domain', $_SERVER['SERVER_NAME'])) .'>';
+
+      $subject = 'Test mail from '. $user['name'] .' to '. $group['recipient'];
+      db_query("INSERT INTO {og2list_incoming_content} (from_address,from_name,subject,msgid,content_type,body) VALUES ('%s', '%s', '%s', '%s', '%s', '%s')", $user['mail'], $user['name'], $subject, $msg_id, 'text/plain', "totally irrelevant message body, sent at ". format_date(time(), 'custom', t('Y/m/d - G:i')));
+      db_query("INSERT INTO {og2list_incoming_groups} SET mid=(SELECT mid FROM {og2list_incoming_content} WHERE msgid='%s'), oid=(SELECT nid FROM {og2list_groups} WHERE recipient='%s')", $msg_id, $group['recipient']);
+    }
+  }
+}
+
+
+$groups = gom_get_groups();
+
+gom_create_content($groups);
Index: includes/database.mssql.inc
===================================================================
RCS file: includes/database.mssql.inc
diff -N includes/database.mssql.inc
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ includes/database.mssql.inc	1 Jan 1970 00:00:00 -0000
@@ -0,0 +1,742 @@
+<?php
+// $Id: $
+
+/**
+ * @file
+ * Database interface code for Microsoft SQL database servers.
+ * 
+ * $connection = mssql_connect('\\\\.\pipe\MSSQL$SQLEXPRESS\sql\query', 'sa', 'pw');
+ */
+
+/**
+ * @ingroup database
+ * @{
+ */
+
+
+/**
+ * Report database status.
+ */
+function db_status_report($phase) {
+  if(arg(3) == 'mssql_reset_map') {
+    _db_mssql_refresh_column_map();
+    _db_mssql_set_column_map();
+    drupal_set_message(t('The mapping has been refactored.'));
+    drupal_goto('admin/logs/status');
+  }
+  $t = get_t();
+
+  $version = db_version();
+
+  $form['mssql'] = array(
+    'title' => $t('MS SQL database'),
+    'value' => (($phase == 'runtime') ? l($version, 'admin/logs/status/mssql') : $version) . ' | ' . l(t('Reset column map'), 'admin/logs/status/mssql_reset_map'),
+  );
+
+  /*if (version_compare($version, DRUPAL_MINIMUM_MSSQL) < 0) {
+    $form['mysql']['severity'] = REQUIREMENT_ERROR;
+    $form['mysql']['description'] = $t('Your MS SQL Server is too old. Drupal requires at least MS SQL %version.', array('%version' => DRUPAL_MINIMUM_MSSQL));
+  }*/
+
+  return $form;
+}
+
+/**
+ * Returns the version of the database server currently in use.
+ *
+ * @return Database server version
+ */
+function db_version() {
+  $version = db_result(db_query('SELECT @@version;'));
+  list($version) = explode('-', $version);
+  return $version;
+}
+
+/**
+ * Initialize a database connection.
+ *
+ * Note that you can change the mysql_connect() call to mysql_pconnect() if you
+ * want to use persistent connections. This is not recommended on shared hosts,
+ * and might require additional database/webserver tuning. It can increase
+ * performance, however, when the overhead to connect to your database is high
+ * (e.g. your database and web server live on different machines).
+ */
+function db_connect($url) {
+  // Check if MS SQL support is present in PHP
+  if (!function_exists('mssql_connect')) {
+    drupal_maintenance_theme();
+    drupal_set_title('PHP MS SQL support not enabled');
+    print theme('maintenance_page', '<p>We were unable to use the MS SQL database because the MS SQL extension for PHP is not installed. Check your <code>PHP.ini</code> to see how you can enable it.</p>
+<p>For more help, see the <a href="http://drupal.org/node/258">Installation and upgrading handbook</a>. If you are unsure what these terms mean you should probably contact your hosting provider.</p>');
+    exit;
+  }
+
+  $url = parse_url($url);
+
+  // Decode url-encoded information in the db connection string
+  $url['user'] = urldecode($url['user']);
+  // Test if database url has a password.
+  if(isset($url['pass'])) {
+    $url['pass'] = urldecode($url['pass']);
+  }
+  else {
+    $url['pass'] = '';
+  }
+  $url['host'] = stripslashes(urldecode($url['host']));
+  $url['path'] = urldecode($url['path']);
+
+  // Allow for non-standard MS SQL port.
+  if (isset($url['port'])) {
+     $url['host'] = $url['host'] .','. $url['port'];
+  }
+
+  // Allow large texts for MS SQL.
+  ini_set("mssql.textlimit", 16000000);
+  ini_set("mssql.textsize", 16000000);
+
+  // TODO: Put back @.
+  $connection = mssql_connect($url['host'], $url['user'], $url['pass']);
+  if (!$connection) {
+    // Redirect to installer if using default DB credentials
+    if ($url['user'] == 'username' && $url['pass'] == 'password') {
+      include_once 'includes/install.inc';
+      install_goto('install.php');
+    }
+
+    // Show error screen otherwise
+    drupal_maintenance_theme();
+    drupal_set_header('HTTP/1.1 503 Service Unavailable');
+    drupal_set_title('Unable to connect to database server');
+    print theme('maintenance_page', '<p>If you still have to install Drupal, proceed to the <a href="'. base_path() .'install.php">installation page</a>.</p>
+<p>If you have already finished installed Drupal, this either means that the username and password information in your <code>settings.php</code> file is incorrect or that we can\'t connect to the MS SQL database server. This could mean your hosting provider\'s database server is down.</p>
+<p>The MS SQL error was: '. theme('placeholder', mssql_get_last_message()) .'.</p>
+<p>Currently, the username is '. theme('placeholder', $url['user']) .' and the database server is '. theme('placeholder', $url['host']) .'.</p>
+<ul>
+  <li>Are you sure you have the correct username and password?</li>
+  <li>Are you sure that you have typed the correct hostname?</li>
+  <li>Are you sure that the database server is running?</li>
+</ul>
+<p>For more help, see the <a href="http://drupal.org/node/258">Installation and upgrading handbook</a>. If you are unsure what these terms mean you should probably contact your hosting provider.</p>');
+    exit;
+  }
+
+  if (!mssql_select_db(substr($url['path'], 1))) {
+    drupal_maintenance_theme();
+    drupal_set_title('Unable to select database');
+    print theme('maintenance_page', '<p>We were able to connect to the MS SQL database server (which means your username and password are okay) but not able to select the database.</p>
+<p>The MS SQL error was: '. theme('placeholder', mssql_get_last_message()) .'.</p>
+<p>Currently, the database is '. theme('placeholder', substr($url['path'], 1)) .'. The username is '. theme('placeholder', $url['user']) .' and the database server is '. theme('placeholder', $url['host']) .'.</p>
+<ul>
+  <li>Are you sure you have the correct database name?</li>
+  <li>Are you sure the database exists?</li>
+  <li>Are you sure the username has permission to access the database?</li>
+</ul>
+<p>For more help, see the <a href="http://drupal.org/node/258">Installation and upgrading handbook</a>. If you are unsure what these terms mean you should probably contact your hosting provider.</p>');
+    exit;
+  }
+
+  // TODO: Document this. Not sure what this does.
+  // Maximum returnable text size
+  mssql_query('SET TEXTSIZE 524287;');
+
+  return $connection;
+}
+
+/**
+ * Helper function for db_query().
+ */
+function _db_query($query, $debug = 0) {
+  global $active_db, $queries, $user, $base_root;
+  global $temp_tables;
+  static $last_error_msg, $setting_map;
+  if(!isset($setting_map)) {
+    $setting_map = FALSE;
+  }
+  
+  // First prefix temp tables with # that have been created during this session
+  $query = str_replace($temp_tables['base_name'], $temp_tables['temp_name'], $query);
+  $query = str_replace("##", "#", $query); // Somtimes items get sent throug here twice
+
+  if (variable_get('dev_query', 0)) {
+    list($usec, $sec) = explode(' ', microtime());
+    $timer = (float)$usec + (float)$sec;
+  }
+
+  // LENGTH is called DATALENGTH in MS SQL.
+  // TODO: Preg search instead of strpos.
+  /*if(strpos($query,"LENGTH")){
+    $pattern = '/(.+)LENGTH(.+)/i';
+    $query = preg_replace($pattern, '${1}DATALENGTH$2', $query); 
+  }*/
+  
+  // No LIMIT in MS SQL. We use SELECT TOP n ... FROM ...
+  // Can't do TOP because it is NOT a range.
+  // TODO: Preg search instead of strpos.
+  if(strpos($query,'LIMIT')){
+    $pattern = '/(.+)LIMIT (\d+), (\d+)/i';
+    $query_new = preg_replace($pattern, '${1}', $query);
+    $limit = preg_replace($pattern, '$3', $query);
+    $query = str_replace('SELECT', 'SELECT TOP '.$limit, $query_new);
+    unset($pattern, $query_new, $limit);
+  }
+  // TODO: Not sure what this is. 
+  // TODO: Preg search instead of strpos so we don't replace valid instances of 'relevance'.
+  if(strpos($query,'relevance')){
+    $query = str_replace('relevance', '_relevance', $query_new);
+  }
+  // Keywords switch
+  $query = str_replace("LENGTH", "DATALENGTH", $query);
+  
+  /**
+   * Conversions
+   * we need to convert if there is a function 
+   * being placed on a text column or it's being used 
+   * in a comparison. For now, we'll do a 'blanket' 
+   * conversion.
+   * 
+   * For now, let see if we can get core to clean up its code.
+   * Commenting this out.
+   *
+  if($setting_map == FALSE) {
+    $setting_map = TRUE;
+    _db_mssql_set_column_map();
+    $setting_map = FALSE;
+    global $mssql_column_map;
+
+    if(is_array($mssql_column_map)) {
+      foreach($mssql_column_map as $replace_column) {
+        $query = str_replace(' ' . trim($replace_column) . ' ', "CONVERT(VARCHAR, $replace_column)", $query);
+        #echo "Looking for $replace_column in $query <br />";
+      }
+    }
+  }
+  */
+  
+  /**
+   * // TODO Fix this big issue
+   * NOTE: Sending the query again is currently in here
+   * becuase for some reason, on certain pages, no result is
+   * returned from SQL-Server even though the qurey is fine.
+   * To prove this, try putting this in the error log after
+   * querying the result. You'll see that 'SELECT * FROM system WHERE type = 'theme'
+   * returns nothing, even though every query before it is fine:
+   * error_log("\n" . $tquery . " and result: " . $result);
+   * 
+   */
+  $result = @mssql_query($query, $active_db);
+
+  
+  if(!$result && $active_db && function_exists("arg")) {
+    trigger_error(check_plain(mssql_get_last_message() ."\nquery: ". $query), E_USER_WARNING);
+    @watchdog('mssql', mssql_get_last_message($active_db) . "<br />SQL:<br />" . $query, WATCHDOG_ERROR);
+  }
+  
+  if (variable_get('dev_query', 0)) {
+    $bt = debug_backtrace();
+    $query = $bt[2]['function'] . "\n" . $query;
+    list($usec, $sec) = explode(' ', microtime());
+    $stop = (float)$usec + (float)$sec;
+    $diff = $stop - $timer;
+    $queries[] = array($query, $diff);
+  }
+
+  if ($debug) {
+    print '<p>query: '. $query .'<br />error:'. mssql_get_last_message() .'</p>';
+  }
+  unset($query);
+  return $result;
+}
+
+/**
+ * Given a table name, this tries to locate the primay key.
+ * If no primary key is found, it returns the first column
+ * with an index. If no index is found, it returns FALSE.
+ * 
+ * TODO: Check the cardinatliy, perhaps you could return
+ * the index with the least cardinality for speed.
+ * Filter by schema!!!
+ */
+function _db_mssql_locate_table_index($table) {
+  # Get the table_id
+  $index_column = FALSE;
+  $table = trim($table);
+  $table_id = db_result(db_query("SELECT object_id FROM sys.tables WHERE type_desc = 'USER_TABLE' AND name = '%s'", $table));
+  if(!$table_id) {
+    return $index_column;
+  }
+  # Look at the index_columns sys table
+  $index_id = db_result(db_query("SELECT TOP 1 column_id FROM sys.index_columns WHERE object_id = '%d'", $table_id));
+  if(!$index_id) {
+    return $index_column;
+  }
+  # Grab the column name
+  $index_column = db_result(db_query("SELECT name FROM sys.columns WHERE object_id = %d AND column_id = %d;", $table_id, $index_id));
+  
+  return $index_column;
+}
+
+/**
+ * This function refreshs the column mapping.
+ * Now we could just make the array at the begginig of each page call,
+ * but I really don't like the idea of hitting a system 
+ * table that hard and that often.
+ * 
+ * This table needs to be updated only during schema changes anyway, so 
+ * that means:
+ * 1. During a module enable and/or disable
+ * 2. CCK content creating because a new table is created for 
+ * the new content type.
+ * 
+ * TODO: Make this dynamic so a user can change 
+ * what the system_type_id to map to "text" is
+ * Note: 
+ * system_type_id maps:
+ * 35 = text
+ */
+function _db_mssql_refresh_column_map() {
+  db_start_trans();
+  db_query("DELETE FROM {mssql_table_column_map};");
+  $system_type_id = 35; // type is 35 for text
+  $tables = db_query("SELECT name, object_id FROM sys.tables WHERE type_desc = 'USER_TABLE'");
+  while($row = db_fetch_object($tables)) {
+    $crs = db_query("SELECT name, system_type_id FROM sys.columns WHERE object_id = '%s' AND system_type_id = %d", $row->object_id, $system_type_id);
+    $cr = db_fetch_object($crs);
+    if($cr->system_type_id == $system_type_id) {
+      db_query("INSERT INTO {mssql_table_column_map}(table_name, column_name, column_type) VALUES('%s', '%s', %d)", $row->name, $cr->name, $cr->system_type_id);
+    }
+  }
+  
+  db_commit_trans();
+  return;
+}
+
+
+function _db_mssql_set_column_map() {
+  global $mssql_column_map;
+  $mssql_column_map = array();
+  $rs = db_query("SELECT * FROM {mssql_table_column_map}");
+  $map = array();
+  while($row = db_fetch_object($rs)) {
+    $map[$row->column_name] = $row->column_name;
+  }
+  $mssql_column_map = $map;
+  return;
+}
+
+/**
+ * @author Earnest Berry III <earnest.berry@gmail.com>
+ * @abstract
+ * Please note that in the db_fetch_object and 
+ * the db_fetch_array functions, there is a trimming 
+ * loop to counter act PHP bugs:
+ * http://bugs.php.net/bug.php?id=26996
+ * http://bugs.php.net/bug.php?id=26996
+ * This breaks things like menu.inc (_menu_translate) that 
+ * use the actual value of the variable for TRUE/FALSE, meaning
+ * that ' ' (phantom space) returns true when menu.inc 
+ * expects '', which would be false. Either the bug in PHP 
+ * needs to be fixed, or the logic fixed up in menu.inc so that 
+ * it checks for datatypes (e.g. trim($item->val) != '') 
+ * and doesn't use a side effect for 
+ * evaluation.
+ */
+
+
+/**
+ * Fetch one result row from the previous query as an object.
+ *
+ * @param $result
+ *   A database query result resource, as returned from db_query().
+ * @return
+ *   An object representing the next row of the result. The attributes of this
+ *   object are the table fields selected by the query.
+ */
+function db_fetch_object($result) {
+  if ($result) {
+    if($tobj =  mssql_fetch_object($result)) {
+      foreach($tobj as $k => $v) {
+        $tobj->$k = trim($v);
+      }
+    }
+    return $tobj;
+  }
+}
+
+/**
+ * Fetch one result row from the previous query as an array.
+ *
+ * @param $result
+ *   A database query result resource, as returned from db_query().
+ * @return
+ *   An associative array representing the next row of the result. The keys of
+ *   this object are the names of the table fields selected by the query, and
+ *   the values are the field values for this result row.
+ */
+function db_fetch_array($result) {
+  if ($result) {
+    $tarray =  mssql_fetch_array($result, MSSQL_ASSOC);
+    foreach($tarray as $k => $v) {
+      $tarray[$k] = trim($v);
+    }
+    return $tarray;
+  }
+}
+
+/**
+ * Determine how many result rows were found by the preceding query.
+ *
+ * @param $result
+ *   A database query result resource, as returned from db_query().
+ * @return
+ *   The number of result rows.
+ */
+function db_num_rows($result) {
+  if ($result) {
+    return mssql_num_rows($result);
+  }
+}
+
+/**
+ * Return an individual result field from the previous query.
+ *
+ * Only use this function if exactly one field is being selected; otherwise,
+ * use db_fetch_object() or db_fetch_array().
+ *
+ * @param $result
+ *   A database query result resource, as returned from db_query().
+ * @param $row
+ *   The index of the row whose result is needed.
+ * @return
+ *   The resulting field.
+ */
+function db_result($result, $row = 0) {
+  if ($result && mssql_num_rows($result) > $row) {
+    mssql_data_seek($result, $row);
+    $row_result = mssql_fetch_row($result);
+    return $row_result[0];
+  }
+}
+
+/**
+ * Determine whether the previous query caused an error.
+ */
+function db_error() {
+  return mssql_get_last_message();
+}
+
+/**
+ * Return a new unique ID in the given sequence.
+ *
+ * For compatibility reasons, Drupal does not use auto-numbered fields in its
+ * database tables. Instead, this function is used to return a new unique ID
+ * of the type requested. If necessary, a new sequence with the given name
+ * will be created.
+ */
+function db_next_id($name) {
+  $name = db_prefix_tables($name);
+  db_lock_table('sequences');
+  $id = db_result(db_query("SELECT id FROM {sequences} WHERE name = '%s'", $name)) + 1;
+  if (db_num_rows(db_query("SELECT id FROM {sequences} WHERE name = '%s'", $name)) == 0) {
+    db_query("INSERT INTO {sequences} VALUES ('%s', %d)", $name, $id);
+  }
+  else {
+    db_query("UPDATE {sequences} SET id = %d WHERE name = '%s'", $id, $name);
+  }
+  db_unlock_tables();
+
+  return $id;
+}
+
+/**
+ * Determine the number of rows changed by the preceding query.
+ */
+function db_affected_rows() {
+  global $active_db;
+  $result = mssql_query('SELECT @@ROWCOUNT', $active_db);
+  list($affected) = mssql_fetch_row($result);
+  return $affected;
+}
+
+/**
+ * Runs a limited-range query in the active database.
+ *
+ * Use this as a substitute for db_query() when a subset of the query is to be
+ * returned.
+ * User-supplied arguments to the query should be passed in as separate parameters
+ * so that they can be properly escaped to avoid SQL injection attacks.
+ *
+ * Note that if you need to know how many results were returned, you should do
+ * a SELECT COUNT(*) on the temporary table afterwards. db_num_rows() and
+ * db_affected_rows() do not give consistent result across different database
+ * types in this case.
+ *
+ * @param $query
+ *   A string containing an SQL query.
+ * @param ...
+ *   A variable number of arguments which are substituted into the query
+ *   using printf() syntax. The query arguments can be enclosed in one
+ *   array instead.
+ *   Valid %-modifiers are: %s, %d, %f, %b (binary data, do not enclose
+ *   in '') and %%.
+ *
+ *   NOTE: using this syntax will cast NULL and FALSE values to decimal 0,
+ *   and TRUE values to decimal 1.
+ *
+ * @param $from
+ *   The first result row to return.
+ * @param $count
+ *   The maximum number of result rows to return.
+ * @return
+ *   A database query result resource, or FALSE if the query was not executed
+ *   correctly.
+ */
+function db_query_range($query) {
+  $args = func_get_args();
+  
+  $count = array_pop($args);
+  $from = array_pop($args);
+  $to = $from + $count;
+  array_shift($args);
+  
+  if(is_array($args[0])) {
+    $args = array_shift($args);
+  }
+  
+  // TODO Implement
+  // $col = _db_mssql_locate_table_index($table);
+  
+  if($from == 0 && FALSE) {
+    $query = str_replace("SELECT ", "SELECT TOP($to) ", $query);
+  }
+  else {
+    $matches = array();
+  
+    #$re = '/SELECT\s*([a-zA-Z0-9.*, \'\n_={}()]+)\s*FROM\s*([a-zA-Z.*, =\'_{}]+)\s*';
+    $re = '/SELECT\s*([a-zA-Z0-9.*, \'\n_={}()]+)\s*FROM\s*([a-zA-Z.*, =\'_{}]+)\s*';
+    $loc = 2;
+    if(preg_match('/WHERE/', $query)) {
+      $re .= 'WHERE\s*([%_\'a-zA-Z0-9.*, !=><\(\)()]+)\s*';
+      $lwhere = ++$loc;
+    }
+    if(preg_match('/GROUP BY/', $query)) {
+      $re .= 'GROUP BY\s*([a-zA-Z.*, ]+)\s*';
+      $lgroup_by = ++$loc;
+    }
+    if(preg_match('/ORDER BY/', $query)) {
+      $re .= 'ORDER BY\s*([a-zA-Z.*, ]+)';
+      $lorder_by = ++$loc;
+    }
+    $re .= '/';
+    preg_match($re, $query, $matches);
+    $select = $matches[1];
+    $qfrom = $matches[2];
+    $where = $group_by = $order_by = '';
+    if(isset($lwhere)) {
+      $where = 'WHERE ' . $matches[$lwhere];
+    }
+    if(isset($lgroup_by)) {
+      $group_by = 'GROUP BY ' . $matches[$lgroup_by];
+    }
+    if(isset($lorder_by)) {
+      $order_by = 'ORDER BY ' . $matches[$lorder_by];
+      $order_by = 'ORDER BY @@SPID';
+    }
+    else {
+      $order_by = 'ORDER BY @@SPID';
+    }
+    if(strstr($query, 'DISTINCT')) {
+      $select = str_replace("DISTINCT", "", $select);
+      $query = "SELECT * FROM (
+                  SELECT DISTINCT 
+                    ROW_NUMBER() OVER($order_by) AS rownumber,
+                    $select
+                    FROM $qfrom
+                    $where
+                ) as drupal_range_query
+                WHERE rownumber BETWEEN $from AND $to;";
+    }
+    else {
+      $query = "SELECT * FROM (
+                  SELECT 
+                    ROW_NUMBER() OVER($order_by) AS rownumber,
+                    $select
+                    FROM $qfrom
+                    $where
+                ) as drupal_range_query
+                WHERE rownumber BETWEEN $from AND $to;";
+    }
+  }
+  _db_query_callback($args, TRUE);
+  $query = db_prefix_tables($query);
+  $query = preg_replace_callback(DB_QUERY_REGEXP, '_db_query_callback', $query);
+  
+  return _db_query($query);
+}
+
+/**
+ * Runs a SELECT query and stores its results in a temporary table.
+ *
+ * Use this as a substitute for db_query() when the results need to stored
+ * in a temporary table. Temporary tables exist for the duration of the page
+ * request.
+ * User-supplied arguments to the query should be passed in as separate parameters
+ * so that they can be properly escaped to avoid SQL injection attacks.
+ *
+ * Note that if you need to know how many results were returned, you should do
+ * a SELECT COUNT(*) on the temporary table afterwards. db_num_rows() and
+ * db_affected_rows() do not give consistent result across different database
+ * types in this case.
+ *
+ * @param $query
+ *   A string containing a normal SELECT SQL query.
+ * @param ...
+ *   A variable number of arguments which are substituted into the query
+ *   using printf() syntax. The query arguments can be enclosed in one
+ *   array instead.
+ *   Valid %-modifiers are: %s, %d, %f, %b (binary data, do not enclose
+ *   in '') and %%.
+ *
+ *   NOTE: using this syntax will cast NULL and FALSE values to decimal 0,
+ *   and TRUE values to decimal 1.
+ *
+ * @param $table
+ *   The name of the temporary table to select into. This name will not be
+ *   prefixed as there is no risk of collision.
+ * @return
+ *   A database query result resource, or FALSE if the query was not executed
+ *   correctly.
+ */
+function db_query_temporary($query) {
+  # A global array of temporary tables
+  global $temp_tables;
+  $args = func_get_args();
+  $tablename = array_pop($args);
+  array_shift($args);
+
+  $split_query = explode('FROM', db_prefix_tables($query));
+  $from = $split_query[1];
+  $fields = $split_query[0];
+  //$query = preg_replace('/^SELECT/i', 'CREATE TEMPORARY TABLE '. $tablename .' SELECT', db_prefix_tables($query));
+  $query = "$fields INTO #$tablename FROM $from";
+  $temp_tables['base_name'] = $tablename;
+  $temp_tables['temp_name'] = "#$tablename";
+  if (isset($args[0]) and is_array($args[0])) { // 'All arguments in one array' syntax
+    $args = $args[0];
+  }
+  _db_query_callback($args, TRUE);
+  $query = preg_replace_callback(DB_QUERY_REGEXP, '_db_query_callback', $query);
+  
+  return _db_query($query);
+}
+
+/**
+ * Returns a properly formatted Binary Large OBject value.
+ *
+ * @param $data
+ *   Data to encode.
+ * @return
+ *  Encoded data.
+ */
+function db_encode_blob($data) {
+  global $active_db;
+  return "'" . base64_encode($data) . "'";
+}
+
+/**
+ * Returns text from a Binary Large Object value.
+ *
+ * @param $data
+ *   Data to decode.
+ * @return
+ *  Decoded data.
+ */
+function db_decode_blob($data) {
+  return base64_decode($data);
+}
+
+/**
+ * Prepare user input for use in a database query, preventing SQL injection attacks.
+ */
+function db_escape_string($text) {
+  // TODO: Use proper function here for db escaping.
+  // Above 'TODO' solved by below.
+  // Souvent22
+  // Taken from php.net 
+  // vollmer at ampache dot org
+  /* De MagicQuotes */
+  // TODO: escape keywords using quotes
+  
+  $text = str_replace("'","''",$text);
+  $text = str_replace("\0","[NULL]",$text);
+
+  return $text;
+}
+
+
+/**
+ * Start a transcation
+ */
+function db_start_trans() {
+  global $db_in_trans;
+  db_query('BEGIN TRANSACTION');
+  $db_in_trans = TRUE;
+}
+
+/**
+ * Commit a transaction
+ */
+function db_commit_trans() {
+  db_query('COMMIT');
+  $db_in_trans = FALSE;
+}
+
+/**
+ * Rollback a transaction
+ */
+function db_rollback_trans() {
+  db_query('ROLLBACK');
+  $db_in_trans = FALSE;
+}
+
+/**
+ * Lock a table.
+ */
+function db_lock_table($table = "") {
+  db_query('SET TRANSACTION ISOLATION LEVEL SERIALIZABLE');
+  db_query('BEGIN TRANSACTION');
+}
+
+/**
+ * Unlock all locked tables.
+ */
+function db_unlock_tables() {
+  db_query('COMMIT');
+}
+
+/**
+ * Check if a table exists.
+ */
+function db_table_exists($table) {
+  return db_num_rows(db_query("SHOW TABLES LIKE '{" . db_escape_table($table) . "}'"));
+}
+
+/**
+ * Wraps the given table.field entry with a DISTINCT(). The wrapper is added to
+ * the SELECT list entry of the given query and the resulting query is returned.
+ * This function only applies the wrapper if a DISTINCT doesn't already exist in
+ * the query.
+ *
+ * @param $table Table containing the field to set as DISTINCT
+ * @param $field Field to set as DISTINCT
+ * @param $query Query to apply the wrapper to
+ * @return SQL query with the DISTINCT wrapper surrounding the given table.field.
+ */
+function db_distinct_field($table, $field, $query) {
+  $field_to_select = 'DISTINCT('. $table .'.'. $field .')';
+  // (?<!text) is a negative look-behind (no need to rewrite queries that already use DISTINCT).
+  return preg_replace('/(SELECT.*)('. $table .'\.)?(?<!DISTINCT\()(?<!DISTINCT\('. $table .'\.)'. $field .'(.*FROM )/AUsi', '\1'. $field_to_select .'\3', $query);
+}
+
+/**
+ * @} End of "ingroup database".
+ */
Index: modules/devel/po/fr.po
===================================================================
RCS file: modules/devel/po/fr.po
diff -N modules/devel/po/fr.po
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ modules/devel/po/fr.po	1 Jan 1970 00:00:00 -0000
@@ -0,0 +1,83 @@
+# LANGUAGE translation of PROJECT
+# Copyright YEAR NAME <EMAIL@ADDRESS>
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: V 1.00\n"
+"POT-Creation-Date: 2005-07-25 17:54+0200\n"
+"PO-Revision-Date: 2006-03-24 23:44+0100\n"
+"Last-Translator: Marand <fgm@osinet.fr>\n"
+"Language-Team: MATTEO <m.ferrari@tiscali.it>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+#: d:\Drupal-contributions-CVS\modules\devel\devel.module:30
+msgid "empty cache"
+msgstr "vidange du cache"
+
+#: d:\Drupal-contributions-CVS\modules\devel\devel.module:33
+msgid "variable viewer"
+msgstr "variables"
+
+#: d:\Drupal-contributions-CVS\modules\devel\devel.module:48
+msgid " Page execution time was %time ms."
+msgstr "Durée d'exécution de la page: %time ms."
+
+#: d:\Drupal-contributions-CVS\modules\devel\devel.module:64
+msgid "<p>The user is being redirected to %destination.</p>"
+msgstr "<p>L'utilisateur est renvoyé à %destination.</p>"
+
+#: d:\Drupal-contributions-CVS\modules\devel\devel.module:191
+msgid "Development helper functions"
+msgstr "Fonctions d'aide aux développeurs"
+
+#: d:\Drupal-contributions-CVS\modules\devel\devel.module:199
+msgid "Display page timer"
+msgstr "Afficher le chronomètre de page"
+
+#: d:\Drupal-contributions-CVS\modules\devel\devel.module:199;200;202
+msgid "Disabled"
+msgstr "Désactivé"
+
+#: d:\Drupal-contributions-CVS\modules\devel\devel.module:199;200;202
+msgid "Enabled"
+msgstr "Activé"
+
+#: d:\Drupal-contributions-CVS\modules\devel\devel.module:199
+msgid "Display page execution time in the query log box."
+msgstr "Afficher la durée d'exécution de la page dans la boîte listant les requêtes."
+
+#: d:\Drupal-contributions-CVS\modules\devel\devel.module:200
+msgid "Display query log"
+msgstr "Afficher la liste des requêtes."
+
+#: d:\Drupal-contributions-CVS\modules\devel\devel.module:200
+msgid "Display a log of the database queries needed to generate the current page, the and the execution time for each. Also, a queries which are repeated during a single page view are summed in the # column, and printed in red since they are candidates for caching."
+msgstr "Affiche un journal des requêtes nécessaires pour la production de la page courante, et leur durée d'exécution. En outre, les requêtes qui viennent à être répétées lors de l'affiche d'une page sont totalisées dans la colonne #, et affichées en rouge, pour attirer l'attention sur le fait qu'il peut être judicieux de les mettres en mémoire."
+
+#: d:\Drupal-contributions-CVS\modules\devel\devel.module:201
+msgid "Query execution threshhold"
+msgstr "Seuil d'alerte pour l'exécution des requêtes"
+
+#: d:\Drupal-contributions-CVS\modules\devel\devel.module:201
+msgid "Enter an integer in milliseconds. Any query which takes longer than this many milliseconds will be highlighted in the query log. This indicates a possibliy inefficient query, or a candidate for caching."
+msgstr "Saisir une valeur entière en millisecondes. Toute requête plus longue que cette durée sera mise en évidence dans la liste des requêtes. Ceci indique que la requête est peut-être inefficace ou est susceptible de bénéficier du mécanisme d'antémémoire."
+
+#: d:\Drupal-contributions-CVS\modules\devel\devel.module:202
+msgid "Display redirection page"
+msgstr "Afficher la page de renvoi."
+
+#: d:\Drupal-contributions-CVS\modules\devel\devel.module:202
+msgid "When a module executes drupal_goto(), the query log and other developer information is lost. Enabling this setting presents an intermediate page to developers so that the log can be examined before continuing to the destination page."
+msgstr "Lorsqu'un module invoque <code>drupal_goto()</code> pour causer un renvoi vers une autre page, la liste des requêtes et les autres informations utiles au développeur sont perdues. Activer ce paramètre a pour effet de présenter lors des renvois une page intermédiaire permettant au développeur d'examiner les données avant de continuer sur la page de renvoi."
+
+#: d:\Drupal-contributions-CVS\modules\devel\devel.module:210
+msgid "access devel information"
+msgstr "accéder aux informations pour développeurs"
+
+#: d:\Drupal-contributions-CVS\modules\devel\devel.module:0
+msgid "devel"
+msgstr "devel"
+
Index: modules/devel/devel_node_access.info
===================================================================
RCS file: modules/devel/devel_node_access.info
diff -N modules/devel/devel_node_access.info
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ modules/devel/devel_node_access.info	1 Jan 1970 00:00:00 -0000
@@ -0,0 +1,8 @@
+; $Id: devel_node_access.info,v 1.1.4.3 2006/12/27 21:29:38 weitzman Exp $
+name = Devel Node Access
+description = Developer block and page illustrating relevant node_access records.
+package = Development
+; Information added by drupal.org packaging script on 2007-04-01
+version = "5.x-1.x-dev"
+project = "devel"
+
