--- nfo/site/htdocs/inc/cms/cms.php.inc 2004/09/06 00:15:28 1.5 +++ nfo/site/htdocs/inc/cms/cms.php.inc 2004/09/18 19:20:29 1.7 @@ -4,9 +4,60 @@ --- Content management functions include file. -------------------------------------------------------------------------------- --- rabit, 01:04 27.08.2004 ---- $Id: cms.php.inc,v 1.5 2004/09/06 00:15:28 rabit Exp $ +--- $Id: cms.php.inc,v 1.7 2004/09/18 19:20:29 rabit Exp $ ------------------------------------------------------------------------------*/ +//---------------------------------------------------------- +//- Declaration of CMS data sources: + +$i = 0; + +$cms_sources = array( + + 'SOURCES' => array( + 'fields' => array( + 'id' => '', + 'name' => '', + 'fieldcount' => '', + ), + 'index' => $i++ + ), + + 'contents' => array( + 'fields' => array( + 'id' => '', + 'creator_id' => '', + 'content' => '', + 'type' => '', + 'timestamp' => '', + 'description' => '', + 'keyname' => '', + 'language_id' => '' + ), + 'index' => $i++ + ), + + 'contenttypes' => array( + 'fields' => array( + 'id' => '', + 'name' => '' + ), + 'index' => $i++ + ), + + 'languages' => array( + 'fields' => array( + 'id' => '', + 'name' => '', + 'abbreviation' => '' + ), + 'index' => $i++ + ), + +); + +//------------------------------------------------------------------------------ + function cms_getcontent($type, $keyname, $language_id = 0) { $sql = "SELECT contents.content, contents.description, UNIX_TIMESTAMP(contents.timestamp), languages.name, users.name, contents.keyname FROM contents, languages, users WHERE contents.type='$type' AND contents.keyname='$keyname'" . ($language_id ? " AND languages.id='$language_id'" : '') . " AND users.id=contents.creator_id AND languages.id=contents.language_id LIMIT 0,1;"; @@ -31,7 +82,8 @@ //---------------------------------------------------------- -function cms_getlist($types, $keynames, $daterange = '', $languageids = '', $languages = '') { +function cms_getlist( + $types, $keynames, $daterange = '', $languageids = '', $languages = '') { $sql = "SELECT contents.id, contents.description, UNIX_TIMESTAMP(contents.timestamp), languages.id, languages.name, users.name FROM contents, languages, users WHERE contents.type='$types' AND contents.keyname='$keynames' AND users.id=contents.creator_id AND languages.id=contents.language_id;"; @@ -63,208 +115,607 @@ //---------------------------------------------------------- -function cms_query($querycmd, &$response) { +function cms_query($nqlquery, &$response) { + +global $cms_sources; //------------------ -$operationindices = array( - 'LIST' => 0, - 'GET' => 1 +$operations = array( + 'GET' => 0 ); //------------------ -$sourceindices = array( - 'contenttypes' => 0, - 'languages' => 1, - 'contents' => 2 -); + cms_preparsenqlquery($nqlquery, $preparseresponse); -//------------------ + $subsegcount = count($preparseresponse[1]);//['subsegmentcount']; + + $querydata = array( + 'count' => '', + 'fieldlist' => array(), + 'first' => '', + 'get_what' => '', + 'locked' => '', + 'operation' => '', + 'orderby' => '', + 'query' => $preparseresponse[0]['formattednql'], + 'source' => '', + 'with' => array(), + ); - $querycmd = str_replace("\r\n", ' ', $querycmd); - $querycmd = str_replace("\n", ' ', $querycmd); + if(!$querydata['query']) { - $querycmd = trim($querycmd); + $response = cms_create_response('no_query', null, null, $querydata); + return false; + + } + + $subseg = 0; + $querydata['operation'] = $preparseresponse[1][$subseg][0]; + $pcount = count($preparseresponse[1][$subseg++]); - $d1 = strpos($querycmd, ' '); - $operation = substr($querycmd, 0, $d1); + if($pcount != 1) { - if(isset($operationindices[$operation])) { + $response = cms_create_response('syntax', null, null, $querydata); + return false; + + } - $operationindex = $operationindices[$operation]; + if(isset($operations[$querydata['operation']])) { + + $operationindex = $operations[$querydata['operation']]; } else { - $response = cms_create_respose(1, null, null, null, $querycmd, $operation); + $response = cms_create_response('illegal_op', null, null, $querydata); + return false; + + } + + if($subseg == $subsegcount) { + $response = cms_create_response('no_params', null, null, $querydata); return false; } switch($operationindex) { - case 0: // "LIST" + case 0: // "GET" - $d2 = strpos($querycmd, ' WITH ', $d1 + 1); + $fieldlist = $preparseresponse[1][$subseg++]; + $pcount = count($fieldlist); - if($d2) { + if($subseg == $subsegcount) { - $source = substr($querycmd, $d1 + 1, $d2 - $d1 - 1); - $conditionlist = substr($querycmd, $d2 + 6); + $response = cms_create_response('no_sourcedef', null, null, $querydata); + return false; - } else { + } + + $querydata['get_what'] = $fieldlist[0]; + $querydata['fieldlist'] = array(); + + switch($querydata['get_what']) { + + case 'COUNT': + case 'FIELDNAMES': + case '*': + + if($pcount != 1) { + + $response = cms_create_response('syntax', null, null, $querydata); + return false; + + } + + break; + + case 'FROM': + + $response = cms_create_response('no_fielddef', null, null, $querydata); + return false; + + default: - $source = substr($querycmd, $d1 + 1); - $conditionlist = ''; + $querydata['fieldlist'] = $fieldlist; + $querydata['get_what'] = 'FIELD'; } - if(isset($sourceindices[$source])) { + $from = $preparseresponse[1][$subseg][0]; + $pcount = count($preparseresponse[1][$subseg++]); - $sourceindex = $sourceindices[$source]; + if($from != 'FROM') { - } else { + $response = cms_create_response('no_from', null, null, $querydata); + return false; + + } - $response = cms_create_respose(2, null, null, null, $querycmd, $operation, $source, $conditionlist); + if($pcount != 1) { + $response = cms_create_response('syntax', null, null, $querydata); return false; } - $sqlconditions = ''; + if($subseg == $subsegcount) { + + $response = cms_create_response('no_source', null, null, $querydata); + return false; + + } - if($conditionlist) { + $querydata['source'] = $preparseresponse[1][$subseg][0]; + $pcount = count($preparseresponse[1][$subseg++]); - $conditions = split(',', $conditionlist); + if($pcount != 1) { - $sqlconditions .= ' WHERE'; + $response = cms_create_response('syntax', null, null, $querydata); + return false; - for($c = 0; $c < count($conditions); $c++) { + } - list($conditionname, $conditionvalue) = split('=', $conditions[$c]); - $condition = trim($conditionname) . '=\'' . trim($conditionvalue) . '\''; - $sqlconditions .= ($c ? ' AND' : '') . ' ' . $condition; + if(isset($cms_sources[$querydata['source']])) { - } + $sourcedata = $cms_sources[$querydata['source']]; +// $sourceindex = $sourcedata['index']; + $sourcefields = $sourcedata['fields']; + + } else { + + $response = cms_create_response('illegal_source', null, null, $querydata); + return false; } - $sql = 'SELECT id FROM ' . $source . $sqlconditions . ';'; + if($querydata['get_what'] == 'FIELDNAMES' || $querydata['get_what'] == '*') { - $res = common_dbc_query($sql); + $querydata['fieldlist'] = array_keys($sourcedata['fields']); - $columnnames = array('id'); - $resultlist = array(); + } - while($row = mysql_fetch_row($res)) array_push($resultlist, $row); +$getparamdata = array( + 'WITH' => '', + 'FIRST' => '', + 'COUNT' => '', + 'ORDERBY' => '', + 'LOCKED' => '', +); +//$getparams = array_keys($getparamdata); - $response = cms_create_respose(0, $resultlist, $columnnames, 0, $querycmd, $operation, $source, $conditionlist); + $currentparam = 0; + $paramdata = $getparamdata; - return true; + while($subseg < $subsegcount) { - break; + $segment = $preparseresponse[1][$subseg++]; + $pcount = count($segment); + $param = $segment[0]; - case 1: // "GET" + if($pcount != 1) { - $d2 = strpos($querycmd, 'FROM') + 4; - $idlist = trim(substr($querycmd, $d1, $d2 - $d1 - 4)); - $source = trim(substr($querycmd, $d2)); + $response = cms_create_response('syntax', null, null, $querydata); + return false; - if(isset($sourceindices[$source])) { + } - $sourceindex = $sourceindices[$source]; + if(!isset($paramdata[$param])) { - } else { + $response = cms_create_response('illegal_param', null, null, $querydata); + return false; - $response = cms_create_respose(2, null, null, null, $querycmd, $operation, $source); + } else if($paramdata[$param]) { - return false; + $response = cms_create_response('double_param', null, null, $querydata); + return false; + + } + + $paramdata[$param] = true; + + switch($param) { + + case 'COUNT': + + if($subseg == $subsegcount) { + + $response = cms_create_response('param_value', null, null, $querydata); + return false; + + } + + if($subseg == $subsegcount) { + + $response = cms_create_response('param_value', null, null, $querydata); + return false; + + } + + $segment = $preparseresponse[1][$subseg++]; + $pcount = count($segment); + $count = $segment[0]; + + if($pcount != 1 || !is_numeric($count)) { + + $response = cms_create_response('syntax', null, null, $querydata); + return false; + + } + + $querydata['count'] = $count; + + break; + + case 'FIRST': + + if($subseg == $subsegcount) { + + $response = cms_create_response('param_value', null, null, $querydata); + return false; + + } + + if($subseg == $subsegcount) { + + $response = cms_create_response('param_value', null, null, $querydata); + return false; + + } + + $segment = $preparseresponse[1][$subseg++]; + $pcount = count($segment); + $first = $segment[0]; + + if($pcount != 1 || !is_numeric($first)) { + + $response = cms_create_response('syntax', null, null, $querydata); + return false; + + } + + $querydata['first'] = $first; + + break; + + case 'LOCKED': + + $querydata['locked'] = true; + + if($querydata['get_what'] == 'COUNT' || $querydata['get_what'] == 'FIELDNAMES') { + + $response = cms_create_response('locked', null, null, $querydata); + return false; + + } + + break; + + case 'ORDERBY': + + if($subseg == $subsegcount) { + + $response = cms_create_response('param_value', null, null, $querydata); + return false; + + } + + $segment = $preparseresponse[1][$subseg++]; + $pcount = count($segment); + $fieldname = $segment[0]; + + if($pcount != 1) { + + $response = cms_create_response('syntax', null, null, $querydata); + return false; + + } + + if(!isset($sourcefields[$fieldname])) { + + $response = cms_create_response('illegal_field', null, null, $querydata); + return false; + + } + + $querydata['orderby'] = $fieldname; + + break; + + case 'WITH': + + if($subseg == $subsegcount) { + + $response = cms_create_response('param_value', null, null, $querydata); + return false; + + } + + $segment = $preparseresponse[1][$subseg++]; + $pcount = count($segment); + $fieldname = $segment[0]; + + if($pcount != 1) { + + $response = cms_create_response('syntax', null, null, $querydata); + return false; + + } + + if(!isset($sourcefields[$fieldname])) { + + $response = cms_create_response('illegal_field', null, null, $querydata); + return false; + + } + + if($subseg == $subsegcount) { + + $response = cms_create_response('param_value', null, null, $querydata); + return false; + + } + + $fieldvalues = $preparseresponse[1][$subseg++]; + array_push($querydata['with'], array($fieldname, $fieldvalues)); + + break; + + } } - switch($sourceindex) { + return cms_perform_get($querydata, $response); - case 0: // "contenttypes" + } - $fieldlist = 'id, name'; - $columnnames = array('id', 'name'); +} - break; +//---------------------------------------------------------- - case 1: // "languages" +function cms_perform_get($querydata, &$response) { - $fieldlist = 'id, name, abbreviation'; - $columnnames = array('id', 'name', 'abbreviation'); +global $cms_sources; - break; + $sourcedata = $cms_sources[$querydata['source']]; + $sourcefields = $sourcedata['fields']; - case 2: // "contents" + for($f = 0; $f < count($querydata['fieldlist']); $f++) { - $fieldlist = 'id, keyname, type, creator_id, language_id, description, content'; - $columnnames = array('id', 'keyname', 'contenttype', 'creator_id', 'language_id', 'description', 'content'); + if(!isset($sourcefields[$querydata['fieldlist'][$f]])) { - break; + $response = cms_create_response('illegal_field', null, null, $querydata); + return false; + + } + + } + + $fieldnamelist = $querydata['fieldlist']; + $fieldnames = join($fieldnamelist, ', '); + + $resultlist = array(); + + if($querydata['get_what'] == 'COUNT') { + + $fieldnamelist = array('COUNT'); + + } + + if($querydata['get_what'] == 'FIELDNAMES') { + + $resultlist = null; + + } else switch($querydata['source']) { + + case 'SOURCES': + + if($querydata['get_what'] == 'COUNT') { + + $resultlist[0][0] = count($cms_sources); + break; } - $sqlconditions = ''; + while(list($key, $sourcedata) = each($cms_sources)) { - if($idlist) { + $row = array( + 'id' => $sourcedata['index'] + 1, + 'name' => $key, + 'fieldcount' => count($sourcedata['fields']), + ); - $ids = split(',', $idlist); + $resrow = array(); + reset($fieldnamelist); - $sqlconditions .= ' WHERE'; + while(list($i, $fieldname) = each($fieldnamelist)) + array_push($resrow, $row[$fieldname]); - for($i = 0; $i < count($ids); $i++) { + array_push($resultlist, $resrow); - $condition = ' id=\'' . intval(trim($ids[$i])) . '\''; - $sqlconditions .= ($i ? ' OR' : '') . $condition; + } - } + break; - } else { + // By default the db is used as data source: + default: + + if($querydata['get_what'] == 'COUNT') { - // ERROR + $fieldnames = 'COUNT(id)'; } - $sql = "SELECT $fieldlist FROM " . $source . $sqlconditions . ';'; + $limit = ( + (($querydata['count'] > 0) || ($querydata['first'] != '')) ? + ' LIMIT ' . ($querydata['first'] > 0 ? $querydata['first'] - 1 : 0) . ',' . + ($querydata['count'] > 0 ? $querydata['count'] : -1) : ''); + + $order = ( + $querydata['orderby'] != '' ? ' ORDER BY ' . $querydata['orderby'] . ' DESC' : ''); + + $where = ''; + + while(list($i, $item) = each($querydata['with'])) { + + $values = $item[1]; + + while(list($j, $value) = each($values)) + $where .= ($j ? ' OR' : '') . ' ' . $item[0] . '=\'' . $value . '\''; + + } + + if($where) $where = ' WHERE' . $where; + + $sql = 'SELECT ' . $fieldnames . ' FROM ' . $querydata['source'] . + $where . $order . $limit . ';'; + + #echo $sql; + $res = common_dbc_query($sql); - $resultlist = array(); - while($row = mysql_fetch_row($res)) array_push($resultlist, $row); + //if(!$res) ... - $response = cms_create_respose(0, $resultlist, $columnnames, 0, $querycmd, $operation, $source); -// $response = cms_create_respose(0, $resultlist, $columnnames, 0, $sql, $operation, $source); + while($resrow = mysql_fetch_row($res)) array_push($resultlist, $resrow); - return true; + } - break; + $response = cms_create_response('no_error', $resultlist, $fieldnamelist, $querydata); + return true; + +} + +//---------------------------------------------------------- + +function cms_preparsenqlquery($nqlquery, &$response) { + + $querysubsegs = preg_split('/[\s,]+/', $nqlquery, -1, + PREG_SPLIT_NO_EMPTY | PREG_SPLIT_OFFSET_CAPTURE); + + $segcount = count($querysubsegs); + + while(list($i, $item) = each($querysubsegs)) { + + $pos = $item[1]; + $querysubsegs[$i][2] = strlen($item[0]); + + if($i < ($segcount - 1)) { + + $endpos = $pos + $querysubsegs[$i][2]; + $delim = substr($nqlquery, $endpos, $querysubsegs[$i + 1][1] - $endpos); + + } else $delim = substr($nqlquery, $pos + $querysubsegs[$i][2]); + + array_push($querysubsegs[$i], trim($delim)); } + $i = 0; + + $formattednql = ''; + $preparseresult = array(); + $listitems = array(); + $lastitem = null; + $listcount = 0; + + while($i < $segcount) { + + $item = $querysubsegs[$i]; + $formattednql .= ($i ? ' ' : '') . $item[0]. $item[3]; + + if($item[3] == ',') { + + array_push($listitems, $item[0]); + + } else { + + if($listitems) { + + array_push($listitems, $item[0]); + array_push($preparseresult, $listitems); + $listitems = array(); + $listcount++; + + } else array_push($preparseresult, array($item[0])); + + } + +// $lastitem = $item; + $i++; + + } + + $response = array( + + array( + 'formattednql' => $formattednql, +// 'subsegmentcount' => $i, + 'sublistcount' => $listcount + ), + + $preparseresult + + ); + } //---------------------------------------------------------- -function cms_create_respose( - $errornumber, - $resultlist, - $columnnames, - $firstrow = 0, - $querycmd = '', - $operation = '', - $source = '', - $conditionlist = '' -) { +function cms_create_response( + $errorkey, $resultlist, $columnnames, $querydata) { //------------------ -$errortexts = array( - 0 => 'No error', - 1 => 'Unknown base operation', - 2 => 'Unknown data source name' +$i = 0; + +$errors = array( + 'no_error' => array( + $i++, 'No error' + ), + 'no_query' => array( + $i++, 'Empty query', + ), + 'syntax' => array( + $i++, 'Query syntax error', + ), + 'illegal_op' => array( + $i++, 'Illegal base operation', + ), + 'no_params' => array( + $i++, 'Operation parameters missing', + ), + 'no_fielddef' => array( + $i++, 'Field definition missing', + ), + 'no_sourcedef' => array( + $i++, 'Source definition missing', + ), + 'no_from' => array( + $i++, 'Source declarator missing', + ), + 'no_source' => array( + $i++, 'Source name missing', + ), + 'illegal_source' => array( + $i++, 'Illegal data source name', + ), + 'illegal_field' => array( + $i++, 'Illegal field name for data source', + ), + 'illegal_param' => array( + $i++, 'Illegal parameter name', + ), + 'double_param' => array( + $i++, 'Illegal double parameter', + ), + 'locked' => array( + $i++, 'Illegal use of LOCKED parameter', + ), + 'param_value' => array( + $i++, 'Parameter value missing', + ), ); //------------------ @@ -273,15 +724,16 @@ // Result information: 0 => array( - 'error' => $errornumber, - 'errortext' => $errortexts[$errornumber], - 'columncount' => (isset($columnnames) ? count($columnnames) : null), - 'firstrow' => $firstrow, + 'columncount' => count($columnnames), + 'error' => $errors[$errorkey][0], + 'errortext' => $errors[$errorkey][1], + 'firstrow' => $querydata['first'], + 'get_what' => $querydata['get_what'], + 'operation' => $querydata['operation'], + 'query' => $querydata['query'], 'rowcount' => count($resultlist), - 'querycmd' => $querycmd, - 'operation' => $operation, - 'source' => $source, - 'conditionlist' => $conditionlist + 'source' => $querydata['source'], + 'all' => $querydata ), // Result list: