From 977e4c75ba37cf2361b26f157c19df76647eb998 Mon Sep 17 00:00:00 2001 From: kerphi Date: Wed, 6 Dec 2006 15:35:25 +0000 Subject: [PATCH] =?UTF-8?q?[en]=20Add=20a=20mysql=20container.=20See=20dem?= =?UTF-8?q?o55=20for=20an=20example=20(thanks=20to=20HenkBB)=20[3h30]=20[f?= =?UTF-8?q?r]=20Ajout=20d'un=20conteneur=20mysql.=20Voyez=20la=20demo55=20?= =?UTF-8?q?pour=20un=20exemple=20(merci=20=C3=A0=20HenkBB)=20[3h30]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: https://phpfreechat.svn.sourceforge.net/svnroot/phpfreechat/trunk@888 2772adf2-ac07-0410-9d30-e29d8120292e --- demo/demo55_mysql_container.php | 41 +++++ demo/index.php | 2 +- src/containers/mysql.class.php | 274 ++++++++++++++++++++++++++++++++ testcase/container_generic.php | 21 ++- testcase/container_mysql.php | 41 +++++ 5 files changed, 367 insertions(+), 12 deletions(-) create mode 100644 demo/demo55_mysql_container.php create mode 100644 src/containers/mysql.class.php create mode 100644 testcase/container_mysql.php diff --git a/demo/demo55_mysql_container.php b/demo/demo55_mysql_container.php new file mode 100644 index 00000000..b3cbe6d0 --- /dev/null +++ b/demo/demo55_mysql_container.php @@ -0,0 +1,41 @@ + + + + + + + phpFreeChat demo + printJavascript(); ?> + printStyle(); ?> + + + + printChat(); ?> + +The source code"; + $filename = __FILE__; + echo "

".$filename."

"; + echo "
";
+  $content = file_get_contents($filename);
+  echo htmlentities($content);
+  echo "
"; +?> + + + \ No newline at end of file diff --git a/demo/index.php b/demo/index.php index a4bb1a03..ce038e38 100644 --- a/demo/index.php +++ b/demo/index.php @@ -71,10 +71,10 @@
  • demo31 - demo which show how to get the connected users list (whoisonline script)
  • demo32 - demo which show how to get the last posted messages (chat script)
  • demo32 - demo which show how to get the last posted messages (showlastmsg script)
  • -
  • demo35 - demo which show how to use the shared memory container (not yet working)
  • demo43 - demo which show how to change the nicknames automatic colors
  • demo50 - demo which shows how to use user metadata : add avatar (images) to each connected users
  • +
  • demo55 - demo which show how to use the mysql container
  • diff --git a/src/containers/mysql.class.php b/src/containers/mysql.class.php new file mode 100644 index 00000000..220112ef --- /dev/null +++ b/src/containers/mysql.class.php @@ -0,0 +1,274 @@ + + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the + * Free Software Foundation, 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301 USA + */ + +require_once dirname(__FILE__)."/../pfccontainer.class.php"; + +/** + * pfcContainer_Mysql is a concret container which store data into mysql + * + * Because of the new storage functions (setMeta, getMeta, rmMeta) + * everything can be stored in just one single table. + * Using type "HEAP" or "MEMORY" mysql loads this table into memory making it very fast + * There is no routine to create the table if it does not exists so you have to create it by hand + * Replace the database login info at the top of pfcContainer_mysql class with your own + * You also need some config lines in your chat index file: + * $params["container_type"] = "mysql"; + * $params["container_cfg_mysql_host"] = "localhost"; + * $params["container_cfg_mysql_port"] = 3306; + * $params["container_cfg_mysql_database"] = "phpfreechat"; + * $params["container_cfg_mysql_table"] = "phpfreechat"; + * $params["container_cfg_mysql_username"] = "root"; + * $params["container_cfg_mysql_password"] = ""; + * + * @author Stephane Gully + * @author HenkBB + */ +class pfcContainer_Mysql extends pfcContainer +{ + var $_db = null; + var $_sql_create_table = " + CREATE TABLE IF NOT EXISTS `%table%` ( + `server` varchar(256) NOT NULL default '', + `group` varchar(256) NOT NULL default '', + `subgroup` varchar(256) NOT NULL default '', + `leaf` varchar(256) NOT NULL default '', + `leafvalue` varchar(1024) NOT NULL, + `timestamp` int(11) NOT NULL default 0, + PRIMARY KEY (`server`,`group`,`subgroup`,`leaf`) +) ENGINE=MEMORY;"; + + function pfcContainer_Mysql(&$config) + { + pfcContainer::pfcContainer($config); + } + + function getDefaultConfig() + { + $c =& $this->c; + $cfg = pfcContainer::getDefaultConfig(); + $cfg["mysql_host"] = 'localhost'; + $cfg["mysql_port"] = 3306; + $cfg["mysql_database"] = 'phpfreechat'; + $cfg["mysql_table"] = 'phpfreechat'; + $cfg["mysql_username"] = 'root'; + $cfg["mysql_password"] = ''; + return $cfg; + } + + function init() + { + $errors = pfcContainer::init(); + $c =& $this->c; + + // connect to the db + $db = $this->_connect(); + if ($db === FALSE) + { + $errors[] = _pfc("Mysql container: connect error"); + return $errors; + } + + // create the db if it doesn't exists + $db_exists = false; + $db_list = mysql_list_dbs($db); + while (!$db_exists && $row = mysql_fetch_object($db_list)) + $db_exists = ($c->container_cfg_mysql_database == $row->Database); + if (!$db_exists) + { + $query = 'CREATE DATABASE '.$c->container_cfg_mysql_database; + $result = mysql_query($query, $db); + if ($result === FALSE) + { + $errors[] = _pfc("Mysql container: create database error '%s'",mysql_error($db)); + return $errors; + } + mysql_select_db($c->container_cfg_mysql_database, $db); + } + + // create the table if it doesn't exists + $query = str_replace('%table%',$c->container_cfg_mysql_table,$this->_sql_create_table); + $result = mysql_query($query, $db); + if ($result === FALSE) + { + $errors[] = _pfc("Mysql container: create table error '%s'",mysql_error($db)); + return $errors; + } + return $errors; + } + + function _connect() + { + if (!$this->_db) + { + $c =& $this->c; + $this->_db = mysql_pconnect($c->container_cfg_mysql_host.':'.$c->container_cfg_mysql_port, + $c->container_cfg_mysql_username, + $c->container_cfg_mysql_password); + mysql_select_db($c->container_cfg_mysql_database, $this->_db); + } + return $this->_db; + } + + function setMeta($group, $subgroup, $leaf, $leafvalue = NULL) + { + $c =& $this->c; + + if ($c->debug) + file_put_contents("/tmp/debug.txt", "\nsetMeta(".$group.",".$subgroup.",".$leaf.",".$leafvalue.")", FILE_APPEND); + + $server = $c->serverid; + $db = $this->_connect(); + + if ($leafvalue == NULL){$leafvalue="";}; + + $sql_select = "SELECT * FROM ".$c->container_cfg_mysql_table." WHERE `server`='$server' AND `group`='$group' AND `subgroup`='$subgroup' AND `leaf`='$leaf'"; + $sql_insert="REPLACE INTO ".$c->container_cfg_mysql_table." (`server`, `group`, `subgroup`, `leaf`, `leafvalue`, `timestamp`) VALUES('$server', '$group', '$subgroup', '$leaf', '".addslashes($leafvalue)."', '".time()."')"; + $sql_update="UPDATE ".$c->container_cfg_mysql_table." SET `leafvalue`='".addslashes($leafvalue)."', `timestamp`='".time()."' WHERE `server`='$server' AND `group`='$group' AND `subgroup`='$subgroup' AND `leaf`='$leaf'"; + + $res = mysql_query($sql_select, $db); + if( !(mysql_num_rows($res)>0) ) + { + if ($c->debug) + file_put_contents("/tmp/debug.txt", "\nsetSQL(".$sql_insert.")", FILE_APPEND); + + mysql_query($sql_insert, $db); + return 0; // value created + } + else + { + if ($sql_update != "") + { + if ($c->debug) + file_put_contents("/tmp/debug.txt", "\nsetSQL(".$sql_update.")", FILE_APPEND); + + mysql_query($sql_update, $db); + } + return 1; // value overwritten + } + } + + + function getMeta($group, $subgroup = null, $leaf = null, $withleafvalue = false) + { + $c =& $this->c; + if ($c->debug) + file_put_contents("/tmp/debug.txt", "\ngetMeta(".$group.",".$subgroup.",".$leaf.",".$withleafvalue.")", FILE_APPEND); + + $ret = array(); + $ret["timestamp"] = array(); + $ret["value"] = array(); + + $server = $c->serverid; + $db = $this->_connect(); + + $sql_where=""; + $value="leafvalue"; + + if ($group != NULL) + { + $sql_where.=" AND `group`='$group'"; + $value="subgroup"; + } + + if ($subgroup != NULL) + { + $sql_where.=" AND `subgroup`='$subgroup'"; + $value="leaf"; + } + + if ($leaf != NULL) + { + $sql_where.=" AND `leaf`='$leaf'"; + $value="leafvalue"; + } + + $sql_select="SELECT `$value`, `timestamp` FROM ".$c->container_cfg_mysql_table." WHERE `server`='$server' $sql_where GROUP BY `$value` ORDER BY timestamp"; + + if ($c->debug) + file_put_contents("/tmp/debug.txt", "\ngetSQL(".$sql_select.")", FILE_APPEND); + + if ($sql_select != "") + { + $thisresult = mysql_query($sql_select, $db); + if (mysql_num_rows($thisresult)) + { + while ($regel = mysql_fetch_array($thisresult)) + { + $ret["timestamp"][] = $regel["timestamp"]; + if ($value == "leafvalue") + { + if ($withleafvalue) + $ret["value"][] = $regel[$value]; + else + $ret["value"][] = NULL; + } + else + $ret["value"][] = $regel[$value]; + } + + } + else + return $ret; + } + return $ret; + } + + function rmMeta($group, $subgroup = null, $leaf = null) + { + $c =& $this->c; + if ($c->debug) + file_put_contents("/tmp/debug.txt", "\nrmMeta(".$group.",".$subgroup.",".$leaf.")", FILE_APPEND); + + $server = $c->serverid; + $db = $this->_connect(); + + $sql_delete = "DELETE FROM ".$c->container_cfg_mysql_table." WHERE `server`='$server'"; + + if($group != NULL) + $sql_delete .= " AND `group`='$group'"; + + if($subgroup != NULL) + $sql_delete .= " AND `subgroup`='$subgroup'"; + + if ($leaf != NULL) + $sql_delete .= " AND `leaf`='$leaf'"; + + if ($c->debug) + file_put_contents("/tmp/debug.txt", "\nrmSQL(".$sql_delete.")", FILE_APPEND); + + mysql_query($sql_delete, $db); + return true; + } + + function encode($str) + { + return addslashes(urlencode($str)); + } + + function decode($str) + { + return urldecode(stripslashes($str)); + } + +} + +?> \ No newline at end of file diff --git a/testcase/container_generic.php b/testcase/container_generic.php index 4900df52..30c4435f 100644 --- a/testcase/container_generic.php +++ b/testcase/container_generic.php @@ -31,7 +31,7 @@ function setUp() require_once dirname(__FILE__)."/../src/pfcglobalconfig.class.php"; $params = array(); $params["title"] = "testcase -> pfccontainer_".$this->type; - $params["serverid"] = md5(__FILE__/* . time()*/); + $params["serverid"] = md5(__FILE__ . time()); $params["container_type"] = $this->type; $this->c = new pfcGlobalConfig($params); $this->ct = $this->c->getContainerInstance(); @@ -296,7 +296,7 @@ function test_encodedecode_Generic() $ret = $ct->getMeta($group, $subgroup, $leaf, true); $this->assertEquals($ret['value'][0], $leafvalue, "the leaf value is wrong"); } - + function test_getMeta_Generic_1() { $c =& $this->c; @@ -344,7 +344,7 @@ function test_getMeta_Generic_2() $time = time(); $ret = $ct->getMeta($group, $subgroup); - asort($ret["value"]); + sort($ret["value"]); $this->assertEquals(count($ret["timestamp"]), 2, "number of leaf is wrong"); $this->assertEquals($ret["timestamp"][0], $time, "the leaf timestamp is wrong"); $this->assertEquals($ret["timestamp"][1], $time, "the leaf timestamp is wrong"); @@ -368,16 +368,15 @@ function test_getMeta_Generic_3() $ct->setMeta($group, $subgroup2, $leaf1); $ct->setMeta($group, $subgroup2, $leaf2); $time = time(); - + $ret = $ct->getMeta($group); - asort($ret["value"]); - $this->assertEquals(count($ret["timestamp"]), 2, "number of subgroup is wrong"); - $this->assertEquals($ret["timestamp"][0], $time, "the subgroup timestamp is wrong"); - $this->assertEquals($ret["timestamp"][1], $time, "the subgroup timestamp is wrong"); - $this->assertEquals($ret["value"][0], $subgroup1, "the subgroup name is wrong"); - $this->assertEquals($ret["value"][1], $subgroup2, "the subgroup name is wrong"); + sort($ret["value"]); + $this->assertEquals(2, count($ret["timestamp"]), "number of subgroup is wrong"); + $this->assertEquals($time, $ret["timestamp"][0], "the subgroup timestamp is wrong"); + $this->assertEquals($time, $ret["timestamp"][1], "the subgroup timestamp is wrong"); + $this->assertEquals($subgroup1, $ret["value"][0], "the subgroup name is wrong"); + $this->assertEquals($subgroup2, $ret["value"][1], "the subgroup name is wrong"); } - } ?> diff --git a/testcase/container_mysql.php b/testcase/container_mysql.php new file mode 100644 index 00000000..23241fb6 --- /dev/null +++ b/testcase/container_mysql.php @@ -0,0 +1,41 @@ +type = "Mysql"; + $this->pfcContainerTestcase($name); + } + + // called before the test functions will be executed + // this function is defined in PHPUnit_TestCase and overwritten + // here + function setUp() + { + pfcContainerTestcase::setUp(); + } + + // called after the test functions are executed + // this function is defined in PHPUnit_TestCase and overwritten + // here + function tearDown() + { + pfcContainerTestcase::tearDown(); + } +} + +// on desactive le timeout car se script peut mettre bcp de temps a s'executer +ini_set('max_execution_time', 0); + +$suite = new PHPUnit_TestSuite(); +$suite->addTestSuite("pfcContainerTestcase_Mysql"); +$result =& PHPUnit::run($suite); +echo "
    ";
    +print_r($result->toString());
    +echo "
    "; + +?> \ No newline at end of file