--- nfo/site/htdocs/inc/cms/cms.php.inc 2004/08/31 09:42:06 1.4 +++ 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.4 2004/08/31 09:42:06 joko 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,11 +82,12 @@ //---------------------------------------------------------- -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;"; - $res = mysql_query($sql); + $res = common_dbc_query($sql); $rowcount = 0; @@ -49,14 +101,9 @@ function cms_getindex($type) { - $sql = " -SELECT contents.id, contents.keyname, contents.description, - UNIX_TIMESTAMP(contents.timestamp) as timestamp, languages.id, - languages.name as lang, users.name as creator -FROM contents, languages, users -WHERE contents.type='$type' AND users.id=contents.creator_id AND languages.id=contents.language_id;"; + $sql = "SELECT contents.id, contents.keyname, contents.description, UNIX_TIMESTAMP(contents.timestamp) as timestamp, languages.id, languages.name as lang, users.name as creator FROM contents, languages, users WHERE contents.type='$type' AND users.id=contents.creator_id AND languages.id=contents.language_id;"; - $res = mysql_query($sql); + $res = common_dbc_query($sql); $rowcount = 0; @@ -68,6 +115,639 @@ //---------------------------------------------------------- +function cms_query($nqlquery, &$response) { + +global $cms_sources; + +//------------------ + +$operations = array( + 'GET' => 0 +); + +//------------------ + + 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(), + ); + + if(!$querydata['query']) { + + $response = cms_create_response('no_query', null, null, $querydata); + return false; + + } + + $subseg = 0; + $querydata['operation'] = $preparseresponse[1][$subseg][0]; + $pcount = count($preparseresponse[1][$subseg++]); + + if($pcount != 1) { + + $response = cms_create_response('syntax', null, null, $querydata); + return false; + + } + + if(isset($operations[$querydata['operation']])) { + + $operationindex = $operations[$querydata['operation']]; + + } else { + + $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: // "GET" + + $fieldlist = $preparseresponse[1][$subseg++]; + $pcount = count($fieldlist); + + if($subseg == $subsegcount) { + + $response = cms_create_response('no_sourcedef', null, null, $querydata); + return false; + + } + + $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: + + $querydata['fieldlist'] = $fieldlist; + $querydata['get_what'] = 'FIELD'; + + } + + $from = $preparseresponse[1][$subseg][0]; + $pcount = count($preparseresponse[1][$subseg++]); + + if($from != 'FROM') { + + $response = cms_create_response('no_from', null, null, $querydata); + return false; + + } + + if($pcount != 1) { + + $response = cms_create_response('syntax', null, null, $querydata); + return false; + + } + + if($subseg == $subsegcount) { + + $response = cms_create_response('no_source', null, null, $querydata); + return false; + + } + + $querydata['source'] = $preparseresponse[1][$subseg][0]; + $pcount = count($preparseresponse[1][$subseg++]); + + if($pcount != 1) { + + $response = cms_create_response('syntax', null, null, $querydata); + return false; + + } + + 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; + + } + + if($querydata['get_what'] == 'FIELDNAMES' || $querydata['get_what'] == '*') { + + $querydata['fieldlist'] = array_keys($sourcedata['fields']); + + } + +$getparamdata = array( + 'WITH' => '', + 'FIRST' => '', + 'COUNT' => '', + 'ORDERBY' => '', + 'LOCKED' => '', +); +//$getparams = array_keys($getparamdata); + + $currentparam = 0; + $paramdata = $getparamdata; + + while($subseg < $subsegcount) { + + $segment = $preparseresponse[1][$subseg++]; + $pcount = count($segment); + $param = $segment[0]; + + if($pcount != 1) { + + $response = cms_create_response('syntax', null, null, $querydata); + return false; + + } + + if(!isset($paramdata[$param])) { + + $response = cms_create_response('illegal_param', null, null, $querydata); + return false; + + } else if($paramdata[$param]) { + + $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; + + } + + } + + return cms_perform_get($querydata, $response); + + } + +} + +//---------------------------------------------------------- + +function cms_perform_get($querydata, &$response) { + +global $cms_sources; + + $sourcedata = $cms_sources[$querydata['source']]; + $sourcefields = $sourcedata['fields']; + + for($f = 0; $f < count($querydata['fieldlist']); $f++) { + + if(!isset($sourcefields[$querydata['fieldlist'][$f]])) { + + $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; + + } + + while(list($key, $sourcedata) = each($cms_sources)) { + + $row = array( + 'id' => $sourcedata['index'] + 1, + 'name' => $key, + 'fieldcount' => count($sourcedata['fields']), + ); + + $resrow = array(); + reset($fieldnamelist); + + while(list($i, $fieldname) = each($fieldnamelist)) + array_push($resrow, $row[$fieldname]); + + array_push($resultlist, $resrow); + + } + + break; + + // By default the db is used as data source: + default: + + if($querydata['get_what'] == 'COUNT') { + + $fieldnames = 'COUNT(id)'; + + } + + $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); + + //if(!$res) ... + + while($resrow = mysql_fetch_row($res)) array_push($resultlist, $resrow); + + } + + $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_response( + $errorkey, $resultlist, $columnnames, $querydata) { + +//------------------ + +$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', + ), +); + +//------------------ + + $response = array( + + // Result information: + 0 => array( + '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), + 'source' => $querydata['source'], + 'all' => $querydata + ), + + // Result list: + 1 => $resultlist, + + // Column names: + 2 => $columnnames + + ); + + return $response; + +} + //------------------------------------------------------------------------------ ?>