diff options
| author | Lester Caine <lester@lsces.co.uk> | 2009-02-21 18:18:42 +0000 |
|---|---|---|
| committer | Lester Caine <lester@lsces.co.uk> | 2009-02-21 18:18:42 +0000 |
| commit | e55f98075855e6330e962de99f44f97df2a04ede (patch) | |
| tree | 714d16b97a82c13d1df3222a577b27602050e181 | |
| parent | 7626010ce0bd9084a0067c338433b3903504a400 (diff) | |
| download | wiki-e55f98075855e6330e962de99f44f97df2a04ede.tar.gz wiki-e55f98075855e6330e962de99f44f97df2a04ede.tar.bz2 wiki-e55f98075855e6330e962de99f44f97df2a04ede.zip | |
Move to liberty - plugin will be used from other packages
| -rw-r--r-- | liberty_plugins/data.dbreport.php | 1688 |
1 files changed, 0 insertions, 1688 deletions
diff --git a/liberty_plugins/data.dbreport.php b/liberty_plugins/data.dbreport.php deleted file mode 100644 index cd1b551..0000000 --- a/liberty_plugins/data.dbreport.php +++ /dev/null @@ -1,1688 +0,0 @@ -<?php -/** - * $Header: /cvsroot/bitweaver/_bit_wiki/liberty_plugins/Attic/data.dbreport.php,v 1.4 2009/02/21 16:27:29 lsces Exp $ - * @package liberty - * @subpackage plugins_data - * - * Generates a html report from a database query. - * Jeremy Lee 2009-02-16 - */ - -/** - * definitions - */ -define( 'PLUGIN_GUID_DATADBREPORT', 'datadbreport' ); -global $gLibertySystem; -$pluginParams = array ( - 'tag' => 'dbreport', - 'title' => 'DBReport', - 'description' => tra( "Generates a html report from a database query" ), - 'help_page' => 'DataPluginDBReport', - - 'auto_activate' => FALSE, - 'requires_pair' => TRUE, - 'syntax' => '{dbreport dsn=dsnname db=dbname csv=0|1 wiki=0|1 debug=0|1 }', - 'plugin_type' => DATA_PLUGIN, - - // display icon in quicktags bar - 'biticon' => '{biticon ilocation=quicktag iname=image-x-generic iexplain="DBReport"}', - 'taginsert' => '{dbreport dsn= db= csv= wiki= debug= }', - - // functions - 'help_function' => 'data_dbreport_help', - 'load_function' => 'wikiplugin_dbreport', -); -$gLibertySystem->registerPlugin( PLUGIN_GUID_DATADBREPORT, $pluginParams ); -$gLibertySystem->registerDataTag( $pluginParams['tag'], PLUGIN_GUID_DATADBREPORT ); - -// plugin globals -$wikiplugin_dbreport_errors; -$wikiplugin_dbreport_fields; -$wikiplugin_dbreport_fields_allowed; -$wikiplugin_dbreport_record; - -class WikipluginDBReportToken { - var $type; // key=keyword, fld=field, str=string, var=variable, sty=style, eof=end of file - var $content; - var $start; - var $after; - var $code; - function type_name() { - switch($this->type) { - case 'key': return 'Keyword'; - case 'txt': return 'Text'; - case 'sty': return 'Style'; - case 'fld': return 'Field'; - case 'var': return 'Variable'; - case 'str': return 'String'; - case 'bra': return 'Brackets'; - case 'eof': return 'End'; - default: return $token->type; - } - } - function WikipluginDBReportToken($content=NULL) { - $this->content = $content; - } -} - -class WikipluginDBReportField { - var $name; - var $variable; - var $break; - var $index; - function WikipluginDBReportField($text) { - global $wikiplugin_dbreport_fields, $wikiplugin_dbreport_fields_allowed; - $this->name = stripcslashes($text); - if($text[0]=='$') { - $this->variable = substr($this->name,1); - // print("new variable $this->variable "); - } else { - // add to the list of parsed fields - // if($wikiplugin_dbreport_fields_allowed) - $wikiplugin_dbreport_fields[] =& $this; - } - } - function text() { - global $wikiplugin_dbreport_record; - if(isset($this->index)) { - // indexed field - return (string)($wikiplugin_dbreport_record[$this->index]); - } else if(isset($this->variable)) { - // PHP variable - if(isset($GLOBALS[$this->variable])) { - return (string)$GLOBALS[$this->variable]; - } else if(isset($_SESSION[$this->variable])) { - return (string)$_SESSION[$this->variable]; - } else if(isset($_REQUEST[$this->variable])) { - return (string)$_REQUEST[$this->variable]; - } - } else { - return "[$this->name]"; - } - } - function code() { - if(isset($this->variable)) { - return '[$' . addcslashes($this->variable,"\0..\37[]$\\") . ']'; - } else { - return '[' . addcslashes($this->name,"\0..\37[]$\\") . ']'; - } - } - function html() { - return htmlentities($this->text()); - } - function uri() { - return urlencode($this->text()); - } -} - -class WikipluginDBReportString { - var $literal; - function WikipluginDBReportString($text) { - $this->literal = stripcslashes($text); - } - function text() { - return $this->literal; - } - function code() { - return addcslashes($this->literal,"\0..\37[]\\"); - } - function html() { - return htmlentities($this->text()); - } - function uri() { - return $this->text(); - } -} - -class WikipluginDBReportContent { - var $elements; - function parse_text(&$text) { - $parse_state = 0; - $parse_text = ''; - $pos = 0; - $len = strlen($text); - while($pos < $len) { - $char = $text[$pos++]; - switch($parse_state) { - case 0: // start of next token - switch($char) { - case '[': - $parse_state = 3; - break; - case '\\': - $parse_state = 2; - $parse_text .= $char; - break; - default: - $parse_state = 1; - $parse_text .= $char; - } - break; - case 1: // text string - switch($char) { - case '[': - $this->elements[] =& new WikipluginDBReportString($parse_text); - $parse_text = ''; - $parse_state = 3; - break; - case '\\': - $parse_state = 2; - $parse_text .= $char; - break; - default: - $parse_text .= $char; - } - break; - case 2: // literal escape - $parse_text .= $char; - $parse_state = 1; - break; - case 3: // field text - switch($char) { - case '[': - break; - case ']': - $this->elements[] =& new WikipluginDBReportField($parse_text); - $parse_text = ''; - $parse_state = 0; - break; - case '\\': - $parse_state = 4; - $parse_text .= $char; - break; - default: - $parse_text .= $char; - } - break; - case 4: // field escape - $parse_text .= $char; - $parse_state = 3; - break; - } - } - // hanging text is parsed as a string - if($parse_state!=0) { - $this->elements[] =& new WikipluginDBReportString($parse_text); - } - } - function append_field($name) { - $this->elements[] =& new WikipluginDBReportField($name); - } - function append_variable($name) { - $this->elements[] =& new WikipluginDBReportField('$'.$name); - } - function append_string($text) { - $this->elements[] =& new WikipluginDBReportString($text); - } - function append($text) { - $this->parse_text($text); - } - function WikipluginDBReportContent(&$token) { - switch($token->type) { - case 'txt': - $this->parse_text($token->content); - break; - case 'fld': - $this->append_field($token->content); - break; - case 'var': - $this->append_variable($token->content); - break; - } - } - function text() { - $result = ''; - if(isset($this->elements)) foreach($this->elements as $element) $result .= $element->text(); - return $result; - } - function code() { - $result = ''; - if(isset($this->elements)) foreach($this->elements as $element) $result .= $element->code(); - return $result; - } - function html() { - $result = ''; - if(isset($this->elements)) foreach($this->elements as $element) $result .= $element->html(); - return $result; - } - function uri() { - $result = ''; - if(isset($this->elements)) foreach($this->elements as $element) $result .= $element->uri(); - return $result; - } -} - -class WikipluginDBReportText extends WikipluginDBReportContent { - var $link; - var $style; - function code() { - $result = '"' . addcslashes(parent::code(),'"') . '"'; - if(isset($this->style)) $result .= $this->style->code(); - if(isset($this->link)) $result .= ' '.$this->link->code(); - return $result; - } - function html() { - $html = parent::html(); - if(isset($this->style)) { - $html = $this->style->html_start() . $html . $this->style->html_end(); - } - if(isset($this->link)) { - $html = $this->link->html_start() . $html . $this->link->html_end(); - } - return $html; - } -} - -class WikipluginDBReportStyle { - var $tag; - var $class; - var $style; - function WikipluginDBReportStyle(&$token) { - if(is_object($token)) { - if( isset($token->content['class']) ) { - $subtoken =& $token->content['class']; - $this->class =& new WikipluginDBReportContent($subtoken); - } - if( isset($token->content['style']) ) { - $subtoken =& $token->content['style']; - $this->style =& new WikipluginDBReportContent($subtoken); - } - } else if(is_string($token)) { - $subtoken =& new WikipluginDBReportToken($token); - $subtoken->type = 'txt'; - $this->class =& new WikipluginDBReportContent($subtoken); - } - } - function code() { - $code = ':'; - if(isset($this->class)) { - $code .= addcslashes($this->class->code(),' '); - } else if($this->tag!='span') { - $code .= $this->tag; - } - // if(isset($this->class)) $code .= $this->class->code(); - if(isset($this->style)) $code .= "{" . $this->style->code() . "}"; - return $code; - } - function attributes() { - $html = ''; - if(isset($this->class)) $html .= ' class="' . $this->class->html() . '"'; - if(isset($this->style)) $html .= ' style="' . $this->style->html() . '"'; - return $html; - } - function html_start() { - if(isset($this->class)) { - $class = $this->class->html(); - switch(strtolower($class)) { - case 'u': - case 'b': - case 'i': - case 'h1': - case 'h2': - case 'h3': - case 'h4': - case 'h5': - case 'h6': - $this->tag = $class; - $html = '<' . $class; - break; - default: - $this->tag = 'span'; - $html = '<span class="' . $class . '"'; - } - } else { - $this->tag = 'span'; - $html = '<span'; - } - if(isset($this->style)) $html .= ' style="' . $this->style->html() . '"'; - $html .= '>'; - return $html; - } - function html_end() { - return '</'.$this->tag.'>'; - } -} - -class WikipluginDBReportLink { - var $style; - var $contents; - function code() { - $result = '<'; - if(isset($this->contents)) foreach($this->contents as $content) { - if(is_a($content,'WikipluginDBReportContent')) { - $result .= '"'.$content->code().'"'; - } else if(is_a($content,'WikipluginDBReportField')) { - $result .= $content->code(); - } - } - if(isset($this->style)) $result .= $this->style->code(); - $result .= '>'; - return $result; - } - function uri() { - $uri = ''; - if(isset($this->contents)) foreach($this->contents as $content) { - if(is_a($content,'WikipluginDBReportContent')) { - $uri .= $content->html(); - } else if(is_a($content,'WikipluginDBReportField')) { - $uri .= $content->uri(); - } - } - return $uri; - } - function html_start() { - $html = '<a href="' . $this->uri() . '"'; - if($this->style) $html .= $this->style->attributes(); - $html .= '>'; - return $html; - } - function html_end() { - return '</a>'; - } - function html_onclick() { - return 'onclick="document.location.href="' . $this->uri() . '""'; - } -} - -class WikipluginDBReportCell { - var $link; - var $style; - var $colspan; - var $rowspan; - var $contents; - function code($mode) { - $result = 'CELL'; - if(isset($this->colspan) && isset($this->rowspan)) { - if($this->rowspan!=1) $result .= ' ROWSPAN '.$this->rowspan; - if($this->colspan!=1) $result .= ' COLSPAN '.$this->colspan; - } else if(isset($this->colspan)) { - if($this->colspan!=1) if($mode=='ROW') { - $result .= ' SPAN '.$this->colspan; - } else { - $result .= ' COLSPAN '.$this->colspan; - } - } else if(isset($this->rowspan)) { - if($this->rowspan!=1) if($mode=='ROW') { - $result .= ' ROWSPAN '.$this->rowspan; - } else { - $result .= ' SPAN '.$this->rowspan; - } - } - if(isset($this->style)) $result .= ' ' . $this->style->code(); - if(isset($this->link)) $result .= ' ' . $this->link->code(); - if(isset($this->contents)) foreach($this->contents as $content) $result .= ' '.$content->code(); - return $result; - } - function html($heading=false) { - if($heading) { - $html = '<th'; - } else { - $html = '<td'; - } - if(isset($this->style)) $html .= $this->style->attributes(); - if(isset($this->rowspan)) $html .= ' rowspan="' . $this->rowspan . '"'; - if(isset($this->colspan)) $html .= ' colspan="' . $this->colspan . '"'; - if(isset($this->link)) $html .= ' ' . $this->link->html_onclick(); - $html .= '>'; - if(isset($this->contents)) foreach($this->contents as $content) $html .= $content->html(); - $html .= '</td>'; - return $html; - } -} - -class WikipluginDBReportLine { - var $link; - var $styles; - var $cells; - function code($indent='',$rtype='ROW',$cellmode='ROW') { - $result = $indent.$rtype; - if(isset($this->styles)) foreach($this->styles as $style) $result .= ' '.$style->code(); - if(isset($this->link)) $result .= ' '.$this->link->code(); - $result .= "\n"; - foreach($this->cells as $cell) $result .= $indent.' '.$cell->code($cellmode)."\n"; - return $result; - } - function row_html($data,$style,$heading=false) { - // set the global report row - global $wikiplugin_dbreport_record; - $wikiplugin_dbreport_record = $data; - // generate HTML - $html = '<tr'; - if(isset($style)) $html .= $style->attributes(); - if(isset($this->link)) $html .= ' ' . $this->link->html_onclick(); - $html .= '>'; - foreach($this->cells as $cell) $html .= $cell->html($heading); - $html .= '</tr>' . "\n"; - return $html; - } -} - -class WikipluginDBReportTable { - var $style; - var $headers; - var $rows; - var $footers; - var $style_index; - function code($indent='') { - $result = $indent.'TABLE'; - if(isset($this->style)) $result .= ' '.$this->style->code(); - $result .= "\n"; - if(isset($this->headers)) foreach($this->headers as $line) { - $result .= $line->code($indent.' ','HEADER'); - } - if(isset($this->rows)) foreach($this->rows as $line) { - $result .= $line->code($indent.' ','ROW'); - } - if(isset($this->footers)) foreach($this->footers as $line) { - $result .= $line->code($indent.' ','FOOTER'); - } - return $result; - } - function line_row_html($list,$data,$heading=false) { - $html = ''; - foreach($list as $line) { - $style = null; - if(isset($line->styles)) { - $style_count = count($line->styles); - $style = $line->styles[$this->style_index % $style_count]; - } - $html .= $line->row_html($data,$style,$heading); - } - return $html; - } - function header_row_html($data) { - $html = ''; - // generate a new table - if(isset($this->style)) { - $html .= '<table' . $this->style->attributes() . '>' . "\n"; - } else { - $html .= '<table>' . "\n"; - } - // write headers - $style_index = 0; - if(isset($this->headers)) $html .= $this->line_row_html($this->headers,$data,true); - return $html; - } - function record_row_html($data) { - $html = ''; - if(isset($this->rows)) $html .= $this->line_row_html($this->rows,$data); - $this->style_index++; - return $html; - } - function footer_row_html($data) { - $html = ''; - // write footers - $this->style_index = 0; - if(isset($this->footers)) $html .= $this->line_row_html($this->footers,$data,true); - // close the table - $html .= '</table>'; - return $html; - } -} - -class WikipluginDBReportGroup { - var $link; - var $style; - var $fields; - var $field_count; - var $contents; - function __toString() { - $result = ''; - foreach($this->contents as $entry) $result .= $entry; - return $result; - } - function code($indent='') { - $result = $indent.'GROUP'; - if(isset($this->style)) $result .= ' '.$this->style->code(); - if(isset($this->fields)) foreach($this->fields as $field) $result .= ' '.$field->code(); - if(isset($this->link)) $result .= ' '.$this->link->code(); - if(isset($this->contents)) foreach($this->contents as $content) $result .= ' '.$content->code(); - $result .= "\n"; - return $result; - } - function check_break(&$row) { - $ret = false; - // compare the field values against the break values - for($i=0; $i<$this->field_count; $i++) { - $field =& $this->fields[$i]; - $value =& $row[$field->index]; - if($value !== $field->break) { - $ret = true; - $field->break =& $value; - } - } - return $ret; - } - function start_html($row) { - global $wikiplugin_dbreport_record; - $wikiplugin_dbreport_record = $row; - $html = ''; - // generate a new <div> with the report content at the top - if(isset($this->style)) { - $html .= '<div' . $this->style->attributes() . '>' . "\n"; - } else { - $html .= '<div>' . "\n"; - } - if(isset($this->contents)) foreach($this->contents as $content) $html.= $content->html(); - return $html; - } - function end_html(&$row) { - $html = ''; - // close the <div> - $html .= '</div>'; - return $html; - } -} - -class WikipluginDBReportParameter extends WikipluginDBReportContent { - var $name; - function code($indent='') { - $result = $indent.'PARAM'; - // if(isset($this->name)) $result .= ' :'.$this->name; - if(isset($this->elements)) foreach($this->elements as $element) $result .= ' ' . $element->code(); - $result .= "\n"; - // $result .= ' "' . parent::code() . "\"\n"; - return $result; - } -} - -class WikipluginDBReportFail { - var $link; - var $style; - var $contents; - function code($mode) { - $result = 'FAIL'; - if(isset($this->style)) $result .= ' ' . $this->style->code(); - if(isset($this->link)) $result .= ' ' . $this->link->code(); - if(isset($this->contents)) foreach($this->contents as $content) $result .= ' '.$content->code(); - return $result; - } - function html($heading=false) { - $html = '<div'; - if(isset($this->style)) $html .= $this->style->attributes(); - if(isset($this->link)) $html .= ' ' . $this->link->html_onclick(); - $html .= '>'; - if(isset($this->contents)) foreach($this->contents as $content) $html .= $content->html(); - $html .= '</div>'; - return $html; - } -} - -class WikipluginDBReport { - var $sql; - var $params; - var $groups; - var $table; - var $columns; - var $fail; - function code($indent='') { - // write the report in cannonical form. - $result = $indent.'SQL {' . $this->sql . '}'."\n"; - if(isset($this->params)) foreach($this->params as $param) $result .= $param->code($indent.' '); - if(isset($this->groups)) foreach($this->groups as $group) $result .= $group->code($indent); - if(isset($this->table)) $result .= $this->table->code($indent); - if(isset($this->fail)) $result .= $this->fail->code($indent); - return $result; - } -} - -function wikiplugin_dbreport_parse_error(&$token, $msg) { - global $wikiplugin_dbreport_errors; - // find the line relating to the token in the code - $pos = 0; $line = 0; - $code =& $token->code; - $len = strlen($code); - while($pos<$len) { - // find the next line break - $line++; - $break = strpos($code,"\n",$pos); - if($break===false) $break = $len; - // was the token in this line? - if($token->start < $break) { - // format the line with the token highlighted - $err_line = '<i>line '.$line.'</i>: '; - $err_line .= substr($code,$pos,$token->start-$pos); - $err_line .= '<span style="font-weight:bold;color:DarkRed;">'.substr($code,$token->start,$token->after-$token->start).'</span>'; - if($token->after<$break) $err_line .= substr($code,$token->after,$break-$token->after); - $wikiplugin_dbreport_errors[] = $err_line; - $pos = $len; - } else { - // update position and loop - $pos = $break + 1; - } - } - // add the message to the errors - $wikiplugin_dbreport_errors[] = $msg; -} - -function wikiplugin_dbreport_next_token(&$code, $len, $pos) { - global $wikiplugin_dbreport_errors, $wikiplugin_dbreport_fields_allowed; - $whitespace = " \n\r\t\v\f"; - $tokenstop = " :<>[$\"\n\r\t\v\f"; - // create a token object to return - $token =& new WikipluginDBReportToken(); - $token->code =& $code; - // find the next non-whitespace character in the code - while( ($pos < $len) && (strpos($whitespace,$code[$pos])!==false) ) $pos++; - if( $pos >= $len ) { - $token->type = 'eof'; - $token->start = $len - 1; - $token->after = $pos; - return $token; - } - // what did we find? - switch($code[$pos]) { - case '[': - // field token - $token->start = $pos; - // parse to closing ']' - while( ($pos < $len) && ($code[$pos]!=']') ) { - if($code[$pos]=='\\') $pos++; - $pos++; - } - if($pos < $len) { - $token->after = ++$pos; - $token->type = 'fld'; - $token->content = substr($code, $token->start+1, $pos-$token->start-2); - return $token; - } else { - $token->after = ++$pos; - $token->type = 'eof'; - wikiplugin_dbreport_parse_error($token, "Unclosed Field. ] expected."); - return $token; - } - break; - case '{': - // brackets token - $token->type = 'bra'; - $token->start = $pos; - // parse until we find the closing bracket. - $pos++; - $state = 0; - while( ($pos < $len) && ($state<4) ) { - $c = $code[$pos++]; - switch($state) { - case 0: // normal content - switch($c) { - case '}': $state = 4; break; - case '`': $state = 1; $token->content .= $c; break; - case "'": $state = 2; $token->content .= $c; break; - case '"': $state = 3; $token->content .= $c; break; - default: $token->content .= $c; - } - break; - case 1: // backtick-quoted - switch($c) { - case '`': $state = 0; - default: $token->content .= $c; - } - break; - case 2: // single-quoted - switch($c) { - case '\\': $token->content .= $c . $code[$pos++]; break; - case '\'': $state = 0; - default: $token->content .= $c; - } - break; - case 3: // double-quoted - switch($c) { - case '\\': $token->content .= $c . $code[$pos++]; break; - case '"': $state = 0; - default: $token->content .= $c; - } - break; - } - } - $token->after = $pos; - switch($state) { - case 0: // unclosed brackets - wikiplugin_dbreport_parse_error($token, "Unclosed brackets. } expected"); - $token->type = 'eof'; - break; - case 1: // unclosed backtick-quoted content - wikiplugin_dbreport_parse_error($token, "Unclosed backtick-quoted content in brackets. ` then } expected"); - $token->type = 'eof'; - break; - case 2: // unclosed single-quoted content - wikiplugin_dbreport_parse_error($token, "Unclosed single-quoted content in brackets. ' then } expected"); - $token->type = 'eof'; - break; - case 3: // unclosed double-quoted content - wikiplugin_dbreport_parse_error($token, "Unclosed double-quoted content in brackets. \" then } expected"); - $token->type = 'eof'; - break; - } - return $token; - break; - case ':': - // style token - $token->type = 'sty'; - $token->start = $pos; - $token->content = array(); - // create content sub-tokens - $class =& new WikipluginDBReportToken(); - $class->code =& $code; - $class->type = 'txt'; - $class->start = $pos; - $style =& new WikipluginDBReportToken(); - $style->code =& $code; - $style->type = 'txt'; - // parse until we find the closing space. - $pos++; - $state = 0; - while( ($pos < $len) && ($state<6) ) { - $c = $code[$pos++]; - if($c=='\\') { - $c .= $code[$pos++]; - $tc = $c; - } else { - $tc = strpos($whitespace,$c)!==false ? ' ': $c; - } - switch($state) { - case 0: // class content - switch($tc) { - case '<': - case '>': - case '"': - case ' ': $state = 6; $class->after = $pos; break; - case '{': $state = 1; $class->after = $pos; $style->start = $pos-1; break; - case '[': $state = 2; - default: $class->content .= $c; - } - break; - case 1: // inline style content - switch($tc) { - case '}': $state = 6; $style->after = $pos; break; - case '[': $state = 3; $style->content .= $c; break; - case "'": $state = 4; $style->content .= $c; break; - case '"': $state = 5; $style->content .= $c; break; - default: $style->content .= $c; - } - break; - case 2: // class field - switch($tc) { - case ']': $state = 0; - default: $class->content .= $c; - } - break; - case 3: // inline style field - switch($tc) { - case ']': $state = 1; - default: $style->content .= $c; - } - break; - case 4: // single-quoted inline style - switch($tc) { - case '\'': $state = 1; - default: $style->content .= $c; - } - break; - case 5: // double-quoted inline style - switch($tc) { - case '"': $state = 1; - default: $style->content .= $c; - } - break; - } - } - switch($state) { - case 0: // end of file - $class->after = $pos; - break; - case 1: // inline style content - $style->after = $pos; - wikiplugin_dbreport_parse_error($style, "Unclosed style CSS. } expected"); - $token->type = 'eof'; - break; - case 2: // class field - $class->after = $pos; - wikiplugin_dbreport_parse_error($class, "Unclosed field in style class. ] expected"); - $token->type = 'eof'; - break; - case 3: // inline style field - $style->after = $pos; - wikiplugin_dbreport_parse_error($style, "Unclosed field in style CSS. ] then } expected"); - $token->type = 'eof'; - break; - case 4: // single-quoted inline style - $style->after = $pos; - wikiplugin_dbreport_parse_error($style, "Unclosed single-quoted content in style CSS. ' then } expected"); - $token->type = 'eof'; - break; - case 5: // double-quoted inline style - $style->after = $pos; - wikiplugin_dbreport_parse_error($style, "Unclosed double-quoted content in style CSS. \" then } expected"); - $token->type = 'eof'; - break; - } - if($class->content) $token->content['class'] = $class; - if($style->content) $token->content['style'] = $style; - $token->after = $pos; - return $token; - break; - case '$': - // variable token - $token->type = 'var'; - $token->start = $pos; - $pos++; - // parse to end of token - while( ($pos < $len) && (strpos($tokenstop,$code[$pos])===false) ) { - if($code[$pos]=='\\') $pos++; - $pos++; - } - $token->content = substr($code, $token->start+1, $pos-$token->start-1); - $token->after = $pos; - return $token; - break; - case '"': - // string token - $token->type = 'txt'; - $token->start = $pos; - $token->content = ''; - // parse until we find the closing quote. - $pos++; - while( $pos < $len ) { - // what is it? - $c = $code[$pos++]; - switch($c) { - case '"': - $token->after = $pos; - return $token; - break; - case '\\': - $token->content .= $c; - if( ($pos < $len) ) { - $c = $code[$pos++]; - $token->content .= $c; - } else { - wikiplugin_dbreport_parse_error($token, "Unclosed escaped string. \" expected."); - $token->type = 'eof'; - return $token; - } - break; - default: - $token->content .= $c; - break; - } - } - // didn't find closing quotes - $token->type = 'txt'; - wikiplugin_dbreport_parse_error($token, "Unterminated string. \" expected."); - $token->type = 'eof'; - return $token; - break; - case '<': - case '>': - // link keywords - $token->type = 'key'; - $token->content = $code[$pos]; - $token->start = $pos; - $token->after = ++$pos; - return $token; - break; - default: - // keyword token - $token->start = $pos; - // parse to end of token - while( ($pos < $len) && (strpos($tokenstop,$code[$pos])===false) ) $pos++; - $token->type = 'key'; - $token->content = substr($code, $token->start, $pos - $token->start); - $token->after = $pos; - return $token; - } -} - -function wikiplugin_dbreport_parse(&$code) { - global $debug, $wikiplugin_dbreport_fields_allowed; - // code properties - $len = strlen($code); - $pos = 0; - // FSM state - $parse_state = 0; - $parse_link_return = 0; - $parse_line_return = 0; - $parse_cell_return = 0; - $parse_object; - $parse_text; - $parse_line; - $parse_cell; - $span_mode; - $parse_report =& new WikipluginDBReport(); - // parse the code - while(true) { - // get the next token - $token = wikiplugin_dbreport_next_token($code, $len, $pos); - $pos = $token->after; - // repeat while we have an unconsumed token - while(isset($token)) { - $next_token = $token; - switch($parse_state) { - case 0: // next keyword - switch($token->type) { - case 'eof': - if(!isset($parse_report->sql)) return wikiplugin_dbreport_parse_error($token, "Unexpected End."); - return $parse_report; - break; - case 'key': - switch(strtoupper($token->content)) { - case 'SQL': - $parse_state = 1; // switch state - unset($next_token); // consume the token - $wikiplugin_dbreport_fields_allowed = false; // no fields in sql - break; - case 'PARAM': - // create the parameter object - $parse_object =& new WikipluginDBReportParameter($token); - $parse_report->params[] =& $parse_object; - $parse_state = 2; // switch state - unset($next_token); // consume the token - $wikiplugin_dbreport_fields_allowed = false; // no fields in sql params - break; - case 'GROUP': - // create the group object - $parse_object =& new WikipluginDBReportGroup(); - $parse_report->groups[] =& $parse_object; - $parse_state = 3; // switch state - unset($next_token); // consume the token - $wikiplugin_dbreport_fields_allowed = true; // we can now parse fields - break; - case 'TABLE': - // create the table object - $parse_object =& new WikipluginDBReportTable(); - $parse_report->table =& $parse_object; - $parse_state = 4; // switch state - unset($next_token); // consume the token - $wikiplugin_dbreport_fields_allowed = true; // we can now parse fields - break; - case 'FAIL': - // create the fail object - $parse_object =& new WikipluginDBReportFail(); - $parse_report->fail =& $parse_object; - $parse_state = 10; // switch state - unset($next_token); // consume the token - $wikiplugin_dbreport_fields_allowed = false; // no fields in fail message - break; - default: - return wikiplugin_dbreport_parse_error($token, "Invalid keyword '$token->content'"); - } - break; - default: - return wikiplugin_dbreport_parse_error($token, "Unexpected ".$token->type." '".$token->content."' at ".$token->start); - } - break; - case 1: // SQL content - switch($token->type) { - case 'eof': - $parse_state = 0; // switch state and reparse the token - break; - case 'bra': - $parse_report->sql .= $token->content; - unset($next_token); // consume the token - break; - case 'txt': - $parse_report->sql .= stripcslashes($token->content); - unset($next_token); // consume the token - break; - case 'key': - $parse_state = 0; // switch state and reparse the token - break; - default: - return wikiplugin_dbreport_parse_error($token, "Unexpected " . $token->type_name() . " '$token->content' after 'SQL'. String expected."); - } - break; - case 2: // PARAM content - switch($token->type) { - case 'eof': - $parse_state = 0; // switch parse state - break; - /* case 'sty': - $parse_object->name = $token->content; - unset($next_token); // consume the token - break; */ - case 'fld': - $parse_object->append_field($token->content); - unset($next_token); // consume the token - break; - case 'var': - $parse_object->append_variable($token->content); - unset($next_token); // consume the token - break; - case 'txt': - $parse_object->elements[] =& new WikipluginDBReportText($token); - unset($next_token); // consume the token - break; - case 'key': - unset($parse_object); - $parse_state = 0; // switch state and reparse the token - break; - default: - return wikiplugin_dbreport_parse_error($token, "Unexpected " . $token->type_name() . " '$token->content' after 'PARAM'. Name, Field, String or Variable expected."); - } - break; - case 3: // GROUP content - switch($token->type) { - case 'eof': - $parse_state = 0; // switch state and reparse the token - break; - case 'fld': - $parse_object->fields[] =& new WikipluginDBReportField($token->content); - $parse_object->field_count++; - unset($next_token); // consume the token - break; - case 'txt': - case 'var': - $parse_text =& new WikipluginDBReportText($token); - $parse_object->contents[] =& $parse_text; - $parse_text_return = $parse_state; // return to this state - $parse_state = 9; // switch state - unset($next_token); // consume the token - break; - case 'sty': - $parse_object->style =& new WikipluginDBReportStyle($token); - unset($next_token); // consume the token - break; - case 'key': - switch(strtoupper($token->content)) { - case '<': - $parse_link =& new WikipluginDBReportLink($token); // create the link object - $parse_object->link =& $parse_link; - $parse_link_return = $parse_state; // return to this state - $parse_state = 5; // switch state - unset($next_token); // consume the token - break; - default: - unset($parse_object); // we are finished parsing the group - $wikiplugin_dbreport_fields_allowed = false; // we cannot parse fields anymore - $parse_state = 0; // switch state and reparse the token - break; - } - break; - default: - return wikiplugin_dbreport_parse_error($token, "Unexpected " . $token->type_name() . " '$token->content' after '<'. Field, String or Style expected."); - } - break; - case 4: // TABLE content - switch($token->type) { - case 'eof': - $parse_state = 0; // switch state and reparse the token - break; - case 'sty': - $parse_object->style =& new WikipluginDBReportStyle($token); - unset($next_token); // consume the token - break; - case 'key': - switch(strtoupper($token->content)) { - case 'HEADER': - $parse_line =& new WikipluginDBReportLine(); - $parse_object->headers[] =& $parse_line; - $parse_line_return = $parse_state; // return to this state - $parse_state = 6; // switch state - unset($next_token); // consume the token - break; - case 'FOOTER': - $parse_line =& new WikipluginDBReportLine(); - $parse_object->footers[] =& $parse_line; - $parse_line_return = $parse_state; // return to this state - $parse_state = 6; // switch state - unset($next_token); // consume the token - break; - case 'ROW': - case 'ROWS': - $parse_line =& new WikipluginDBReportLine(); - $parse_object->rows[] =& $parse_line; - $parse_line_return = $parse_state; // return to this state - $parse_state = 6; // switch state - unset($next_token); // consume the token - break; - default: - unset($parse_object); // we are finished parsing the table - $wikiplugin_dbreport_fields_allowed = false; // we cannot parse fields anymore - $parse_state = 0; // switch state and reparse the token - } - break; - default: - return wikiplugin_dbreport_parse_error($token, "Unexpected " . $token->type_name() . " '$token->content' after 'TABLE'. HEADER, FOOTER, ROWS, <, or Style expected."); - } - break; - case 5: // Link content - switch($token->type) { - case 'eof': - return wikiplugin_dbreport_parse_error($token, "Unexpected EOF in WikipluginDBReportLink. '>' expected."); - break; - case 'var': - case 'fld': - $parse_link->contents[] =& new WikipluginDBReportField($token->content); - unset($next_token); // consume the token - break; - case 'txt': - $parse_link->contents[] =& new WikipluginDBReportContent($token); - unset($next_token); // consume the token - break; - /* - case 'txt': - $parse_link->append($token->content); - unset($next_token); // consume the token - break; - case 'var': - $parse_link->append_variable($token->content); - unset($next_token); // consume the token - break; - case 'fld': - $parse_link->append_field($token->content); - unset($next_token); // consume the token - break; - */ - case 'sty': - $parse_link->style =& new WikipluginDBReportStyle($token); - unset($next_token); // consume the token - break; - case 'key': - switch(strtoupper($token->content)) { - case '<': - return wikiplugin_dbreport_parse_error($token, "Unexpected '<' in Link. '>' expected."); - case '>': - unset($next_token); // consume the token - $parse_state = $parse_link_return; // return to previous state - break; - default: - return wikiplugin_dbreport_parse_error($token, "Unexpected Keyword '$token->content' in Link. '>' expected."); - } - default: - $parse_state = $parse_link_return; // switch state and reparse the token - } - break; - case 6: // HEADER, FOOTER, ROW content - switch($token->type) { - case 'eof': - $parse_state = $parse_line_return; // switch state and reparse the token - break; - case 'sty': - $parse_line->styles[] =& new WikipluginDBReportStyle($token); - unset($next_token); // consume the token - break; - case 'key': - switch(strtoupper($token->content)) { - case 'CELL': - $parse_cell =& new WikipluginDBReportCell(); - $parse_line->cells[] =& $parse_cell; - $parse_cell_return = $parse_state; // return to this state - $parse_state = 7; // switch state - unset($next_token); // consume the token - break; - case '<': - $parse_link =& new WikipluginDBReportLink($token); // create the link object - $parse_line->link =& $parse_link; - $parse_link_return = $parse_state; // return to this state - $parse_state = 5; // switch state - unset($next_token); // consume the token - break; - case 'HEADER': - case 'ROW': - case 'FOOTER': - case 'FAIL': - $parse_state = $parse_line_return; - break; - default: - return wikiplugin_dbreport_parse_error($token, "Invalid keyword '$token->content' after row. CELL or Link expected."); - } - break; - default: - return wikiplugin_dbreport_parse_error($token, "Unexpected " . $token->type_name() . " '$token->content' in row."); - } - break; - case 7: // CELL content - switch($token->type) { - case 'eof': - $parse_state = $parse_cell_return; // switch state and reparse the token - break; - case 'fld': - case 'var': - case 'txt': - $parse_text =& new WikipluginDBReportText($token); - $parse_cell->contents[] =& $parse_text; - $parse_text_return = $parse_state; // return to this state - $parse_state = 9; // switch state - unset($next_token); // consume the token - break; - case 'sty': - $parse_cell->style =& new WikipluginDBReportStyle($token); - unset($next_token); // consume the token - break; - case 'key': - switch(strtoupper($token->content)) { - case '<': - $parse_link =& new WikipluginDBReportLink($token); // create the link object - $parse_cell->link =& $parse_link; - $parse_link_return = $parse_state; // return to this state - $parse_state = 5; // switch state - unset($next_token); // consume the token - break; - case 'SPAN': - $span_mode = 'COL'; - $parse_state = 8; // switch state - unset($next_token); // consume the token - break; - case 'COLSPAN': - $span_mode = 'COL'; - $parse_state = 8; // switch state - unset($next_token); // consume the token - break; - case 'ROWSPAN': - $span_mode = 'ROW'; - $parse_state = 8; // switch state - unset($next_token); // consume the token - break; - case 'CELL': - case 'HEADER': - case 'ROW': - case 'COLUMN': - case 'FOOTER': - case 'FAIL': - $parse_state = $parse_cell_return; // switch state and reparse the token - break; - default: - return wikiplugin_dbreport_parse_error($token, "Invalid keyword '$token->content' in 'CELL'. Field, String, Style or Link expected."); - } - break; - default: - return wikiplugin_dbreport_parse_error($token, "Unexpected " . $token->type_name() . " '$token->content' after 'CELL'."); - } - break; - case 8: // SPAN content - switch($token->type) { - case 'key': - // try to parse the keyword as as number - $span = (int)$token->content; - if((string)$span == $token->content) { - if($span_mode=='ROW') { - $parse_cell->rowspan = $span; - } else { - $parse_cell->colspan = $span; - } - unset($next_token); // consume the token - } - $parse_state = 7; // switch state (and possibly reparse the token) - break; - default: - $parse_state = 7; // switch state and reparse the token - } - break; - case 9: // Text content - switch($token->type) { - case 'sty': - $parse_text->style =& new WikipluginDBReportStyle($token); - unset($next_token); // consume the token - break; - case 'key': - switch(strtoupper($token->content)) { - case '<': - $parse_link =& new WikipluginDBReportLink($token); // create the link object - $parse_text->link =& $parse_link; - $parse_link_return = $parse_state; // return to this state - $parse_state = 5; // switch state - unset($next_token); // consume the token - break; - default: - $parse_state = $parse_text_return; // return to the previous state - break; - } - break; - default: - $parse_state = $parse_text_return; // return to the previous state - break; - } - break; - case 10: // Fail content - switch($token->type) { - case 'eof': - $parse_state = 0; // switch state and reparse the token - break; - case 'var': - case 'txt': - $parse_text =& new WikipluginDBReportText($token); - $parse_object->contents[] =& $parse_text; - $parse_text_return = $parse_state; // return to this state - $parse_state = 9; // switch state - unset($next_token); // consume the token - break; - case 'sty': - $parse_object->style =& new WikipluginDBReportStyle($token); - unset($next_token); // consume the token - break; - case 'key': - switch(strtoupper($token->content)) { - case '<': - $parse_link =& new WikipluginDBReportLink($token); // create the link object - $parse_object->link =& $parse_link; - $parse_link_return = $parse_state; // return to this state - $parse_state = 5; // switch state - unset($next_token); // consume the token - break; - default: - unset($parse_object); // we are finished parsing the fail - $parse_state = 0; // switch state and reparse the token - break; - } - break; - default: - return wikiplugin_dbreport_parse_error($token, "Unexpected " . $token->type_name() . " '$token->content' after 'FAIL'."); - } - break; - default: - $parse_state = 0; - } - $token = isset($next_token) ? $next_token : NULL; - } - } -} - -function wikiplugin_dbreport_error_box($error) { - $return = '~np~<table style="border-width:1px; border-style:dashed; border-color:red; background:#FFE0E0;"><tr><td>'; - switch(gettype($error)) { - case 'array': - foreach($error as $entry) $return .= $entry.'<br/>'; - break; - case 'string': - case 'object': - $return .= (string)$error; - break; - default: - $return .= gettype($error).' ERROR!'; - } - $return .= '</td></tr></table>~/np~'; - return $return; -} - -function wikiplugin_dbreport_message_box($msg) { - $return = '<table style="border-width:1px; border-style:dashed; border-color:silver; background:#E0E0FF;"><tr><td>'; - switch(gettype($error)) { - case 'array': - foreach($msg as $entry) $return .= $entry.'<br/>'; - break; - default: - $return .= (string)$msg; - } - $return .= '</td></tr></table>'; - return $return; -} - -function data_dbreport_csv_wrap( $item ) { - // In addition to wrap processing, this function could escape code, or modify dates - // is_numberic values could be left unwrapped - // trim white space created by some database fields - return '"'.trim($item).'"'; -} - -function data_dbreport_help() { - $help = - '<table class="data help">' - .'<tr>' - .'<th>'.tra( "Key" ).'</th>' - .'<th>'.tra( "Type" ).'</th>' - .'<th>'.tra( "Comments" ).'</th>' - .'</tr>' - .'<tr class="odd">' - .'<td>dsn</td>' - .'<td>'.tra( "string").'<br />'.tra( "(required)" ).'</td>' - .'<td>'.tra( "A full DSN (Data Source Name) connection string. eg: mysql://user:pass@server/database" ).'</td>' - .'</tr>' - .'<tr class="even">' - .'<td>title</td>' - .'<td>'.tra( "string").'<br />'.tra( "(required)" ).'</td>' - .'<td>'.tra( "The name of a DSN connection defined by the administrator.").'</td>' - .'</tr>' - .'<tr class="odd">' - .'<td>wiki</td>' - .'<td>'.tra( "numeric").'<br />'.tra( "(optional)" ).'</td>' - .'<td>'.tra( "0|1, parse wiki syntax within the report.").' '.tra( "Default").': 1</td>' - .'</tr>' - .'<tr class="even">' - .'<td>debug</td>' - .'<td>'.tra( "numeric").'<br />'.tra( "(optional)" ).'</td>' - .'<td>'.tra( "0|1, display the parsed report definition for test purposes.").' '.tra( "Default").': 0</td>' - .'</tr>' - .'<tr class="odd">' - .'<td>csv</td>' - .'<td>'.tra( "numeric").'<br />'.tra( "(optional)" ).'</td>' - .'<td>'.tra( "0|1, generate a csv copy of the data for external download.").' '.tra( "Default").': 0</td>' - .'</tr>' - .'</table>' - .tra( "Example: " )."{dbreport dsn=fully qualified dsn}SQL {SELECT * FROM DEMO } {/dbreport}"; - return $help; -} - -function wikiplugin_dbreport($data, $params) { - // TikiWiki globals - global $tikilib, $user, $group, $page, $prefs; - // wikiplugin_dbreport globals - global $wikiplugin_dbreport_errors; - global $wikiplugin_dbreport_fields; - global $wikiplugin_dbreport_fields_allowed; - global $wikiplugin_dbreport_record; - // initialize globals - $wikiplugin_dbreport_errors = array(); - $wikiplugin_dbreport_fields = array(); - $wikiplugin_dbreport_fields_allowed = false; - $wikiplugin_dbreport_record = null; - - $ret = ''; - // extract parameters - extract ($params,EXTR_SKIP); - if ( !isset($wiki) ) $wiki = true; - if ( !isset($debug) ) $debug = false; - if ( !isset($csv) ) $csv = false; - // debug plugin input - if( isset($debug_input) ) { - $msg = $_REQUEST['preview'] . ' ' . $_SESSION['s_prefs']['tiki_release'] . '<br/>'; - $msg .= '~np~<pre>'.htmlspecialchars($data).'</pre>~/np~'; - $ret .= wikiplugin_dbreport_message_box($msg); - } - // we need a dsn or db parameter - if (!isset($dsn) && !isset($db)) { - return tra('Missing db or dsn parameter'); - } - // parse the report definition -// $parse_fix = ($_REQUEST['preview']); -// if($parse_fix) { - $report =& wikiplugin_dbreport_parse($data); -// } else { -// $report =& wikiplugin_dbreport_parse(html_entity_decode($data)); -// } - // were there errors? - if($wikiplugin_dbreport_errors) { - $ret .= wikiplugin_dbreport_error_box($wikiplugin_dbreport_errors); - return $ret; - } - // create the bind variables array - $bindvars = array(); - if(isset($report->params)) foreach($report->params as $param) { - if(isset($param->name)) { - $bindvars[$param->name] = $param->text(); - } else { - $bindvars[] = $param->text(); - } - } - // translate db name into dsn -//TODO - convert to bw permissions - if (isset($db)) { - $perm_name = 'tiki_p_dsn_' . $db; - global $$perm_name; - // check permissions - if ($$perm_name != 'y') { - return (tra('You do not have permission to use this DSN')); - } - // retrieve the dsn string - $dsn = $tikilib->get_dsn_by_name($db); - } - - // open the database - if (isset($dsn)) { - // open database dsn connection - $ado =& ADONewConnection($dsn); - if (!$ado) { - $ret .= wikiplugin_dbreport_error_box($ado->ErrorMsg()); - return $ret; - } else { - // execute sql query - $ado->SetFetchMode(ADODB_FETCH_NUM); - $query =& $ado->Execute($report->sql, $bindvars); - if (!$query) { - $ret .= wikiplugin_dbreport_error_box($ado->ErrorMsg()); - return $ret; - } - } - } else { - return (tra('No DSN connection string found!')); - } - - if($csv) { - // Temporary file for the moment - need to expand to proper file names for archiving - $csv_file = STORAGE_PKG_PATH.'export/EXPORT_REPORT.csv'; - $file = fopen( $csv_file, 'w' ); // erase text data if it exists!! - $fp = fopen( $csv_file, "a+" ); - $fields_enclosed_by = '"'; - $fields_seperated_by = ','; - $column_data = ''; - } - - // create an array of field names and their index - $field_index = array(); - $field_count = $query->FieldCount(); - for($index = 0; $index<$field_count; $index++) { - $column =& $query->FetchField($index); - $field_index[$column->name] = $index; - if ($csv) { - if ($index == "0") { - $column_data = $fields_enclosed_by.$column->name.$fields_enclosed_by;} else {$column_data = $column_data.$fields_seperated_by.$fields_enclosed_by.$column->name.$fields_enclosed_by; - } - } - } - // go through the parsed fields and assign indexes - foreach($wikiplugin_dbreport_fields as $key => $value) { - $parse_field =& $wikiplugin_dbreport_fields[$key]; - $index = $field_index[$parse_field->name]; - if(isset($index)) { - $parse_field->index = $index; - } else { - // not a valid field. log the message. - $ret .= wikiplugin_dbreport_error_box("The Field '$parse_field->name' was not returned by the SQL query."); - return $ret; - } - } - if($csv) { - fwrite($fp,""."$column_data\n"); - } - - // does the report have a table definition? - if(!isset($report->table)) { - // create a default definition from the data - $report->table = new WikipluginDBReportTable(); - $style = 'sortable'; - $report->table->style =& new WikipluginDBReportStyle($style); - $header =& new WikipluginDBReportLine(); - $style = 'heading'; - $header->styles[] =& new WikipluginDBReportStyle($style); - $report->table->headers[] =& $header; - $row =& new WikipluginDBReportLine(); - $style = 'even'; - $row->styles[] =& new WikipluginDBReportStyle($style); - $style = 'odd'; - $row->styles[] =& new WikipluginDBReportStyle($style); - $report->table->rows[] =& $row; - // fill in the cells - $field_count = $query->FieldCount(); - for($index = 0; $index<$field_count; $index++) { - // get the query field - $column =& $query->FetchField($index); - // create the header cell - $text =& new WikipluginDBReportText(new WikipluginDBReportToken()); - $text->append_string($column->name); - $cell =& new WikipluginDBReportCell(); - // $style = 'heading'; - // $cell->style =& new WikipluginDBReportStyle($style); - $cell->contents[] =& $text; - $header->cells[] =& $cell; - // create the rows cell - $cell =& new WikipluginDBReportCell(); - $field =& new WikipluginDBReportField($column->name); - $field->index = $index; - $cell->contents[] =& $field; - $row->cells[] =& $cell; - } - } - // are we debugging? - if($debug) $ret .= wikiplugin_dbreport_message_box("~np~<pre>".htmlspecialchars($report->code())."</pre>~/np~"); - - // generate the report - if(!$wiki) $ret .= '~np~'; - if(!$query->EOF) { - // get the first row - $current_row = $query->FetchRow(); - // start the group breaks - if (isset($report->groups)) { - foreach($report->groups as $group) { - $group->check_break($current_row); - $ret .= $group->start_html($current_row); - } - } - // first row is always considered 'after a break' - $breaking = true; - // go through the rows - while ($current_row) { - // do we generate a table header? - if($breaking) $ret .= $report->table->header_row_html($current_row); - // write the table row - $ret .= $report->table->record_row_html($current_row); - // get the next row - if($query->EOF) { - unset($next_row); - $breaking = true; - } else { - $next_row = $query->FetchRow(); - $breaking = false; - } - // Output data as a csv line - if( $csv ) { - $csv_line = ''; - foreach( $current_row as $value ) { - $csv_line .= data_dbreport_csv_wrap( $value ).$fields_seperated_by; - } - fwrite($fp, $csv_line."\n"); - } - $break_end = ''; - $break_start = ''; - // check group breaks - if (isset($report->groups)) { - foreach($report->groups as $group) { - if(isset($next_row)) $breaking = ($group->check_break($next_row) || $breaking); - if($breaking) { - $break_end = $group->end_html($current_row) . $break_end; - if(isset($next_row)) $break_start .= $group->start_html($next_row); - } - } - } - if($breaking) { - $ret .= $report->table->footer_row_html($current_row); - $ret .= $break_end; - $ret .= $break_start; - } - // move to the next row - $current_row = isset($next_row) ? $next_row : NULL; - } - } else { - // no records returned. output the fail message - if($report->fail) $ret .= $report->fail->html(); - } - if(!$wiki) $ret .= '~/np~'; - // close the database connection - $query->Close(); - $ado->Close(); - if ( $csv ) { - // Add a buuton for downloading csv file - $ret .= '<br/ ><h3><a href="'.BIT_ROOT_URL.'/storage/export/EXPORT_REPORT.csv">Right click and save as a local file name!</a></h3>'; - } - // return the result - return $ret; -} - -?>
\ No newline at end of file |
