/usr/local/miolo2/classes/contrib/dbug.class

Go to the documentation of this file.
00001 <?php
00002 //error_reporting(E_ALL);
00003 
00040 ?>
00041 <script language="JavaScript">
00042 /* code modified from ColdFusion's cfdump code */
00043     function dBug_toggleRow(source) {
00044         target=(document.all) ? source.parentElement.cells[1] : source.parentNode.lastChild
00045         dBug_toggleTarget(target,dBug_toggleSource(source));
00046     }
00047     
00048     function dBug_toggleSource(source) {
00049         if (source.style.fontStyle=='italic') {
00050             source.style.fontStyle='normal';
00051             source.title='click to collapse';
00052             return 'open';
00053         } else {
00054             source.style.fontStyle='italic';
00055             source.title='click to expand';
00056             return 'closed';
00057         }
00058     }
00059 
00060     function dBug_toggleTarget(target,switchToState) {
00061         target.style.display=(switchToState=='open') ? '' : 'none';
00062     }
00063 
00064     function dBug_toggleTable(source) {
00065         var switchToState=dBug_toggleSource(source);
00066         if(document.all) {
00067             var table=source.parentElement.parentElement;
00068             for(var i=1;i<table.rows.length;i++) {
00069                 target=table.rows[i];
00070                 dBug_toggleTarget(target,switchToState);
00071             }
00072         }
00073         else {
00074             var table=source.parentNode.parentNode;
00075             for (var i=1;i<table.childNodes.length;i++) {
00076                 target=table.childNodes[i];
00077                 if(target.style) {
00078                     dBug_toggleTarget(target,switchToState);
00079                 }
00080             }
00081         }
00082     }
00083 </script>
00084 
00085 <style type="text/css">
00086     table.dBug_array,table.dBug_object,table.dBug_resource,table.dBug_resourceC,table.dBug_xml {
00087         font-family:Verdana, Arial, Helvetica, sans-serif; color:#000000; font-size:12px;
00088     }
00089     
00090     .dBug_arrayHeader,
00091     .dBug_objectHeader,
00092     .dBug_resourceHeader,
00093     .dBug_resourceCHeader,
00094     .dBug_xmlHeader 
00095         { font-weight:bold; color:#FFFFFF; }
00096     
00097     /* array */
00098     table.dBug_array { background-color:#006600; }
00099     table.dBug_array td { background-color:#FFFFFF; }
00100     table.dBug_array td.dBug_arrayHeader { background-color:#009900; }
00101     table.dBug_array td.dBug_arrayKey { background-color:#CCFFCC; }
00102     
00103     /* object */
00104     table.dBug_object { background-color:#0000CC; }
00105     table.dBug_object td { background-color:#FFFFFF; }
00106     table.dBug_object td.dBug_objectHeader { background-color:#4444CC; }
00107     table.dBug_object td.dBug_objectKey { background-color:#CCDDFF; }
00108     
00109     /* resource */
00110     table.dBug_resourceC { background-color:#884488; }
00111     table.dBug_resourceC td { background-color:#FFFFFF; }
00112     table.dBug_resourceC td.dBug_resourceCHeader { background-color:#AA66AA; }
00113     table.dBug_resourceC td.dBug_resourceCKey { background-color:#FFDDFF; }
00114     
00115     /* resource */
00116     table.dBug_resource { background-color:#884488; }
00117     table.dBug_resource td { background-color:#FFFFFF; }
00118     table.dBug_resource td.dBug_resourceHeader { background-color:#AA66AA; }
00119     table.dBug_resource td.dBug_resourceKey { background-color:#FFDDFF; }
00120     
00121     /* xml */
00122     table.dBug_xml { background-color:#888888; }
00123     table.dBug_xml td { background-color:#FFFFFF; }
00124     table.dBug_xml td.dBug_xmlHeader { background-color:#AAAAAA; }
00125     table.dBug_xml td.dBug_xmlKey { background-color:#DDDDDD; }
00126 </style>
00127 
00128 <?php
00129 class dBug {
00130     
00131     var $xmlDepth=array();
00132     var $xmlCData;
00133     var $xmlSData;
00134     var $xmlDData;
00135     var $xmlCount=0;
00136     var $xmlAttrib;
00137     var $xmlName;
00138     var $arrType=array("array","object","resource","boolean");
00139     
00140     //constructor
00141     function dBug($var,$forceType="") {
00142         $arrAccept=array("array","object","xml"); //array of variable types that can be "forced"
00143         if(in_array($forceType,$arrAccept))
00144             $this->{"varIs".ucfirst($forceType)}($var);
00145         else
00146             $this->checkType($var);
00147     }
00148     
00149     //create the main table header
00150     function makeTableHeader($type,$header,$colspan=2) {
00151         echo "<table cellspacing=2 cellpadding=3 class=\"dBug_".$type."\">
00152                 <tr>
00153                     <td class=\"dBug_".$type."Header\" colspan=".$colspan." style=\"cursor:hand\" onClick='dBug_toggleTable(this)'>".$header."</td>
00154                 </tr>";
00155     }
00156     
00157     //create the table row header
00158     function makeTDHeader($type,$header) {
00159         echo "<tr>
00160                 <td valign=\"top\" onClick='dBug_toggleRow(this)' style=\"cursor:hand\" class=\"dBug_".$type."Key\">".$header."</td>
00161                 <td>";
00162     }
00163     
00164     //close table row
00165     function closeTDRow() {
00166         return "</td>\n</tr>\n";
00167     }
00168     
00169     //error
00170     function  error($type) {
00171         $error="Error: Variable is not a";
00172         //thought it would be nice to place in some nice grammar techniques :)
00173         // this just checks if the type starts with a vowel or "x" and displays either "a" or "an"
00174         if(in_array(substr($type,0,1),array("a","e","i","o","u","x")))
00175             $error.="n";
00176         return ($error." ".$type." type");
00177     }
00178 
00179     //check variable type
00180     function checkType($var) {
00181         switch(gettype($var)) {
00182             case "resource":
00183                 $this->varIsResource($var);
00184                 break;
00185             case "object":
00186                 $this->varIsObject($var);
00187                 break;
00188             case "array":
00189                 $this->varIsArray($var);
00190                 break;
00191             case "boolean":
00192                 $this->varIsBoolean($var);
00193                 break;
00194             default:
00195                 $var=($var=="") ? "[empty string]" : $var;
00196 
00197                 $additional = ($var == "[empty string]") ? '' : ' ('. gettype($var) . ', length: ' . strlen($var) .')';
00198 
00199                 echo "<table cellspacing=1 class='dBug_array'><tr>\n<td class='dBug_arrayKey'>\n<pre>".$var."</pre></td>\n<td>\n". $additional ."</td>\n</tr>\n</table>\n";
00200                 break;
00201         }
00202     }
00203     
00204     //<pre><font color='#bb00bb'>
00205     
00206     //if variable is a boolean type
00207     function varIsBoolean($var) {
00208         $var=($var==1) ? "TRUE" : "FALSE";
00209         echo $var;
00210     }
00211             
00212     //if variable is an array type
00213     function varIsArray($var) {
00214         $this->makeTableHeader("array","array of size " . count($var));
00215         if(is_array($var)) {
00216             foreach($var as $key=>$value) {
00217                 $this->makeTDHeader("array",$key);
00218                 if(in_array(gettype($value),$this->arrType))
00219                     $this->checkType($value);
00220                 else {
00221                     $value=(trim($value)=="") ? "[empty string]" : $value;
00222                     $additional = ($value == "[empty string]") ? '' : ' ('. gettype($value) . ', length: ' . strlen($value) .')';
00223                     
00224                     echo $value."</td>\n<td>\n ". $additional ."</td>\n</tr>\n";
00225                 }
00226             }
00227         }
00228         else echo "<tr><td>".$this->error("array").$this->closeTDRow();
00229         echo "</table>";
00230     }
00231     
00232     //if variable is an object type
00233     function varIsObject($var) {
00234         $this->makeTableHeader("object", "object of type " . get_class($var));
00235         $arrObjVars=get_object_vars($var);
00236         if(is_object($var)) {
00237             foreach($arrObjVars as $key=>$value) {
00238                 $value=(trim($value)=="") ? "[empty string]" : $value;
00239                 
00240                 $additional = ($value == "[empty string]") ? '' : ' ('. gettype($value) . ', length: ' . strlen($value) .')';
00241                 
00242                 $this->makeTDHeader("object",$key);
00243                 if(in_array(gettype($value),$this->arrType))
00244                     $this->checkType($value);
00245                 else echo $value . $additional .$this->closeTDRow();
00246             }
00247             $arrObjMethods=get_class_methods(get_class($var));
00248             foreach($arrObjMethods as $key=>$value) {
00249                 $this->makeTDHeader("object",$value);
00250                 echo "[method]".$this->closeTDRow();
00251             }
00252         }
00253         else echo "<tr><td>".$this->error("object").$this->closeTDRow();
00254         echo "</table>";
00255     }
00256 
00257     //if variable is a resource type
00258     function varIsResource($var) {
00259         $this->makeTableHeader("resourceC","resource of type ".get_resource_type($var),1);
00260         echo "<tr>\n<td>\n";
00261         switch(get_resource_type($var)) {
00262             case "fbsql result":
00263             case "mssql result":
00264             case "msql query":
00265             case "pgsql result":
00266             case "sybase-db result":
00267             case "sybase-ct result":
00268             case "mysql result":
00269                 $db=current(explode(" ",get_resource_type($var)));
00270                 $this->varIsDBResource($var,$db);
00271                 break;
00272             case "gd":
00273                 $this->varIsGDResource($var);
00274                 break;
00275             case "xml":
00276                 $this->varIsXmlResource($var);
00277                 break;
00278             default:
00279                 echo get_resource_type($var).$this->closeTDRow();
00280                 break;
00281         }
00282         echo $this->closeTDRow()."</table>\n";
00283     }
00284     
00285     //if variable is an xml type
00286     function varIsXml($var) {
00287         $this->varIsXmlResource($var);
00288     }
00289     
00290     //if variable is an xml resource type
00291     function varIsXmlResource($var) {
00292         $xml_parser=xml_parser_create();
00293         xml_parser_set_option($xml_parser,XML_OPTION_CASE_FOLDING,0); 
00294         xml_set_element_handler($xml_parser,array(&$this,"xmlStartElement"),array(&$this,"xmlEndElement")); 
00295         xml_set_character_data_handler($xml_parser,array(&$this,"xmlCharacterData"));
00296         xml_set_default_handler($xml_parser,array(&$this,"xmlDefaultHandler")); 
00297         
00298         $this->makeTableHeader("xml","xml document",2);
00299         $this->makeTDHeader("xml","xmlRoot");
00300         
00301         //attempt to open xml file
00302         $bFile=(!($fp=@fopen($var,"r"))) ? false : true;
00303         
00304         //read xml file
00305         if($bFile) {
00306             while($data=str_replace("\n","",fread($fp,4096)))
00307                 $this->xmlParse($xml_parser,$data,feof($fp));
00308         }
00309         //if xml is not a file, attempt to read it as a string
00310         else {
00311             if(!is_string($var)) {
00312                 echo $this->error("xml").$this->closeTDRow()."</table>\n";
00313                 return;
00314             }
00315             $data=$var;
00316             $this->xmlParse($xml_parser,$data,1);
00317         }
00318         
00319         echo $this->closeTDRow()."</table>\n";
00320         
00321     }
00322     
00323     //parse xml
00324     function xmlParse($xml_parser,$data,$bFinal) {
00325         if (!xml_parse($xml_parser,$data,$bFinal)) { 
00326                    die(sprintf("XML error: %s at line %d\n", 
00327                                xml_error_string(xml_get_error_code($xml_parser)), 
00328                                xml_get_current_line_number($xml_parser)));
00329         }
00330     }
00331     
00332     //xml: inititiated when a start tag is encountered
00333     function xmlStartElement($parser,$name,$attribs) {
00334         $this->xmlAttrib[$this->xmlCount]=$attribs;
00335         $this->xmlName[$this->xmlCount]=$name;
00336         $this->xmlSData[$this->xmlCount]='$this->makeTableHeader("xml","xml element",2);';
00337         $this->xmlSData[$this->xmlCount].='$this->makeTDHeader("xml","xmlName");';
00338         $this->xmlSData[$this->xmlCount].='echo "<strong>'.$this->xmlName[$this->xmlCount].'</strong>".$this->closeTDRow();';
00339         $this->xmlSData[$this->xmlCount].='$this->makeTDHeader("xml","xmlAttributes");';
00340         if(count($attribs)>0)
00341             $this->xmlSData[$this->xmlCount].='$this->varIsArray($this->xmlAttrib['.$this->xmlCount.']);';
00342         else
00343             $this->xmlSData[$this->xmlCount].='echo "&nbsp;";';
00344         $this->xmlSData[$this->xmlCount].='echo $this->closeTDRow();';
00345         $this->xmlCount++;
00346     } 
00347     
00348     //xml: initiated when an end tag is encountered
00349     function xmlEndElement($parser,$name) {
00350         for($i=0;$i<$this->xmlCount;$i++) {
00351             eval($this->xmlSData[$i]);
00352             $this->makeTDHeader("xml","xmlText");
00353             echo (!empty($this->xmlCData[$i])) ? $this->xmlCData[$i] : "&nbsp;";
00354             echo $this->closeTDRow();
00355             $this->makeTDHeader("xml","xmlComment");
00356             echo (!empty($this->xmlDData[$i])) ? $this->xmlDData[$i] : "&nbsp;";
00357             echo $this->closeTDRow();
00358             $this->makeTDHeader("xml","xmlChildren");
00359             unset($this->xmlCData[$i],$this->xmlDData[$i]);
00360         }
00361         echo $this->closeTDRow();
00362         echo "</table>";
00363         $this->xmlCount=0;
00364     } 
00365     
00366     //xml: initiated when text between tags is encountered
00367     function xmlCharacterData($parser,$data) {
00368         $count=$this->xmlCount-1;
00369         if(!empty($this->xmlCData[$count]))
00370             $this->xmlCData[$count].=$data;
00371         else
00372             $this->xmlCData[$count]=$data;
00373     } 
00374     
00375     //xml: initiated when a comment or other miscellaneous texts is encountered
00376     function xmlDefaultHandler($parser,$data) {
00377         //strip '<!--' and '-->' off comments
00378         $data=str_replace(array("&lt;!--","--&gt;"),"",htmlspecialchars($data));
00379         $count=$this->xmlCount-1;
00380         if(!empty($this->xmlDData[$count]))
00381             $this->xmlDData[$count].=$data;
00382         else
00383             $this->xmlDData[$count]=$data;
00384     }
00385     
00386     //if variable is a database resource type
00387     function varIsDBResource($var,$db="mysql") {
00388         $numrows=call_user_func($db."_num_rows",$var);
00389         $numfields=call_user_func($db."_num_fields",$var);
00390         $this->makeTableHeader("resource",$db." result",$numfields+1);
00391         echo "<tr><td class=\"dBug_resourceKey\">&nbsp;</td>";
00392         for($i=0;$i<$numfields;$i++) {
00393             $field[$i]=call_user_func($db."_fetch_field",$var,$i);
00394             echo "<td class=\"dBug_resourceKey\">".$field[$i]->name."</td>";
00395         }
00396         echo "</tr>";
00397         for($i=0;$i<$numrows;$i++) {
00398             $row=call_user_func($db."_fetch_array",$var,constant(strtoupper($db)."_ASSOC"));
00399             echo "<tr>\n";
00400             echo "<td class=\"dBug_resourceKey\">".($i+1)."</td>"; 
00401             for($k=0;$k<$numfields;$k++) {
00402                 $tempField=$field[$k]->name;
00403                 $fieldrow=$row[($field[$k]->name)];
00404                 $fieldrow=($fieldrow=="") ? "[empty string]" : $fieldrow;
00405                 echo "<td>".$fieldrow."</td>\n";
00406             }
00407             echo "</tr>\n";
00408         }
00409         echo "</table>";
00410         if($numrows>0)
00411             call_user_func($db."_data_seek",$var,0);
00412     }
00413     
00414     //if variable is an image/gd resource type
00415     function varIsGDResource($var) {
00416         $this->makeTableHeader("resource","gd",2);
00417         $this->makeTDHeader("resource","Width");
00418         echo imagesx($var).$this->closeTDRow();
00419         $this->makeTDHeader("resource","Height");
00420         echo imagesy($var).$this->closeTDRow();
00421         $this->makeTDHeader("resource","Colors");
00422         echo imagecolorstotal($var).$this->closeTDRow();
00423         echo "</table>";
00424     }
00425 }
00426 ?>
CopyLeft (L) 2001-2006 - [MIOLO Development Team] SOLIS - Cooperativa de Soluções Livres - Lajeado/RS - Brasil