chregu Sat Mar 24 12:00:03 2001 EDT Added files: /php4/pear/Experimental/XML sql2xml.php sql2xml_ext.php Log: First Commit of the sql2xml classes. This class takes a PEAR::DB-Result Object (or more than one) and returns a xml-representation of it.
Index: php4/pear/Experimental/XML/sql2xml.php +++ php4/pear/Experimental/XML/sql2xml.php <?php // +----------------------------------------------------------------------+ // | PHP version 4.0 | // +----------------------------------------------------------------------+ // | Copyright (c) 1997, 1998, 1999, 2000, 2001 The PHP Group | // +----------------------------------------------------------------------+ // | This source file is subject to version 2.0 of the PHP license, | // | that is bundled with this package in the file LICENSE, and is | // | available at through the world-wide-web at | // | http://www.php.net/license/2_02.txt. | // | If you did not receive a copy of the PHP license and are unable to | // | obtain it through the world-wide-web, please send a note to | // | [EMAIL PROTECTED] so we can mail you a copy immediately. | // +----------------------------------------------------------------------+ // | Authors: Christian Stocker <[EMAIL PROTECTED]> | // +----------------------------------------------------------------------+ // // $Id: sql2xml.php,v 1.1 2001/03/24 20:00:02 chregu Exp $ /** * This class takes a PEAR::DB-Result Object (or more than one) * and returns a xml-representation of it. * * More docs will follow * * Usage example * * include_once ("DB.php"); * include_once("XML/sql2xml.php"); * $db = DB::connect("mysql://root@localhost/xmltest"); * $xml = new xml_sql2xml; * $result = $db->query("select * from bands"); * $xmlstring = $xml->getxml($result,$options)); * * more examples and outputs on * http://www.nomad.ch/php/sql2xml * for the time being * * @author Christian Stocker <[EMAIL PROTECTED]> * @version $Id: sql2xml.php,v 1.1 2001/03/24 20:00:02 chregu Exp $ */ class XML_sql2xml { /** * * @var boolean */ var $nested = True; /** * * @var boolean */ var $user_options = False; /** * * @var object domxml */ var $xmldoc; /** * * @var string */ var $xmlroot = ""; /** * * * @param string */ function XML_sql2xml ($root = "root") { $this->xmldoc = domxml_new_xmldoc('1.0'); if ($root) { $this->xmlroot = $this->xmldoc->add_root($root); } } /** * Adds an aditional resultset to the xml-document * * @param Object result result from a DB-query * @param array mixed options to be passed (does it need that?) * @return string xml * @access public */ function add_result($result, $options = False) { $this->do_sql2xml($result, $options); } /** * Returns an xml-string with a xml-representation of the resultsets. * * The resultset can be directly provided here, or if you need more than one * in your xml, then you have to provide each of them with add_result befor getxml * * @param Object result result from a DB-query * @param array mixed options to be passed (does it need that?) * @return string xml * @access public */ function getxml($result = False, $options = False) { return domxml_dumpmem($this->getxmlObject($result, $options)); } /** * Returns an xml DomDocument Object with a xml-representation of the resultsets. * * The resultset can be directly provided here, or if you need more than one * in your xml, then you have to provide each of them with add_result befor getxml * * @param Object result result from a DB-query * @param array mixed options to be passed (does it need that?) * @return Object DomDocument * @access public */ function getxmlObject($result = False, $options = False) { if ($result) { $this->do_sql2xml($result, $options); } return $this->xmldoc; } function do_sql2xml($result, $options = False) { //set options if (is_array($options)) { foreach ($options as $option => $value) { $this->setOption($option, $value); } } //user should be able to give his own tableInfo-array, but not implemented yet if (! ($tableInfo = $result->tableInfo(False))) { //emulate tableInfo. this can go away, if every db supports tableInfo $fetchmode = DB_FETCHMODE_ASSOC; $res = $result->FetchRow($fetchmode); $this->nested = False; $i = 0; while (list($key, $val) = each($res)) { $tableInfo[$i][table]= "result"; $tableInfo[$i][name] = $key; $resFirstRow[$i] = $val; $i++; } $res = $resFirstRow; $FirstFetchDone = True; $fetchmode = DB_FETCHMODE_ORDERED; } else { $fetchmode = DB_FETCHMODE_ORDERED; } // initialize db hierarchy... $parenttable = "root"; $tableInfo[parent_key][root] = 0; foreach ($tableInfo as $key => $value) { if (is_int($key)) { if (is_null($tableInfo[parent_table][$value[table]])) { $tableInfo[parent_key][$value[table]] = $key; $tableInfo[parent_table][$value[table]] = $parenttable; $parenttable = $value[table] ; } } //if you need more tableInfo for later use you can write a function add_tableInfo.. $this->add_tableInfo($key, $value, &$tableInfo); } // end initialize $parent[root] = $this->insert_new_result(&$tableInfo); while ($FirstFetchDone || $res = $result->FetchRow($fetchmode)) { //FirstFetchDone is only for emulating tableInfo, as long as not all dbs support tableInfo. can go away later $FirstFetchDone = False; while (list($key, $val) = each($res)) { if ($resold[$tableInfo[parent_key][$tableInfo[$key][table]]] != $res[$tableInfo[parent_key][$tableInfo[$key][table]]] || !$this->nested) { if ($tableInfo[parent_key][$tableInfo[$key][table]] == $key ) { if ($this->nested || $key == 0) { $parent[$tableInfo[$key][table]] = $this->insert_new_row($parent[$tableInfo[parent_table][$tableInfo[$key][table]]],$res,$key,&$tableInfo); } else { $parent[$tableInfo[$key][table]]= $parent[$tableInfo[parent_table][$tableInfo[$key][table]]]; } //set all children entries to somethin stupid foreach($tableInfo[parent_table] as $pkey => $pvalue) { if ($pvalue == $tableInfo[$key][table]) { $resold[$tableInfo[parent_key][$pkey]]= "ThisIsJustAPlaceHolder"; } } } $this->insert_new_element($parent[$tableInfo[$key][table]],$res,$key,&$tableInfo,&$subrow); } } $resold = $res; unset ($subrow); } return $this->xmldoc; } function setOption($option, $value) { if (isset($this->$option)) { $this->$option = $value; return True; } return False; // return $this->raiseError("unknown option $option"); } // this are the functions, which are intended to be overriden in user classes function insert_new_result (&$metadata) { if ($this->xmlroot) return $this->xmlroot->new_child("result",Null); else return $this->xmldoc->add_root("result"); } function insert_new_row ($parent_row, $res, $key, &$metadata) { return $parent_row->new_child("row",Null); } function insert_new_element ($parent, $res, $key, &$metadata, &$subrow) { return $parent->new_child($metadata[$key][name], utf8_encode($res[$key])); } function add_tableInfo ($key, $value, &$metadata) { } } ?> Index: php4/pear/Experimental/XML/sql2xml_ext.php +++ php4/pear/Experimental/XML/sql2xml_ext.php <?php // +----------------------------------------------------------------------+ // | PHP version 4.0 | // +----------------------------------------------------------------------+ // | Copyright (c) 1997, 1998, 1999, 2000, 2001 The PHP Group | // +----------------------------------------------------------------------+ // | This source file is subject to version 2.0 of the PHP license, | // | that is bundled with this package in the file LICENSE, and is | // | available at through the world-wide-web at | // | http://www.php.net/license/2_02.txt. | // | If you did not receive a copy of the PHP license and are unable to | // | obtain it through the world-wide-web, please send a note to | // | [EMAIL PROTECTED] so we can mail you a copy immediately. | // +----------------------------------------------------------------------+ // | Authors: Christian Stocker <[EMAIL PROTECTED]> | // +----------------------------------------------------------------------+ // // $Id: sql2xml_ext.php,v 1.1 2001/03/24 20:00:02 chregu Exp $ /** * This class shows with one example, how the base sql2xml-class * could be extended. * * Usage example * * include_once ("DB.php"); * include_once("XML/sql2xml_ext.php"); * $xml = new xml_sql2xml_ext; * $options= array( user_options => array (xml_seperator =>"_", * element_id => "id"), * ); * $db = DB::connect("mysql://root@localhost/xmltest"); * $xml = new xml_sql2xml; * $result = $db->query("select * from bands"); * $xmlstring = $xml->getxml($result,$options)); * more examples and outputs on * http://www.nomad.ch/php/sql2xml/ * for the time being * * @author Christian Stocker <[EMAIL PROTECTED]> * @version $Id: sql2xml_ext.php,v 1.1 2001/03/24 20:00:02 chregu Exp $ */ require_once ("XML/sql2xml.php"); class XML_sql2xml_ext extends XML_sql2xml { function insert_new_row ($parent_row,$res,$key,&$tableInfo) { $new_row= $parent_row->new_child("row",Null); /* make an unique ID attribute in the row element with tablename.id if there's an id otherwise just make an unique id with the php-function, just that there's a unique id for this row. CAUTION: This ID changes every time ;) (if no id from db-table) */ if ($res[$tableInfo[id][$tableInfo[$key][table]]]) { if ($res[$tableInfo[id][$tableInfo[$key][table]]] == $this->user_options[id]) { $new_row->set_attribute("selected","selected"); } $new_row->set_attribute("ID",utf8_encode($tableInfo[$key][table].$res[$tableInfo[id][$tableInfo[$key][table]]])); } else { $new_row->set_attribute("ID", uniqid($tableInfo[$key][table])); } return $new_row; } function insert_new_result (&$tableInfo) { if ($this->xmlroot) $xmlroot=$this->xmlroot->new_child($tableInfo[0][table],Null); else $xmlroot= $this->xmldoc->add_root($tableInfo[0][table]); $xmlroot->set_attribute("type","Database"); return $xmlroot; } function insert_new_element ($parent,$res,$key,&$tableInfo,&$subrow) { if ($this->user_options[xml_seperator]) { //the preg should be only done once.... $i=0; preg_match_all("/([^".$this->user_options[xml_seperator]."]+)".$this->user_options[xml_seperator]."*/",$tableInfo[$key][name],$regs); $subrow[$regs[1][-1]]= $parent; // here we separate db fields to subtags. for ($i=0;$i<(count($regs[1])-1);$i++) { if ( ! $subrow[$regs[1][$i]]) { $subrow[$regs[1][$i]]= $subrow[$regs[1][$i-1]]->new_child($regs[1][$i],Null); } } $subrows=$subrow[$regs[1][$i-1]]->new_child($regs[1][$i],utf8_encode($res[$key])); } else { $regs[1][0] = $tableInfo[$key][name]; $i=0; $subrow=$parent->new_child($regs[1][$i],utf8_encode($res[$key])); } } function add_tableInfo ($key,$value,&$tableInfo) { if (!$metdata[id][$value[table]] && $value[name] == $this->user_options[element_id] ) { $tableInfo[id][$value[table]]= $key; } } } ?>
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED] To contact the list administrators, e-mail: [EMAIL PROTECTED]