From 3f8ecd96c29e95701247317ddd0372cc00e4e6ac Mon Sep 17 00:00:00 2001 From: rylon Date: Sun, 4 Aug 2013 18:13:39 +0200 Subject: [PATCH] new api with: optional parameters, multiple querytrees per database, oneline command, no "new" commands anymore, everything is static now, no more seperate pageapi, renames --- api/{Api.php => Api.old.php} | 0 api/api.php | 152 ++++++++++++++++++++++ page/PageClass.php => api/api_default.php | 4 +- api/{apiloginclass.php => api_login.php} | 2 +- api/apiclass.php | 5 - system/verifyclass.php => api/verify.php | 4 +- dbd/tbl/APITable.php | 24 ++-- page/PageApi.php | 133 ------------------- 8 files changed, 170 insertions(+), 154 deletions(-) rename api/{Api.php => Api.old.php} (100%) create mode 100644 api/api.php rename page/PageClass.php => api/api_default.php (67%) rename api/{apiloginclass.php => api_login.php} (97%) delete mode 100644 api/apiclass.php rename system/verifyclass.php => api/verify.php (96%) delete mode 100644 page/PageApi.php diff --git a/api/Api.php b/api/Api.old.php similarity index 100% rename from api/Api.php rename to api/Api.old.php diff --git a/api/api.php b/api/api.php new file mode 100644 index 0000000..832b4b2 --- /dev/null +++ b/api/api.php @@ -0,0 +1,152 @@ +$item[\SYSTEM\DBD\APITable::FIELD_VERIFY]($params[$item[\SYSTEM\DBD\APITable::FIELD_NAME]])){ + throw new \SYSTEM\LOG\ERROR('Parameter type missmacht or Missing Verifier. Param: '.$item[\SYSTEM\DBD\APITable::FIELD_NAME].' Verifier: '.$item[\SYSTEM\DBD\APITable::FIELD_VERIFY]);} + + $parameters_opt[] = array($item, $params[$item[\SYSTEM\DBD\APITable::FIELD_NAME]]); + } + } + + //strict check + if( $strict && + count($params) != (count($parameters) + count($commands)) ){ + throw new \SYSTEM\LOG\ERROR('Unhandled or misshandled parameters - api query is invalid');} + + //Function Name + $call_funcname = ""; + foreach($commands as $com){ + if(!\preg_match('^[0-9A-Za-z_]+$^', $com[1])){ + throw new \SYSTEM\LOG\ERROR('Call Command can only have letters!');} + + if($com[0][\SYSTEM\DBD\APITable::FIELD_TYPE] == \SYSTEM\DBD\APITable::VALUE_TYPE_COMMAND_FLAG){ + $call_funcname .= '_flag_'.$com[0][\SYSTEM\DBD\APITable::FIELD_NAME]; + } else { + $call_funcname .= '_'.$com[0][\SYSTEM\DBD\APITable::FIELD_NAME].'_'.\strtolower($com[1]);} + } + $call_funcname = substr($call_funcname, 1); //strip leading _ + + //Function parameters + $call_funcparam = array(); + foreach($parameters as $param){ + $call_funcparam[] = $param[1];} + + //Optional Function Parameters + foreach($parameters_opt as $param){ + $call_funcparam[] = $param[1];} + + //Does function exist + if(!\method_exists($apiclassname, $call_funcname)){ + if($default){ + return \call_user_func(array($apiclassname,'default_page'));} + throw new \SYSTEM\LOG\ERROR("API call is not implemented in API: ".$call_funcname);} + + //Call Function + return \call_user_func_array(array($apiclassname,$call_funcname),$call_funcparam); + } + + private static function getApiTree($group){ + $con = new \SYSTEM\DB\Connection(\SYSTEM\system::getSystemDBInfo()); + if(\SYSTEM\system::isSystemDbInfoPG()){ + $res = $con->query('SELECT * FROM '.\SYSTEM\DBD\APITable::NAME_PG .' WHERE `'.\SYSTEM\DBD\APITable::FIELD_GROUP.'` = '.$group.' ORDER BY "'.\SYSTEM\DBD\APITable::FIELD_ID.'"'); + } else { + $res = $con->query('SELECT * FROM '.\SYSTEM\DBD\APITable::NAME_MYS.' WHERE `'.\SYSTEM\DBD\APITable::FIELD_GROUP.'` = '.$group.' ORDER BY '.\SYSTEM\DBD\APITable::FIELD_ID); + } + + if(!$res){ + throw new \SYSTEM\LOG\ERROR('Database Error '.pg_last_error($con));} + + $result = array(); + while($row = $res->next()){ + $result[] = $row;} + + return $result; + } +} \ No newline at end of file diff --git a/page/PageClass.php b/api/api_default.php similarity index 67% rename from page/PageClass.php rename to api/api_default.php index 61f39fa..fb02279 100644 --- a/page/PageClass.php +++ b/api/api_default.php @@ -1,8 +1,8 @@ 0 ? true : false) : false;} public static function INT ($param) {return \is_numeric($param);} diff --git a/dbd/tbl/APITable.php b/dbd/tbl/APITable.php index 881e54d..c2733cf 100644 --- a/dbd/tbl/APITable.php +++ b/dbd/tbl/APITable.php @@ -4,17 +4,19 @@ namespace SYSTEM\DBD; class APITable { - const NAME_PG = 'system.api_calls'; - const NAME_MYS = 'system_api_calls'; + const NAME_PG = 'system.api'; + const NAME_MYS = 'system_api'; - const FIELD_ID = 'ID'; - const FIELD_FLAG = 'flag'; - const FIELD_PARENTID = 'parentID'; - const FIELD_PARENTVALUE = 'parentValue'; - const FIELD_NAME = 'name'; - // const FIELD_ISCHACHED = 'IsCached'; use flagfield! - const FIELD_ALLOWEDVALUES = 'allowedValues'; + const FIELD_ID = 'ID'; + const FIELD_GROUP = 'group'; + const FIELD_TYPE = 'type'; + const FIELD_PARENTID = 'parentID'; + const FIELD_PARENTVALUE = 'parentValue'; + const FIELD_NAME = 'name'; + const FIELD_VERIFY = 'verify'; - const VALUE_FLAG_COMMAND = 0; - const VALUE_FLAG_PARAM = 1; + const VALUE_TYPE_COMMAND = 0; + const VALUE_TYPE_COMMAND_FLAG = 1; + const VALUE_TYPE_PARAM = 2; + const VALUE_TYPE_PARAM_OPT = 3; } \ No newline at end of file diff --git a/page/PageApi.php b/page/PageApi.php deleted file mode 100644 index 6b8f20e..0000000 --- a/page/PageApi.php +++ /dev/null @@ -1,133 +0,0 @@ -m_dbinfo = $DBInfo == null ? \SYSTEM\system::getSystemDBInfo() : $DBInfo; - $this->m_verifyclass = $VerifyClass; - $this->m_pageclass = $PageClass; - } - - // $call = post + get params - // returns resultstring - public function CALL($call = array()){ - //Get the Databasetree - $tree = array(); - if($this->m_dbinfo instanceof \SYSTEM\DB\DBInfo){ - $tree = self::getPageTree();} - else { - if(!is_array($this->m_dbinfo)){ - throw new \SYSTEM\LOG\ERROR('No Connectioninfo and no call table given to the api');} - $tree = $this->m_dbinfo; - } - - //Commands - $commands = array(); - $parentid = -1; - foreach($tree as $item){ - if( $item[\SYSTEM\DBD\PAGETable::FIELD_FLAG] == \SYSTEM\DBD\PAGETable::VALUE_FLAG_COMMAND && - $item[\SYSTEM\DBD\PAGETable::FIELD_PARENTID] == $parentid && - isset($call[$item[\SYSTEM\DBD\PAGETable::FIELD_NAME]])){ - - if( isset($item[\SYSTEM\DBD\PAGETable::FIELD_PARENTVALUE]) && - $commands[count($commands)-1][1] != $item[\SYSTEM\DBD\PAGETable::FIELD_PARENTVALUE]){ - continue;} - $commands[] = array($item,$call[$item[\SYSTEM\DBD\PAGETable::FIELD_NAME]]); - $parentid = $item[\SYSTEM\DBD\PAGETable::FIELD_ID]; - } - } - - //Parameters - $command_call = ''; - $parameters = array(); - if(count($commands) > 0){ - $lastCommand = $commands[count($commands) -1 ][0]; - foreach($tree as $item){ - if( $item[\SYSTEM\DBD\PAGETable::FIELD_FLAG] == \SYSTEM\DBD\PAGETable::VALUE_FLAG_PARAM && - $item[\SYSTEM\DBD\PAGETable::FIELD_PARENTID] == $lastCommand[\SYSTEM\DBD\PAGETable::FIELD_ID]){ - - if( isset($item[\SYSTEM\DBD\PAGETable::FIELD_PARENTVALUE]) && - $commands[count($commands)-1][1] != $item[\SYSTEM\DBD\PAGETable::FIELD_PARENTVALUE]){ - continue;} - - if(!isset($call[$item[\SYSTEM\DBD\PAGETable::FIELD_NAME]])){ - throw new \SYSTEM\LOG\ERROR('Parameter missing: '.$item[\SYSTEM\DBD\PAGETable::FIELD_NAME]);} - - - if( !method_exists($this->m_verifyclass, $item[\SYSTEM\DBD\PAGETable::FIELD_ALLOWEDVALUES]) || - !$this->m_verifyclass->$item[\SYSTEM\DBD\PAGETable::FIELD_ALLOWEDVALUES]($call[$item[\SYSTEM\DBD\PAGETable::FIELD_NAME]])){ - throw new \SYSTEM\LOG\ERROR('Parameter type missmacht or Missing Verifier. Param: '.$item[\SYSTEM\DBD\PAGETable::FIELD_NAME].' Verifier: '.$item[\SYSTEM\DBD\PAGETable::FIELD_ALLOWEDVALUES]);} - - $parameters[] = array($item, $call[$item[\SYSTEM\DBD\PAGETable::FIELD_NAME]]); - } - } - - //Function Name - foreach($commands as $com){ - if(!\preg_match('^[0-9A-Za-z_]+$^', $com[1])){ - throw new \SYSTEM\LOG\ERROR("Call Command can only have letters!");} - - if($com[0][\SYSTEM\DBD\PAGETable::FIELD_ALLOWEDVALUES] == 'FLAG'){ - $command_call .= '_flag_'.$com[0][\SYSTEM\DBD\PAGETable::FIELD_NAME]; - } else { - $command_call .= '_'.$com[0][\SYSTEM\DBD\PAGETable::FIELD_NAME].'_'.\strtolower($com[1]);} - } - $command_call = substr($command_call, 1); - } - - $command_call = $command_call == '' ? 'default_page': $command_call; - - //Function parameters - $parameter_call = array(); - if(count($parameters) > 0){ - foreach($parameters as $param){ - $parameter_call[] = $param[1];} - } - - if(!\method_exists($this->m_pageclass, $command_call)){ - throw new \SYSTEM\LOG\ERROR("Page call is not implemented in PageApi: ".$command_call);} - - //Call Function - return \call_user_func_array(array($this->m_pageclass,$command_call),$parameter_call); - } - - private function getPageTree(){ - - $con = new \SYSTEM\DB\Connection($this->m_dbinfo); - $res = $con->query('SELECT * FROM '.(\SYSTEM\system::isSystemDbInfoPG() ? \SYSTEM\DBD\PAGETable::NAME_PG : \SYSTEM\DBD\PAGETable::NAME_MYS).' ORDER BY "'.\SYSTEM\DBD\PAGETable::FIELD_ID.'"'); - - if(!$res){ - throw new \SYSTEM\LOG\ERROR("Database Error ". pg_last_error());} - - $result = array(); - while($row = $res->next()){ - $result[] = $row;} - - return $result; - } -} \ No newline at end of file