A simple HTTP-based API
<?php
require_once 'globals.inc';
require_once 
'api/api_functions.php';

if (isset(
$func) && !empty($func)) {

    if (!
in_array($funcarray_keys($api))) {
        echo 
"Unknown function";
        exit;
    }

    
// include the appropriate function
    
require_once "{$api[$func]}";
    require_once 
"api/util_convert.php";

    
// SQL query wrapper function
    
function sql() {/*{{{*/
        
if (!$_REQUEST['query']) {
            echo 
"<b>ERROR: Missing parameters.</b>\n";
            return 
false;
        }
        
// allow only SELECT, SHOW or DESCRIBE queries
        
$allowed "^(select|show|describe)";
        if (!
eregi($allowedtrim($_REQUEST['query']))) {
            echo 
"<b>ERROR: Only 'SELECT', 'SHOW', or 'DESCRIBE' queries are allowed.</b>\n";
            return 
false;
        }
        
$result sqlquery(MDB_DATA_DSN$_REQUEST['query']);
        if (
is_object($result) && DB::isError($result)) {
            echo 
"<b>ERROR ".$result->getCode().": ".$result->getMessage()."</b>\n";
            return 
false;
        }
        
$format = isset($_REQUEST['format']) ? strtolower($_REQUEST['format']) : "csv";
        switch (
$format) {
            case 
"wddx" :
                
$out wddx_serialize_value($result);
                break;
            case 
"serialize" :
                
$out serialize($result);
                break;
            case 
"table" :
                
$out toTable($result);
                break;
            case 
"csv" :
            default :
                
$fields array_keys($result[0]);
                
$out toCSV($fields);
                for (
$i=0$i count($result); $i++) {
                    
$out .= toCSV(array_values($result[$i]));
                }
                break;
        }
        echo 
$out;
        return 
true;
    }
/*}}}*/
    
    // wrapper function to get PDB ids for a given metal
    
function metallopdb() {/*{{{*/
        
if (!$_REQUEST['metal']) {
            echo 
"<b>ERROR: Missing parameters.</b>\n";
            return 
false;
        }
        
$metal strtolower($_REQUEST['metal']);
        
$mode = isset($_REQUEST['mode']) ? strtolower($_REQUEST['mode']) : 'first';
        
$count = isset($_REQUEST['count']) ? intval($_REQUEST['count']) : 5;
        
$format = isset($_REQUEST['format']) ? strtolower($_REQUEST['format']) : 'csv';

        
$result getPDBFromMetal($metal$mode$count);
        if (
is_object($result) && DB::isError($result)) {
            echo 
"<b>ERROR ".$result->getCode().": ".$result->getMessage()."</b>\n";
            return 
false;
        }
        if (
$result == false) {
            echo 
"";
            return 
false;
        }
        switch (
$format) {
            case 
"wddx" :
                
header("Content-type: text/xml");
                echo 
wddx_serialize_value($result);
                break;
            case 
"serialize" :
                
header("Content-type: text/plain");
                echo 
serialize($result);
                break;
            case 
"rss" :
                
header("Content-type: text/xml");
                echo 
toRSS($result,$GLOBALS['server_remote']);
                break;
            case 
"csv" :
            default :
                
header("Content-type: text/plain");
                
$fields array_keys($result[0]);
                
$out toCSV($fields);
                for (
$i=0$i count($result); $i++) {
                    
$out .= toCSV(array_values($result[$i]));
                }
                echo 
$out;
                break;
        }
        return 
true;

    }
/*}}}*/

    // execute the api wrapper function
    
$output $func();

} else {
    
// show introspection

    
require_once "general.lib";
    function 
get_content_ts() {/*{{{*/
        
return -1;
    }
/*}}}*/

    
function get_content() {/*{{{*/
        
$content lib_content("__default");
        
$content['name'] = $_SERVER['PHP_SELF'];
        
$content['title'] = 'MDB - Web API (introspection)';
        
$content['page_title'] = 'MDB - Web API (introspection)';
        
$apidesc "<div align='center'>\n";
        
$apidesc .= "<table width='90%' border='0' cellpadding='5'>\n";
        foreach (
$GLOBALS['apidoc'] as $func=>$doc) {
            if (
$func == "get")
                continue;
            
$apidesc .= "<tr><td>\n";
            
$apidesc .= "<table border='0' width='100%' cellpadding='0' cellspacing='0'>\n";
            
$apidesc .= "<tr><td bgcolor='#000000'>\n";
            
$apidesc .= "<table border='0' width='100%' cellspacing='1' cellpadding='5'>\n";
            
$apidesc .= "<tr bgcolor='#eeeeee'>\n";
            
$apidesc .= "<th align='center'><i>Function</i>:<br /> $func</th>\n";
            
$apidesc .= "<th align='left'>\n<i>Parameters</i>:<ul>\n";
            foreach (
$GLOBALS['apiparams'][$func] as $param=>$desc)
                
$apidesc .= "<li>$param$desc</li>\n";
            
$apidesc .= "</ul>\n</th>\n";
            
$apidesc .= "</tr>\n<tr bgcolor='#ddffff'>\n<td colspan='2'>";
            
$apidesc .= "<p><b>Description:</b><br />";
            
$apidesc .= htmlspecialchars($doc)."</p>\n</td>\n</tr>\n";
            
$apidesc .= "</table>\n</td></tr></table>\n</td></tr>\n";
        }
        
$apidesc .= "</table></div>\n";
        
$content['body'] = $apidesc;
        
$content['timestamp'] = -1;
        
$content['page_img'] = 'MDB Web API:/images/api.png:/services/api/index.php';
        return 
$content
    }
/*}}}*/

    
require_once "dochandler.lib";

}
?>