Browse Source

multiquery on reports

arnaud 14 years ago
parent
commit
0c63875a0d
2 changed files with 79 additions and 8 deletions
  1. 61 0
      main/reports/multiquery.lib.php
  2. 18 8
      main/reports/reports.php

+ 61 - 0
main/reports/multiquery.lib.php

@@ -0,0 +1,61 @@
+<?php
+
+// get fields informations
+function multiquery_query($array) {
+	$result = array();
+	$field = 0;
+	for ($i = 0; $i <sizeof($array); $i++) {
+		// mysql handler
+		$result[$i]['mysql'] = mysql_query($array[$i]);
+
+		if (! $result[$i]['mysql'])
+			die("error in query $i : ".$array[$i]);
+
+		// fields
+		$result[$i]['num_fields'] = mysql_num_fields($result[$i]['mysql']);
+		for ($j = 0; $j < $result[$i]['num_fields']; $i++) {
+			$name = mysql_field_name($result[$i]['mysql'], $j);
+			$result['field'][$field]['query']=$i;
+			$result['field'][$field]['name']=$name;
+			$result['field'][$field]['id']=$j;
+			$result['field_assoc'][$name][$field];
+			$field++;
+		}
+	}
+	$result['num_queries'] = sizeof($array);
+	// rows
+	$numberOfResult = mysql_num_rows($result[0]['mysql']);
+	for ($i = 1; $i <$result['num_queries']; $i++) 
+		if ($numberOfResult != mysql_num_rows($result[$i]['mysql']))
+			die("wrong number of row: $numberOfResult vs ".
+				mysql_num_rows($result[$i]['mysql'])." on query $i");
+
+	$result['num_rows'] = $numberOfResult;
+	$result['num_fields'] = $field;
+	return $result;
+}
+
+function multiquery_num_rows(&$mq_h) {
+	return $mq_h['num_rows'];
+}
+
+function multiquery_num_fields(&$mq_h) {
+	return $mq_h['num_fields'];
+}
+
+function multiquery_field_name(&$mq_h, $id) {
+	return $mq_h['field'][$id]['name'];
+}
+
+function multiquery_fetch_row(&$mq_h) {
+	$result = array();
+	$pos = 0;
+	for ($i = 0; $i < $mq_h['num_queries']; $i++) {
+		$row = mysql_fetch_row($mq_hi[$i]['mysql']);
+		for ($j = 0; $j < $row; $j++) {
+			$result[$pos] = $row[$j];
+			$pos++;
+		}
+	}
+	return $result;
+}

+ 18 - 8
main/reports/reports.php

@@ -15,6 +15,7 @@ $cidReset = true;
 // including files 
 require_once '../inc/global.inc.php';
 require_once 'reports.lib.php';
+require_once 'multiquery.lib.php';
 
 // protect script
 api_block_anonymous_users();
@@ -79,9 +80,19 @@ if ($_REQUEST['format'] == 'csv')  {
 
 if (is_array($reports_template[$_REQUEST['type']])) {
 	$query = $reports_template[$_REQUEST['type']]['getSQL']();
+	if (! is_array($query))
+		$query = array($query);
 	if ($_REQUEST['format'] == 'sql')
-		die($query);
-	$result = Database::query($query);
+		die(var_export($query, true));
+
+	$result = &multiquery_query($query);
+	
+
+	// check number of result
+	$numberOfResult = multiquery_num_rows($result);
+	if ($numberOfResult == 0) 
+		die(get_lang('NoDataAvailable'));
+	
 } else {
 	die('<b>'.get_lang('ErrorWhileBuildingReport').'</b>');
 }
@@ -93,15 +104,14 @@ if ($_REQUEST['format'] == 'html' || $_REQUEST['format'] == 'directlink') {
 			} );
 		</script>';
 	echo '<table id="reportsData" class="display">'; // FIXME style
-	$nfields = mysql_num_fields($result);
-	if (mysql_num_rows($result) == 0) {
-		die(get_lang('NoDataAvailable'));
-	}
+
+	// counting fields
+	$nfields = multiquery_num_fields($result);
 	$columns = array();	
 	$columns_islink = array();
 	echo '<thead><tr>';
 	for ($i=0; $i < $nfields; $i++)	{
-		$columns[$i] = mysql_field_name($result, $i);
+		$columns[$i] = multiquery_field_name($result, $i);
 		if (substr($columns[$i], -5, 5) != '_link') {
 			$column_islink[$i] = false;
 			echo '<th>'.$columns[$i].'</th>';
@@ -119,7 +129,7 @@ if ($_REQUEST['format'] == 'html' || $_REQUEST['format'] == 'directlink') {
 			$columns_link[$i] = '';
 	error_log("result1: ".$nfields);
 	echo '</tr></thead><tbody>';
-	while ($row = Database::fetch_row($result)) {
+	while ($row = multiquery_fetch_row($result)) {
 		echo '<tr>';
 		for ($i = 0; $i<$nfields; $i++)
 			if (!$columns_islink[$i]){ // ignore links