? .svn
? solr_multi_instance.diff
? SolrPhpClient/.svn
? SolrPhpClient/Apache/.svn
? SolrPhpClient/Apache/Solr/.svn
? SolrPhpClient/Apache/Solr/Service/.svn
? SolrPhpClient/phpdocs/.svn
? SolrPhpClient/phpdocs/Apache/.svn
? SolrPhpClient/phpdocs/Apache/Solr/.svn
? SolrPhpClient/phpdocs/media/.svn
? contrib/.svn
? contrib/apachesolr_image/.svn
? tests/.svn
Index: apachesolr.module
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/apachesolr/apachesolr.module,v
retrieving revision 1.1.2.12
diff -u -r1.1.2.12 apachesolr.module
--- apachesolr.module	20 Apr 2008 14:14:45 -0000	1.1.2.12
+++ apachesolr.module	13 Jun 2008 08:17:09 -0000
@@ -6,55 +6,274 @@
     $items[] = array(
       'path' => 'admin/settings/apachesolr',
       'title' => t('Apache Solr search'),
-      'description' => t('Administer Apache Solr.'),
+      'description' => t('Administer Apache Solr.'),      
+      'callback' => 'drupal_get_form',      
+      'callback arguments' => 'apachesolr_settings',
+      'access' => user_access('administer site configuration'),
+      );
+      
+   $items[] = array(
+      'path' => 'admin/settings/apachesolr/0' ,
+      'title' => t('Apache Solr search'),
+      'description' => t('Administer Apache Solr'),
+      'type' => MENU_DEFAULT_LOCAL_TASK,
       'callback' => 'drupal_get_form',
       'callback arguments' => 'apachesolr_settings',
       'access' => user_access('administer site configuration'),
       );
+      
+    $items[] = array(
+      'path' => 'admin/settings/apachesolr/add',
+      'title' => t('Add new configuration'),
+      'description' => t('Administer Apache Solr'),
+      'type' => MENU_LOCAL_TASK,
+      'weight' => 19,
+      'callback' => 'drupal_get_form',
+      'callback arguments' => array('apachesolr_settings','add'),
+      'access' => user_access('administer site configuration'),
+      );
+      
+    $items[] = array(
+      'path' => 'admin/settings/apachesolr/delete',
+      'title' => t('Delete Solr Instance'),
+      'description' => t('Administer Apache Solr'),
+      'type' => MENU_CALLBACK,
+      'weight' => 19,
+      'callback' => 'drupal_get_form',
+      'callback arguments' => array('apachesolr_delete_confirm'),
+      'access' => user_access('administer site configuration'),
+      );
+      
     $items[] = array(
       'path' => 'admin/settings/apachesolr/index',
       'title' => t('Apache Solr search index'),
       'callback' => 'apachesolr_index_page',
+      'type' => MENU_LOCAL_TASK,
+      'weight' => 20,      
       'access' => user_access('administer site configuration'),
     );
+    
+  } else {
+    $all_instances = variable_get('apachesolr_instances',array());    
+      $weight = 1;
+    foreach ($all_instances as $key => $instance) {
+      $weight++;
+      $items[] = array(
+      'path' => 'admin/settings/apachesolr/' . $key,
+      'type' => MENU_LOCAL_TASK,
+      'title' => t($all_instances[$key]['name']),
+      'description' => t('Administer Apache Solr.'),
+      'callback' => 'drupal_get_form',
+      'weight' => $weight,
+      'callback arguments' => array('apachesolr_settings',$key),
+      'access' => user_access('administer site configuration'),
+      );
+    }
   }
   return $items;
 }
 
-function apachesolr_settings() {
+function apachesolr_settings($instance_key = 0) {
   $form = array();
-
-  $form['apachesolr_host'] = array(
+  $form['#tree'] = true;
+  
+  $form['instance_key'] = array (
+      '#type' => 'hidden',
+      '#value' => (string)$instance_key      
+  );
+
+  $all_instances = variable_get('apachesolr_instances',array());  
+  $defaults = $all_instances[$instance_key];
+  
+  if (!$defaults) {
+    $defaults = array();
+  }
+  
+  $conf_set['apachesolr_host'] = array(
     '#type' => 'textfield',
     '#title' => t('Solr host name'),
-    '#default_value' => variable_get('apachesolr_host', 'localhost'),
+    '#default_value' => 'localhost',
     '#description' => t('Host name of your Solr server, e.g. <code>localhost</code> or <code>example.com</code>.'),
     );
-  $form['apachesolr_port'] = array(
+  $conf_set['apachesolr_port'] = array(
     '#type' => 'textfield',
     '#title' => t('Solr port'),
-    '#default_value' => variable_get('apachesolr_port', '8983'),
+    '#default_value' => '8983',
     '#description' => t('Port on which the Solr server listens. Tomcat is 8080 by default.'),
     );
-  $form['apachesolr_path'] = array(
+  $conf_set['apachesolr_path'] = array(
     '#type' => 'textfield',
     '#title' => t('Solr path'),
-    '#default_value' => variable_get('apachesolr_path', '/solr'),
+    '#default_value' => '/solr',
     '#description' => t('Path that identifies the Solr request handler to be used. Leave this as /solr for now.'),
     );
-  return system_settings_form($form);
+    
+    $form['name'] = array (
+        '#type' => 'textfield',
+        '#title' => "Instance Name",
+        '#required' => true,
+        '#weight' => -7,
+      );
+      
+    if (!$instance_key) {
+      $form['name']['#type'] = 'value';
+      $form['name']['#value'] = 'Default';
+    }
+  
+  $form['same_server'] = array (
+    '#type' => 'checkbox',
+    '#title' => t('Use the same server for indexing and searching?'),
+    '#weight' => -4,
+    '#default_value' => true,
+    '#attributes' => array('onChange' => 'console.log($(this).val());ifs = $(".index_fieldset"); if ($(this).is(":checked")) { ifs.hide(500) } else { ifs.show(500) }'),
+    '#description' => t('Uncheck this box if you want to use a different server for indexing than for searching (most users can ignore this)'),
+  );
+    
+  $form['search'] = array('#type' => 'fieldset', '#collapsible' => true) + $conf_set;
+  
+  $form['search']['#title'] = "Search Server";
+  $form['search']['#weight'] = -5;
+  
+  if (count($defaults) != 0 && array_diff($defaults['search'],$defaults['index'])) {    
+    $form['same_server']['#default_value'] = false;
+    $form['index']['#attributes']['style'] = 'display:block';
+  } else {    
+    $hider = <<<EOD
+    
+    $(document).ready( function() {    
+      var ifs = $(".index_fieldset");
+      ifs.hide();
+    });
+    
+EOD;
+    
+    drupal_add_js($hider,'inline','header');
+  }
+  
+  $form['index'] = array('#type' => 'fieldset', '#collapsible' => true) + $conf_set;    
+  $form['index']['#title'] = "Indexing Server";
+  $form['index']['#attributes'] = array('class' => 'index_fieldset');  
+  $form['index']['#weight'] = -3;
+  
+  foreach ($defaults as $type => $default_settings) {
+    //Type is search or index    
+    if (is_array($default_settings)) {
+      foreach ($default_settings as $field_name => $setting) {
+        if ($form[$type]) {
+          $form[$type][$field_name]['#default_value'] = $setting;
+        }
+      } 
+    } else {
+        $form[$type]['#default_value'] = $default_settings;
+    }
+  }
+  
+  //If the index is any 
+  
+  
+  $form = system_settings_form($form);
+  $form['buttons']['reset']['#value'] = t('Delete this instance');
+    
+  return $form;
+}
+
+function apachesolr_settings_submit($form_id,$form_values) {
+  
+  
+  if ($form_values['op'] == $form_values['buttons']['reset']) {
+    drupal_goto('admin/settings/apachesolr/delete/' . $form_values['instance_key']);
+  }
+  
+  if ($form_values['same_server'] == true) {
+    $form_values['index'] = $form_values['search'];
+  }
+  
+  unset($form_values['op']);
+  unset($form_values['buttons']);
+  unset($form_values['form_token']);
+  unset($form_values['form_id']);
+  unset($form_values['same_server']);
+  
+  $instance_key = $form_values['instance_key'];
+  unset($form_values['instance_key']);
+  
+  $apachesolr_conf = variable_get('apachesolr_instances',array());
+    
+  if ($instance_key == 'add') {
+    $instance_key = count($apachesolr_conf) ? count($apachesolr_conf) : 0;
+    //we are adding a new one, or saving for the firs ttime
+  }
+  
+  $apachesolr_conf[$instance_key] = $form_values;
+  variable_set('apachesolr_instances',$apachesolr_conf);
+  drupal_goto('admin/settings/apachesolr/' . $instance_key);  
+}
+
+/**
+ * Menu callback -- ask for confirmation of instance deletion
+ */
+function apachesolr_delete_confirm($instance_key) {
+ $instances = variable_get('apachesolr_instances',array());
+ $form['instance_key'] = array('#type' => 'value', '#value' => $instance_key);
+ if (!isset($instances[$instance_key])) {
+   drupal_set_message('This Instance does not exist','error');
+   return;
+ }
+ return confirm_form($form,
+   t('Are you sure you want to delete %title?', array('%title' => $instances[$instance_key]['name'])),
+   isset($_GET['destination']) ? $_GET['destination'] : 'admin/settings/apachesolr',
+   t('This action cannot be undone.'),
+   t('Delete'), t('Cancel'));
+}
+
+
+/**
+ * Wrapper around variable get to make getting variables for different instances easier
+ *
+ * @param string $variable_name : can also user . syntax to traverse an array
+ * @param mixed default : For compatibility
+ * @param int $instance_key : Optional, if client is using multiple instances 
+ */
+function apachesolr_variable_get($variable_name, $default, $instance_key = 0) {
+  $instances = variable_get('apachesolr_instances',array());
+  $vars = $instances[$instance_key];  
+  $_parts = explode('.',$variable_name);
+  if (count($_parts) > 1) {
+    $target = $vars;
+    foreach ($_parts as $part) {
+      if (is_array($target)) {
+        $target = $target[$part];
+      }
+    }
+    return $target;
+  } else {
+    return $vars[$variable_name];
+  }
+}
+
+/**
+ * Execute node deletion
+ */
+function apachesolr_delete_confirm_submit($form_id, $form_values) {
+  if ($form_values['confirm']) {
+    $instances = variable_get('apachesolr_instances',array());
+    unset($instances[$form_values['instance_key']]);
+    variable_set('apachesolr_instances',$instances);
+  }
+  
+  return 'admin/settings/apachesolr';
 }
 
 function apachesolr_requirements($phase) {
   // Ensure translations don't break at install time
   $t = get_t();
   if ($phase == 'runtime') {
-    $host = variable_get('apachesolr_host', 'localhost');
-    $port = variable_get('apachesolr_port', 8983);
-    $path = variable_get('apachesolr_path', '/solr');
+    $host = apachesolr_variable_get('search.apachesolr_host', 'localhost');
+    $port = apachesolr_variable_get('search.apachesolr_port', 8983);
+    $path = apachesolr_variable_get('search.apachesolr_path', '/solr');    
     $ping = FALSE;
     try {
-      $solr =& apachesolr_get_solr($host, $port, $path);
+      $solr =& apachesolr_get_solr_defaults();
       $ping = $solr->ping();
       // If there is no $solr object, there is no server available, so don't continue.
       if (!$ping) {
@@ -82,7 +301,7 @@
 function apachesolr_index_page() {
   //TODO: Should we be generating the dynamic blocks based on what is indexed?
   // Or should we be using things like node_field.type to get this list?
-  $response = drupal_http_request(apachesolr_base_url(). "/admin/luke?numTerms=0");
+  $response = drupal_http_request(apachesolr_base_url('search'). "/admin/luke?numTerms=0");
   if ($response->code == '200') {
     $xml_response = simplexml_load_string($response->data);
     $fields = $xml_response->xpath("//lst[@name='fields']/lst");
@@ -153,9 +372,10 @@
 
   static function update_index($namespace) {
     $solr = FALSE;
-    try {
+    try {            
       // Get the $solr object
-      $solr =& apachesolr_get_solr(variable_get('apachesolr_host', 'localhost'), variable_get('apachesolr_port', 8983), variable_get('apachesolr_path', '/solr'));
+      $solr =& apachesolr_get_solr_defaults('index');
+      dpr($solr);
       // If there is no $solr object, there is no server available, so don't continue.
       if (!$solr->ping()) {
         throw new Exception(t('No Solr instance available during indexing'));
@@ -281,7 +501,7 @@
   switch ($op) {
     case 'delete':
       try {
-        $solr =& apachesolr_get_solr(variable_get('apachesolr_host', 'localhost'), variable_get('apachesolr_port', 8983), variable_get('apachesolr_path', '/solr'));
+        $solr =& apachesolr_get_solr_defaults('index');
         $solr->deleteById($node->nid);
         $solr->commit();
       }
@@ -574,7 +794,7 @@
  */
 function &apachesolr_get_solr($host = 'localhost', $port = 8983, $path = '/solr') {
   static $solr_cache;
-
+  
   if (empty($solr_cache[$host][$port][$path])) {
     $include_path = get_include_path();
     set_include_path ('./'. drupal_get_path('module', 'apachesolr') .'/SolrPhpClient/');
@@ -585,6 +805,10 @@
   return $solr_cache[$host][$port][$path];
 }
 
+function apachesolr_get_solr_defaults($type = 'search',$instance = 0) {  
+  return apachesolr_get_solr(apachesolr_variable_get($type . '.apachesolr_host', 'localhost'), apachesolr_variable_get($type . '.apachesolr_port', 8983), apachesolr_variable_get($type . '.apachesolr_path', '/solr')); 
+}
+
 /**
  * It is important to hold on to the Solr response object for the duration of the
  * page request so that we can use it for things like building facet blocks.
@@ -620,8 +844,15 @@
   return $_queries[$keys];
 }
 
-function apachesolr_base_url() {
-  return "http://". variable_get('apachesolr_host', 'localhost'). ':'. variable_get('apachesolr_port', '8983'). variable_get('apachesolr_path', '/solr');
+function apachesolr_base_url($type = 'search') {
+  switch ($type) {
+    case 'index':
+      return "http://". apachesolr_variable_get('index.apachesolr_host', 'localhost'). ':'. apachesolr_variable_get('index.apachesolr_port', '8983'). apachesolr_variable_get('index.apachesolr_path', '/solr');
+      break;
+    case 'search':
+      return "http://". apachesolr_variable_get('search.apachesolr_host', 'localhost'). ':'. apachesolr_variable_get('search.apachesolr_port', '8983'). apachesolr_variable_get('search.apachesolr_path', '/solr');
+      break;
+  }
 }
 
 /**
@@ -749,4 +980,4 @@
 function theme_apachesolr_breadcrumb_tid($tid) {
   $term = taxonomy_get_term($tid);
   return $term->name;
-}
+}
\ No newline at end of file
Index: apachesolr_search.module
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/apachesolr/apachesolr_search.module,v
retrieving revision 1.1.2.6
diff -u -r1.1.2.6 apachesolr_search.module
--- apachesolr_search.module	20 Apr 2008 14:14:45 -0000	1.1.2.6
+++ apachesolr_search.module	13 Jun 2008 08:17:09 -0000
@@ -26,7 +26,7 @@
     case 'search':
       global $pager_total;
       // This is the object that does the communication with the solr server.
-      $solr =& apachesolr_get_solr(variable_get('apachesolr_host', 'localhost'), variable_get('apachesolr_port', 8983), variable_get('apachesolr_path', '/solr'));
+      $solr =& apachesolr_get_solr_defaults('search');
       // This is the object that knows about the query coming from the user.
       $query =& apachesolr_drupal_query($keys);
       
