]> git.mxchange.org Git - quix0rs-gnu-social.git/commitdiff
sphinx: fallback if no connection
authormillette <millette@controlyourself.ca>
Sun, 23 Nov 2008 20:16:16 +0000 (15:16 -0500)
committermillette <millette@controlyourself.ca>
Sun, 23 Nov 2008 20:16:16 +0000 (15:16 -0500)
darcs-hash:20081123201616-099f7-54ac0134e38e145b99a81336ae0b51a8ecd560a8.gz

classes/Memcached_DataObject.php
classes/SearchEngines.php [deleted file]
lib/search_engines.php [new file with mode: 0644]

index e1d58dd70e97b1b20227729524c8721b5c04abc8..674de9bc5bcc6d280206633ecc8c3fb21435d77d 100644 (file)
@@ -171,15 +171,22 @@ class Memcached_DataObject extends DB_DataObject
        }
 
     function getSearchEngine($table) {
-        require_once INSTALLDIR.'/classes/SearchEngines.php';
+        require_once INSTALLDIR.'/lib/search_engines.php';
         static $search_engine;
         if (!isset($search_engine)) {
+                $connected = false;
                 if (common_config('sphinx', 'enabled')) {
                     $search_engine = new SphinxSearch($this, $table);
-                } elseif ('mysql' === common_config('db', 'type')) {
-                    $search_engine = new MySQLSearch($this, $table);
-                } else {
-                    $search_engine = new PGSearch($this, $table);
+                    $connected = $search_engine->is_connected();
+                }
+
+                // unable to connect to sphinx' search daemon
+                if (!$connected) {
+                    if ('mysql' === common_config('db', 'type')) {
+                        $search_engine = new MySQLSearch($this, $table);
+                    } else {
+                        $search_engine = new PGSearch($this, $table);
+                    }
                 }
         }
         return $search_engine;
diff --git a/classes/SearchEngines.php b/classes/SearchEngines.php
deleted file mode 100644 (file)
index 96fd7da..0000000
+++ /dev/null
@@ -1,104 +0,0 @@
-<?php
-/*
- * Laconica - a distributed open-source microblogging tool
- * Copyright (C) 2008, Controlez-Vous, Inc.
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-if (!defined('LACONICA')) { exit(1); }
-
-class SearchEngine {
-    protected $target;
-    protected $table;
-
-    function __construct($target, $table) {
-        $this->target = $target;
-        $this->table = $table;
-    }
-
-    function query($q) {
-    }
-
-    function limit($offset, $count, $rss = false) {
-        return $this->target->limit($offset, $count);
-    }
-
-    function set_sort_mode($mode) {
-        if ('chron' === $mode)
-            return $this->target->orderBy('created desc');
-    }
-}
-
-class SphinxSearch extends SearchEngine {
-    private $sphinx;
-
-    function __construct($target, $table) {
-        parent::__construct($target, $table);
-        $this->sphinx = new SphinxClient;
-        $this->sphinx->setServer(common_config('sphinx', 'server'), common_config('sphinx', 'port'));
-    }
-
-    function limit($offset, $count, $rss = false) {
-        //FIXME without LARGEST_POSSIBLE, the most recent results aren't returned
-        //      this probably has a large impact on performance
-        $LARGEST_POSSIBLE = 1e6; 
-
-        if ($rss) {
-            $this->sphinx->setLimits($offset, $count, $count, $LARGEST_POSSIBLE);
-        }
-        else {
-            // return at most 50 pages of results
-            $this->sphinx->setLimits($offset, $count, 50 * ($count - 1), $LARGEST_POSSIBLE);
-        }
-
-        return $this->target->limit(0, $count);
-    }
-
-    function query($q) {
-        $result = $this->sphinx->query($q, $this->table);
-        if (!isset($result['matches'])) return false;
-        $id_set = join(', ', array_keys($result['matches']));
-        $this->target->whereAdd("id in ($id_set)");
-        return true;
-     }
-
-    function set_sort_mode($mode) {
-        if ('chron' === $mode) {
-            $this->sphinx->SetSortMode(SPH_SORT_ATTR_DESC, 'created_ts');
-            return $this->target->orderBy('created desc');
-        }
-    }
-}
-
-class MySQLSearch extends SearchEngine {
-    function query($q) {
-        if ('identica_people' === $this->table)
-            return $this->target->whereAdd('MATCH(nickname, fullname, location, bio, homepage) ' .
-                                                  'against (\''.addslashes($q).'\')');
-        if ('identica_notices' === $this->table)
-            return $this->target->whereAdd('MATCH(content) ' .
-                                                  'against (\''.addslashes($q).'\')');
-    }
-}
-
-class PGSearch extends SearchEngine {
-    function query($q) {
-        if ('identica_people' === $this->table)
-            return $this->target->whereAdd('textsearch @@ plainto_tsquery(\''.addslashes($q).'\')');
-        if ('identica_notices' === $this->table)
-            return $this->target->whereAdd('to_tsvector(\'english\', content) @@ plainto_tsquery(\''.addslashes($q).'\')');
-    }
-}
-
diff --git a/lib/search_engines.php b/lib/search_engines.php
new file mode 100644 (file)
index 0000000..7fcc1ff
--- /dev/null
@@ -0,0 +1,116 @@
+<?php
+/*
+ * Laconica - a distributed open-source microblogging tool
+ * Copyright (C) 2008, Controlez-Vous, Inc.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+if (!defined('LACONICA')) { exit(1); }
+
+class SearchEngine {
+    protected $target;
+    protected $table;
+
+    function __construct($target, $table) {
+        $this->target = $target;
+        $this->table = $table;
+    }
+
+    function query($q) {
+    }
+
+    function limit($offset, $count, $rss = false) {
+        return $this->target->limit($offset, $count);
+    }
+
+    function set_sort_mode($mode) {
+        if ('chron' === $mode)
+            return $this->target->orderBy('created desc');
+    }
+}
+
+class SphinxSearch extends SearchEngine {
+    private $sphinx;
+    private $connected;
+
+    function __construct($target, $table) {
+        $fp = @fsockopen(common_config('sphinx', 'server'), common_config('sphinx', 'port'));
+        if (!$fp) {
+            $this->connected = false;
+            return;
+        }
+        fclose($fp);
+        parent::__construct($target, $table);
+        $this->sphinx = new SphinxClient;
+        $this->sphinx->setServer(common_config('sphinx', 'server'), common_config('sphinx', 'port'));
+        $this->connected = true;
+    }
+
+    function is_connected() {
+        return $this->connected;
+    }
+
+    function limit($offset, $count, $rss = false) {
+        //FIXME without LARGEST_POSSIBLE, the most recent results aren't returned
+        //      this probably has a large impact on performance
+        $LARGEST_POSSIBLE = 1e6; 
+
+        if ($rss) {
+            $this->sphinx->setLimits($offset, $count, $count, $LARGEST_POSSIBLE);
+        }
+        else {
+            // return at most 50 pages of results
+            $this->sphinx->setLimits($offset, $count, 50 * ($count - 1), $LARGEST_POSSIBLE);
+        }
+
+        return $this->target->limit(0, $count);
+    }
+
+    function query($q) {
+        $result = $this->sphinx->query($q, $this->table);
+        if (!isset($result['matches'])) return false;
+        $id_set = join(', ', array_keys($result['matches']));
+        $this->target->whereAdd("id in ($id_set)");
+        return true;
+     }
+
+    function set_sort_mode($mode) {
+        if ('chron' === $mode) {
+            $this->sphinx->SetSortMode(SPH_SORT_ATTR_DESC, 'created_ts');
+            return $this->target->orderBy('created desc');
+        }
+    }
+}
+
+class MySQLSearch extends SearchEngine {
+    function query($q) {
+        if ('identica_people' === $this->table)
+            return $this->target->whereAdd('MATCH(nickname, fullname, location, bio, homepage) ' .
+                                                  'against (\''.addslashes($q).'\')');
+        if ('identica_notices' === $this->table)
+            return $this->target->whereAdd('MATCH(content) ' .
+                                                  'against (\''.addslashes($q).'\')');
+    }
+}
+
+class PGSearch extends SearchEngine {
+    function query($q) {
+        if ('identica_people' === $this->table)
+            return $this->target->whereAdd('textsearch @@ plainto_tsquery(\''.addslashes($q).'\')');
+        if ('identica_notices' === $this->table)
+            return $this->target->whereAdd('to_tsvector(\'english\', content) @@ plainto_tsquery(\''.addslashes($q).'\')');
+    }
+}
+