[Phpfreechat-svn] SF.net SVN: phpfreechat:[1266] trunk/src/containers/oracle.class.php
Status: Beta
Brought to you by:
kerphi
From: <gol...@us...> - 2009-10-03 14:01:03
|
Revision: 1266 http://phpfreechat.svn.sourceforge.net/phpfreechat/?rev=1266&view=rev Author: golemwashere Date: 2009-10-03 14:00:52 +0000 (Sat, 03 Oct 2009) Log Message: ----------- Added oracle container Added Paths: ----------- trunk/src/containers/oracle.class.php Added: trunk/src/containers/oracle.class.php =================================================================== --- trunk/src/containers/oracle.class.php (rev 0) +++ trunk/src/containers/oracle.class.php 2009-10-03 14:00:52 UTC (rev 1266) @@ -0,0 +1,401 @@ +<?php +/** + * src/container/oracle.class.php + * + * Copyright © 2006 Stephane Gully <ste...@gm...> + * Modifications by Golemwashere + * 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 + */ + +/* +Oracle specific parameters: +$params["container_type"] = "oracle"; +$params["container_cfg_oracle_host"] = "localhost"; +$params["container_cfg_oracle_port"] = 1521; +$params["container_cfg_oracle_database"] = "XE"; +$params["container_cfg_oracle_table"] = "phpfreechat"; +$params["container_cfg_oracle_username"] = "orauser"; +$params["container_cfg_oracle_password"] = "orapw"; + +*/ + + +require_once dirname(__FILE__)."/../pfccontainer.class.php"; + +// include pear DB classes +require_once 'DB.php'; + +/** + * pfcContainer_Oracle is a concret container which store data into Oracle database + * + * + * @author Golemwashere + * @author Stephane Gully <ste...@gm...> + * @author HenkBB + */ +class pfcContainer_Oracle extends pfcContainerInterface +{ + var $_db = null; + var $_sql_create_table = " + CREATE TABLE phpfreechat ( + server varchar2(200) NOT NULL default '', + groupg varchar2(200) NOT NULL default '', + subgroup varchar2(200) NOT NULL default '', + leaf varchar2(200) NOT NULL default '', + leafvalue varchar2(4000) NOT NULL, + timestampg number(20) NOT NULL default 0, +); + + PRIMARY KEY (server,groupg,subgroup,leaf); + INDEX (server,group,subgroupg,timestampg); + CREATE SEQUENCE phpfreechat_leafvalue_seq + + "; + + + function pfcContainer_Oracle() + { + pfcContainerInterface::pfcContainerInterface(); + } + + function getDefaultConfig() + { + $cfg = pfcContainerInterface::getDefaultConfig(); + $cfg["oracle_host"] = 'localhost'; + $cfg["oracle_port"] = 1521; + $cfg["oracle_database"] = 'XE'; + $cfg["oracle_table"] = 'phpfreechat'; + $cfg["oracle_username"] = 'phpfreechatuser'; + $cfg["oracle_password"] = 'freechatpass'; + return $cfg; + } + + function init(&$c) + { + + $errors = pfcContainerInterface::init($c); + + // connect to the db + $db = $this->_connect($c); + if ($db === FALSE) + { + $errors[] = _pfc("DB container: connect error"); + return $errors; + } + + // create the db if it doesn't exists + // golemwashere: commented out this part for now, DB must be manually created + /* + $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 = $this->_sql_create_table; + $query = str_replace('%engine%', $c->container_cfg_mysql_engine,$query); + $query = str_replace('%table%', $c->container_cfg_mysql_table,$query); + $query = str_replace('%fieldtype_server%', $c->container_cfg_mysql_fieldtype_server,$query); + $query = str_replace('%fieldtype_group%', $c->container_cfg_mysql_fieldtype_group,$query); + $query = str_replace('%fieldtype_subgroup%', $c->container_cfg_mysql_fieldtype_subgroup,$query); + $query = str_replace('%fieldtype_leaf%', $c->container_cfg_mysql_fieldtype_leaf,$query); + $query = str_replace('%fieldtype_leafvalue%', $c->container_cfg_mysql_fieldtype_leafvalue,$query); + $query = str_replace('%fieldtype_timestamp%', $c->container_cfg_mysql_fieldtype_timestamp,$query); + $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($c = null) + { + if (!$this->_db) + { + if ($c == null) $c =& pfcGlobalConfig::Instance(); + + $dsn = array( + 'phptype' => 'oci8', + 'username' => $c->container_cfg_oracle_username, + 'password' => $c->container_cfg_oracle_password, + 'hostspec' => '//'.$c->container_cfg_oracle_host.':'.$c->container_cfg_oracle_port.'/'.$c->container_cfg_oracle_database + ); + +$this->_db = DB::connect($dsn); +if (DB::isError($this->_db)) +{ + echo 'Cannot connect to database: ' . $this->_db->getMessage(); +} + + + + } + + + + return $this->_db; + } + + function setMeta($group, $subgroup, $leaf, $leafvalue = NULL) + { + $c =& pfcGlobalConfig::Instance(); + + $server = $c->serverid; + $db = $this->_connect(); + + if ($leafvalue == NULL){$leafvalue=" ";}; + # clean leafvalue: + $leafvalue=str_replace("'", "''", $leafvalue); + # GOLEMQUERY #1 + $sql_count = "SELECT COUNT(*) AS C FROM ".$c->container_cfg_oracle_table." WHERE server='$server' AND groupg='$group' AND subgroup='$subgroup' AND leaf='$leaf' and rownum <= 1"; + # GOLEMQUERY #2 + $sql_insert="INSERT INTO ".$c->container_cfg_oracle_table." (server, groupg, subgroup, leaf, leafvalue, timestampg) VALUES('$server', '$group', '$subgroup', '$leaf', '$leafvalue', trunc((to_number(cast((systimestamp AT TIME ZONE 'GMT') as date)-cast(TO_TIMESTAMP_TZ ('01-01-1970 00:00:00 GMT', 'DD-MM-YYYY HH24:MI:SS TZR') as date))*86400)))"; + # mysql was: + #$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'"; + # GOLEMQUERY #3 + $sql_update="UPDATE ".$c->container_cfg_oracle_table." SET leafvalue='$leafvalue', timestampg= trunc((to_number(cast((systimestamp AT TIME ZONE 'GMT') as date)-cast(TO_TIMESTAMP_TZ ('01-01-1970 00:00:00 GMT', 'DD-MM-YYYY HH24:MI:SS TZR') as date))*86400)) WHERE server='$server' AND groupg='$group' AND subgroup='$subgroup' AND leaf='$leaf'"; + + if (DEBUGSQL) error_log("sql_count $sql_count"); + $res = $this->_db->query($sql_count); + if (DB::isError($res)) + { + error_log("sql_count error $sql_count " . $res->getMessage()); + } + + + $row = $res->fetchRow(DB_FETCHMODE_ASSOC); + +/* mysql was: + $res = mysql_query($sql_count, $db); + $row = mysql_fetch_array($res, MYSQL_ASSOC); +*/ + + if( $row['C'] == 0 ) + { + $res=$this->_db->query($sql_insert); + if (DB::isError($res)) { error_log("sql insert error: $sql_insert " . $res->getMessage()); } + if (DEBUGSQL) error_log("sql_insert: $sql_insert"); + return 0; // value created + } + else + { + if ($sql_update != "") + { + $res=$this->_db->query($sql_update); + if (DB::isError($res)) + { error_log("sql update error: $sql_update " . $res->getMessage()); } + if (DEBUGSQL) error_log("sql_update $sql_update"); + } + return 1; // value overwritten + } + } + + + function getMeta($group, $subgroup = null, $leaf = null, $withleafvalue = false) + { + $c =& pfcGlobalConfig::Instance(); + + $ret = array(); + $ret["timestamp"] = array(); + $ret["value"] = array(); + + $server = $c->serverid; + $db = $this->_connect(); + + $sql_where = ""; + $sql_group_by = ""; + $value = "leafvalue"; + + if ($group != NULL) + { + $sql_where .= " AND groupg='$group'"; + $value = "subgroup"; + #$sql_group_by = "GROUP BY '$value'"; + $sql_group_by = "GROUP BY $value"; + } + + if ($subgroup != NULL) + { + $sql_where .= " AND subgroup='$subgroup'"; + $value = "leaf"; + $sql_group_by = ""; + } + + if ($leaf != NULL) + { + $sql_where .= " AND leaf='$leaf'"; + $value = "leafvalue"; + $sql_group_by = ""; + } + + # GOLEMQUERY #4 + $sql_select="SELECT $value, timestampg FROM ".$c->container_cfg_oracle_table." WHERE server='$server' $sql_where $sql_group_by ORDER BY timestampg"; + if ($sql_select != "") + { + $thisresult = $this->_db->query($sql_select); + if (DEBUGSQL) error_log("sql_select: $sql_select"); + if (DB::isError($thisresult)) { error_log("sql_select error $sql_select " . $thisresult->getMessage()); } + + + #if (mysql_num_rows($thisresult)) + $this->_db->setOption('portability', DB_PORTABILITY_NUMROWS); + + #error_log("numrows $numrows"); + + if ($thisresult->numRows()) + { + #while ($regel = mysql_fetch_array($thisresult)) + while ($regel = $thisresult->fetchRow(DB_FETCHMODE_ASSOC)) + { + $ret["timestamp"][] = $regel["TIMESTAMPG"]; + if ($value == "leafvalue") + { + if ($withleafvalue) + $ret["value"][] = $regel[strtoupper($value)]; + else + $ret["value"][] = NULL; + } + else + $ret["value"][] = $regel[strtoupper($value)]; + } + + } + else + return $ret; + } + return $ret; + } + + + function incMeta($group, $subgroup, $leaf) + { + $c =& pfcGlobalConfig::Instance(); + + $server = $c->serverid; + $db = $this->_connect(); + $time = time(); + + // search for the existing leafvalue + # GOLEMQUERY #5 + $sql_count = "SELECT COUNT(*) AS C FROM ".$c->container_cfg_oracle_table." WHERE server='$server' AND groupg='$group' AND subgroup='$subgroup' AND leaf='$leaf' and rownum <= 1"; + $res = $this->_db->query($sql_count); + if (DB::isError($res)) { error_log("sql_count error $sql_count " . $res->getMessage()); } + if (DEBUGSQL) error_log("sql select $sql_count"); + $row = $res->fetchRow(DB_FETCHMODE_ASSOC); + #$res = mysql_query($sql_count, $db); + #$row = mysql_fetch_array($res, MYSQL_ASSOC); + if( $row['C'] == 0 ) + { + $leafvalue = 1; + #$sql_insert="REPLACE INTO ".$c->container_cfg_mysql_table." (`server`, `group`, `subgroup`, `leaf`, `leafvalue`, `timestamp`) VALUES('$server', '$group', '$subgroup', '$leaf', '".$leafvalue."', '".$time."')"; + # GOLEMQUERY # 6 + $sql_insert="INSERT INTO ".$c->container_cfg_oracle_table." (server, groupg, subgroup, leaf, leafvalue, timestampg) VALUES('$server', '$group', '$subgroup', '$leaf','$leafvalue', trunc((to_number(cast((systimestamp AT TIME ZONE 'GMT') as date)-cast(TO_TIMESTAMP_TZ ('01-01-1970 00:00:00 GMT', 'DD-MM-YYYY HH24:MI:SS TZR') as date))*86400)))"; + + #mysql_query($sql_insert, $db); + $res=$this->_db->query($sql_insert); + if (DB::isError($res)){ error_log("sql insert error $sql_insert " . $res->getMessage()); } + if (DEBUGSQL) error_log("sql_insert $sql_insert"); + } + else + { + # mysql was: + #$sql_update="UPDATE ".$c->container_cfg_mysql_table." SET leafvalue= LAST_INSERT_ID( leafvalue + 1 ), `timestamp`='".$time."' WHERE server='$server' AND groupg='$group' AND subgroup='$subgroup' AND leaf='$leaf'"; + # GOLEMQUERY #7 + # test using sequence nextval + $sql_update="UPDATE ".$c->container_cfg_oracle_table." SET leafvalue= phpfreechat_leafvalue_seq.NEXTVAL, timestampg=trunc((to_number(cast((systimestamp AT TIME ZONE 'GMT') as date)-cast(TO_TIMESTAMP_TZ ('01-01-1970 00:00:00 GMT', 'DD-MM-YYYY HH24:MI:SS TZR') as date))*86400)) WHERE server='$server' AND groupg='$group' AND subgroup='$subgroup' AND leaf='$leaf'"; + + $res=$this->_db->query($sql_update); + if (DB::isError($res)){ error_log("problema update: $sql_update " . $res->getMessage()); } + if (DEBUGSQL) error_log("sql_update $sql_update"); + # + # GOLEMQUERY #8 + # test using sequence currval + $sql_last="SELECT phpfreechat_leafvalue_seq.currVAL as lastleaf FROM dual"; + $res = $this->_db->query($sql_last); + if (DB::isError($res)) { error_log("error in SELECT lastleaf $sql_last" . $res->getMessage()); } + if (DEBUGSQL) error_log("select: SELECT phpfreechat_leafvalue_seq.currVAL as lastleaf FROM dual"); + #$row = mysql_fetch_array($res, MYSQL_ASSOC); + $row = $res->fetchRow(DB_FETCHMODE_ASSOC); + $leafvalue = $row['LASTLEAF']; + } + + $ret["value"][] = $leafvalue; + $ret["timestamp"][] = $time; + + return $ret; + } + + + function rmMeta($group, $subgroup = null, $leaf = null) + { + $c =& pfcGlobalConfig::Instance(); + + $server = $c->serverid; + $db = $this->_connect(); + # GOLEMQUERY #9 + $sql_delete = "DELETE FROM ".$c->container_cfg_oracle_table." WHERE server='$server'"; + + if($group != NULL) + $sql_delete .= " AND groupg='$group'"; + + if($subgroup != NULL) + $sql_delete .= " AND subgroup='$subgroup'"; + + if ($leaf != NULL) + $sql_delete .= " AND leaf='$leaf'"; + + #mysql_query($sql_delete, $db); + $res=$this->_db->query($sql_delete); + if (DB::isError($res)) + { error_log('sql_delete $sql_delete ' . $res->getMessage()); } + + if (DEBUGSQL) error_log("sql_delete $sql_delete"); + + return true; + } + + function encode($str) + { + return $str; + //return addslashes(urlencode($str)); + } + + function decode($str) + { + return $str; + //return urldecode(stripslashes($str)); + } + + + +} + +?> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |