<?php
// (c) Copyright 2002-2010 by authors of the Tiki Wiki/CMS/Groupware Project
// 
// All Rights Reserved. See copyright.txt for details and a complete list of authors.
// Licensed under the GNU LESSER GENERAL PUBLIC LICENSE. See license.txt for details.
// $Id: wikiplugin_sql.php,v 1.3 2010/08/27 02:04:20 q732108 Exp $

function wikiplugin_sql_help() {
	return tra("Run a sql query").":<br />~np~{SQL(db=>dsnname, raw=>1|0, delim=>\",\")}".tra("sql query")."{SQL}~/np~";
}

function wikiplugin_sql_info() {
	return array(
		'name' => tra('SQL'),
		'documentation' => 'PluginSQL',
		'description' => tra('Run a sql query'),
		'prefs' => array( 'wikiplugin_sql' ),
		'body' => tra('sql query'),
		'validate' => 'all',
		'params' => array(
			'db' => array(
				'required' => true,
				'name' => tra('DNS Name'),
				'description' => tra('ADODB DNS')),
			'raw' => array(
				'required' => false,
				'name' => tra('Raw return'),
				'description' => tra('Return raw data with no headers')),
			'delim' => array(
				'required' => false,
				'name' => tra('Delim'),
				'description' => tra('The delimiter to be used between data elements when \"raw\" is used')),
			'noparse' => array(
				'required' => false,
				'name' => tra('Wiki Parse Flag'),
				'description' => tra('Turn wiki parsing of select results on and off'))
		)
	);
}

function wikiplugin_sql($data, $params) {

	global $tikilib;
	extract ($params,EXTR_SKIP);

	if (!isset($db)){
		return tra('Missing db param');
	}

	$perms = Perms::get( array( 'type' => 'dsn', 'object' => $db ) );
	if ( ! $perms->dsn_query ) {
		return tra('You do not have permission to use this feature');
	}

	$bindvars = array();
	$data = html_entity_decode($data);
	if ($nb = preg_match_all("/\?/", $data, $out)) {
		foreach($params as $key => $value) {
			if (ereg("^[0-9]*$", $key)) {
				if (strpos($value, "$") === 0) {
					$value = substr($value, 1);
					global $$value;
					$bindvars[$key] = $$value;
				}
				else {
					$bindvars[$key] = $value;
				}
			}
		}
		if (count($bindvars) != $nb) {
			return tra('Missing db param');
		}
	}		

	$ret = '';
	$sql_oke = true;
 	$dbmsg = '';

	if ($db = $tikilib->get_db_by_name( $db ) ) {
		$result = $db->query( $data, $bindvars );
	} else {
		return '~np~' . tra('Could not obtain valid DSN connection.') . '~/np~';
	}
	
	$first = true;
	$class = 'even';
	while ($result && $res = $result->fetchRow() ) {
		if ($first && !isset( $raw )) {
			$ret .= "<table class='normal'><thead><tr>";

			$first = false;

			foreach (array_keys($res)as $col) {
				$ret .= "<th>$col</th>";
			}

			$ret .= "</tr></thead>";
		}

//		$ret .= "<tr>";

		if ($class == 'even') {
			$class = 'odd';
		} else {
			$class = 'even';
		}
	
		foreach ($res as $name => $val) {
			$ret .= (isset($delim)) ? "$val$delim" :
                                (!isset($raw)) ? "<td class=\"$class\">$val</td>" : $val;
		}
		$ret .= (isset($raw)) ? "\n" : "<tr>";
	}

	if ($ret && !isset($raw)) {
		$ret .= "</table>";
	}
	if ($dbmsg) {
		$ret .= $dbmsg;
	}

	if ($noparse) {
		return '~np~' . $ret . '~/np~';
	}
	else
	{
		return $ret;
	}
} 
