From 582969915c9001f744a4e4cec974cd99651c0a94 Mon Sep 17 00:00:00 2001 From: "paul.baranowski" Date: Tue, 14 Sep 2010 17:34:50 -0400 Subject: [PATCH] Moved DataEngine functionality into BasicStor. Removed DataEngine. Fixed problem with Browse functionality due to case sensitivity. Added comments to BasicStor funcs. --- src/modules/htmlUI/var/ui_browse.class.php | 41 ++- src/modules/storageServer/var/BasicStor.php | 327 +++++++++++++++---- src/modules/storageServer/var/DataEngine.php | 311 ------------------ src/modules/storageServer/var/MetaData.php | 1 - 4 files changed, 286 insertions(+), 394 deletions(-) delete mode 100644 src/modules/storageServer/var/DataEngine.php diff --git a/src/modules/htmlUI/var/ui_browse.class.php b/src/modules/htmlUI/var/ui_browse.class.php index 4be845b22..baed19624 100644 --- a/src/modules/htmlUI/var/ui_browse.class.php +++ b/src/modules/htmlUI/var/ui_browse.class.php @@ -28,7 +28,7 @@ class uiBrowse * ['value'] --> an array of one value, the selected value * ['values']['cnt'] --> number of values * ['values']['results'] --> array of values, indexed numerically - * ['criteria'] --> criteria for one column, see top of DataEngine.php + * ['criteria'] --> criteria for one column, see top of BasicStor.php * for description of these values. The criteria of all three * columns are merged together to make $this->criteria. * ['form_value'] --> the value as used in the HTML form @@ -41,7 +41,7 @@ class uiBrowse * A pointer to the SESSION variable: ['UI_BROWSE_SESSNAME']['criteria'] * * This array ultimately is passed to DataEngine::localSearch(). Look - * at the top of the DataEngine.php class for the structure of this + * at the top of the BasicStor.php class for the structure of this * variable. * * @var array @@ -117,8 +117,8 @@ class uiBrowse * @return array */ public function getCriteria() - { - return $this->criteria; + { + return $this->criteria; } // fn getCriteria @@ -128,7 +128,7 @@ class uiBrowse public function getResult() { $this->searchDB(); - return $this->results; + return $this->results; } // fn getResult @@ -140,21 +140,21 @@ class uiBrowse if (isset($v['type']) && $v['type']) { $tmp = uiBase::formElementEncode($v['element']); $mask2['browse_columns']['category']['options'][$tmp] = tra($v['label']); - + } } } - + for ($n = 1; $n <= 3; $n++) { $form = new HTML_QuickForm('col'.$n, UI_STANDARD_FORM_METHOD, UI_HANDLER); $form->setConstants(array('id' => $id, 'col' => $n, 'category' => uiBase::formElementEncode($this->col[$n]['category']))); - + $mask2['browse_columns']['value']['options'] = $this->options($this->col[$n]['values']['results']); $mask2['browse_columns']['category']['attributes']['id'] = "category_" . $n; $mask2['browse_columns']['value']['attributes']['id'] = "category_value_" . $n; - + $mask2['browse_columns']['value']['default'] = $this->col[$n]['form_value']; uiBase::parseArrayToForm($form, $mask2['browse_columns']); $form->validate(); @@ -209,7 +209,7 @@ class uiBrowse // way too many values. $tmpCriteria["limit"] = 1000; $tmpCriteria["offset"] = 0; - + // For this column and all columns above this one, // reload the values. for ($i = $columnNumber; $i <= 3; $i++) { @@ -236,14 +236,11 @@ class uiBrowse * int ['col']: column number * string ['value'][0]: the search value for the given category * string ['category']: the category to search - * @see DataEngine - * See the top of that file for a description of the search - * criteria structure. */ public function setValue($p_param, $redirect="true") { $columnNumber = $p_param['col']; - $value = $p_param['value'][0]; + $value = $p_param['value'][0]; $category = $p_param['category']; $this->criteria['offset'] = 0; @@ -253,7 +250,7 @@ class uiBrowse unset($this->col[$columnNumber]['criteria']['conditions']); } else { $conditions = array('cat' => uiBase::formElementDecode($category), - 'op' => '=', + 'op' => '=', 'val' => $value); $this->col[$columnNumber]['criteria']['conditions'] = $conditions; } @@ -281,7 +278,7 @@ class uiBrowse $this->col[$tmpColNum]['values'] = $browseValues; } } - + if($redirect) { $this->Base->redirUrl = UI_BROWSER.'?act='.$this->prefix; } @@ -292,7 +289,7 @@ class uiBrowse 'col' => 1, 'category' => $p_param['cat1'] ); - + $value_1 = array( 'col' => 1, 'category' => $p_param['cat1'], @@ -300,12 +297,12 @@ class uiBrowse 0 => $p_param['val1'] ) ); - + $category_2 = array( 'col' => 2, 'category' => $p_param['cat2'] ); - + $value_2 = array( 'col' => 2, 'category' => $p_param['cat2'], @@ -313,7 +310,7 @@ class uiBrowse 0 => $p_param['val2'] ) ); - + $category_3 = array( 'col' => 3, 'category' => $p_param['cat3'] @@ -326,11 +323,11 @@ class uiBrowse 0 => $p_param['val3'] ) ); - + $this->setCategory($category_1, false); $this->setCategory($category_2, false); $this->setCategory($category_3, false); - + $this->setValue($value_1, false); $this->setValue($value_2, false); $this->setValue($value_3, true); diff --git a/src/modules/storageServer/var/BasicStor.php b/src/modules/storageServer/var/BasicStor.php index 5c909765b..f2b07d3d7 100644 --- a/src/modules/storageServer/var/BasicStor.php +++ b/src/modules/storageServer/var/BasicStor.php @@ -1,4 +1,42 @@ + * + *

+ * Format of search/browse results: hash, with following structure:
+ *

+ * + */ define('GBERR_DENY', 40); define('GBERR_FILEIO', 41); define('GBERR_FILENEX', 42); @@ -47,10 +85,16 @@ $g_metadata_xml_to_db_mapping = array( */ class BasicStor { public $storId; - + private $fileTypes; public function __construct() { + $this->filetypes = array( + 'all'=>NULL, + 'audioclip'=>'audioclip', + 'webstream'=>'webstream', + 'playlist'=>'playlist', + ); } @@ -175,9 +219,9 @@ class BasicStor { $res = BasicStor::RemoveObj($id, $forced); return $res; } - + $storedFile = StoredFile::Recall($id); - + if (is_null($storedFile) || PEAR::isError($storedFile)) { return $storedFile; } @@ -188,12 +232,12 @@ class BasicStor { } // move to trash: switch (BasicStor::GetObjType($id)) { - + case "audioclip": $playLists = $storedFile->getPlaylists(); $item_gunid = $storedFile->getGunid(); if( $playLists != NULL) { - + foreach($playLists as $key=>$val) { $playList_id = BasicStor::IdFromGunidBigInt($val["gunid"]); $playList_titles[] = BasicStor::bsGetMetadataValue($playList_id, "dc:title"); @@ -203,7 +247,7 @@ class BasicStor { ); } break; - + case "playlist": if($storedFile->isScheduled()) { return PEAR::raiseError( @@ -211,18 +255,18 @@ class BasicStor { ); } break; - + case "webstream": - + break; default: } - + $res = $storedFile->setState('deleted'); if (PEAR::isError($res)) { return $res; } - + return TRUE; } @@ -715,13 +759,9 @@ class BasicStor { * @param string $gunid * Virtual file's gunid, optional, used only if not * null, id is then ignored - * @param string $lang - * xml:lang value for select language version - * @param string $deflang - * xml:lang for default language * @return string|PEAR_Error */ - public function bsGetTitle($id, $gunid=NULL, $lang=NULL, $deflang=NULL) + public function bsGetTitle($id, $gunid=NULL) { if (is_null($gunid)) { $storedFile = StoredFile::Recall($id); @@ -731,41 +771,12 @@ class BasicStor { if (is_null($storedFile) || PEAR::isError($storedFile)) { return $storedFile; } -// $r = $storedFile->md->getMetadataValue('dc:title', $lang, $deflang); -// if (PEAR::isError($r)) { -// return $r; -// } $r = $storedFile->md["title"]; - $title = (isset($r[0]['value']) ? $r[0]['value'] : 'unknown'); + $title = (empty($r) ? 'unknown' : $r); return $title; } - /** - * Get metadata element value - * - * @param int $id - * Virtual file's local id - * @param string $category - * metadata element name - * @param string $lang - * xml:lang value for select language version - * @param string $deflang - * xml:lang for default language - * @return array - * array of matching records (as hash {id, value, attrs}) - * @see Metadata::getMetadataValue - */ -// public function bsGetMetadataValue($id, $category, $lang=NULL, $deflang=NULL) -// { -// $storedFile = StoredFile::Recall($id); -// if (PEAR::isError($storedFile)) { -// return $storedFile; -// } -// return $storedFile->md->getMetadataValue($category, $lang, $deflang); -// } - - /** * Get metadata element value * @@ -794,17 +805,22 @@ class BasicStor { } elseif (is_array($category)) { $values = array(); foreach ($category as $tmpCat) { -// $values[$tmpCat] = $storedFile->md->getMetadataValue($tmpCat); $values[$tmpCat] = $storedFile->md[$tmpCat]; } return $values; } else { -// return $storedFile->md->getMetadataValue($category); return $storedFile->md[$category]; } } + /** + * Convert XML name to database column name. Used for backwards compatibility + * with old code. + * + * @param string $p_category + * @return string|null + */ public static function xmlCategoryToDbColumn($p_category) { global $g_metadata_xml_to_db_mapping; @@ -815,10 +831,21 @@ class BasicStor { } + /** + * Convert database column name to XML name. + * + * @param string $p_dbColumn + * @return string|null + */ public static function dbColumnToXmlCatagory($p_dbColumn) { global $g_metadata_xml_to_db_mapping; - return array_search($p_dbColumn, $g_metadata_xml_to_db_mapping); + $str = array_search($p_dbColumn, $g_metadata_xml_to_db_mapping); + // make return value consistent with xmlCategoryToDbColumn() + if ($str === FALSE) { + $str = null; + } + return $str; } /** @@ -951,6 +978,50 @@ class BasicStor { return TRUE; } + /** + * Method returning array with where-parts of sql queries + * + * @param array $conditions + * See 'conditions' field in search criteria format + * definition in class documentation + * @return array + * array of strings - WHERE-parts of SQL queries + */ + private function _makeWhereArr($conditions) + { + $ops = array('full'=>"='%s'", 'partial'=>"ILIKE '%%%s%%'", + 'prefix'=>"ILIKE '%s%%'", '<'=>"< '%s'", '='=>"= '%s'", + '>'=>"> '%s'", '<='=>"<= '%s'", '>='=>">= '%s'" + ); + $whereArr = array(); + if (is_array($conditions)) { + foreach ($conditions as $cond) { + $columnName = BasicStor::xmlCategoryToDbColumn($cond['cat']); + $op = strtolower($cond['op']); + $value = $cond['val']; + if (!empty($value)) { + $splittedQn = XML_Util::splitQualifiedName($catQn); + $catNs = $splittedQn['namespace']; + $cat = $splittedQn['localPart']; + $opVal = sprintf($ops[$op], pg_escape_string($value)); + // retype for timestamp value + if ($cat == 'mtime') { + switch ($op) { + case 'partial': + case 'prefix': + break; + default: + $retype = "::timestamp with time zone"; + $opVal = "$retype $opVal$retype"; + } + } + $sqlCond = " {$columnName} {$opVal}\n"; + $whereArr[] = $sqlCond; + } + } + } + return $whereArr; + } /** * Search in local metadata database. @@ -1000,17 +1071,133 @@ class BasicStor { * creator: string - dc:creator from metadata * source: string - dc:source from metadata * length: string - dcterms:extent in extent format - * @see DataEngine */ public function bsLocalSearch($criteria, $limit=0, $offset=0) { - require_once("DataEngine.php"); - $de = new DataEngine($this); - $res = $de->localSearch($criteria, $limit, $offset); - if (PEAR::isError($res)) { - return $res; + global $CC_CONFIG, $CC_DBC; + + // Input values + $filetype = (isset($criteria['filetype']) ? $criteria['filetype'] : 'all'); + $filetype = strtolower($filetype); + if (!array_key_exists($filetype, $this->filetypes)) { + return PEAR::raiseError(__FILE__.":".__LINE__.': unknown filetype in search criteria'); } - return $res; + $filetype = $this->filetypes[$filetype]; + $operator = (isset($criteria['operator']) ? $criteria['operator'] : 'and'); + $operator = strtolower($operator); + $conditions = (isset($criteria['conditions']) ? $criteria['conditions'] : array()); + + // Create the WHERE clause - this is the actual search part + $whereArr = $this->_makeWhereArr($conditions); + + // Metadata values to fetch + $metadataNames = array('dc:creator', 'dc:source', 'ls:track_num', 'dc:title', 'dcterms:extent'); + + // Order by clause + $orderby = TRUE; + $orderByAllowedValues = array('dc:creator', 'dc:source', 'dc:title', 'dcterms:extent', "ls:track_num"); + $orderByDefaults = array('dc:creator', 'dc:source', 'dc:title'); + if ((!isset($criteria['orderby'])) + || (is_array($criteria['orderby']) && (count($criteria['orderby'])==0))) { + // default ORDER BY + // PaulB: track number removed because it doesnt work yet because + // if track_num is not an integer (e.g. bad metadata like "1/20", + // or if the field is blank) the SQL statement gives an error. + //$orderbyQns = array('dc:creator', 'dc:source', 'ls:track_num', 'dc:title'); + $orderbyQns = $orderByDefaults; + } else { + // ORDER BY clause is given in the parameters. + + // Convert the parameter to an array if it isnt already. + $orderbyQns = $criteria['orderby']; + if (!is_array($orderbyQns)) { + $orderbyQns = array($orderbyQns); + } + + // Check that it has valid ORDER BY values, if not, revert + // to the default ORDER BY values. + foreach ($orderbyQns as $metadataTag) { + if (!in_array($metadataTag, $orderByAllowedValues)) { + $orderbyQns = $orderByDefaults; + break; + } + } + } + + $descA = (isset($criteria['desc']) ? $criteria['desc'] : NULL); + if (!is_array($descA)) { + $descA = array($descA); + } + + $orderBySql = array(); + // $dataName contains the names of the metadata columns we want to + // fetch. It is indexed numerically starting from 1, and the value + // in the array is the qualified name with ":" replaced with "_". + // e.g. "dc:creator" becomes "dc_creator". + foreach ($orderbyQns as $xmlTag) { + $columnName = BasicStor::xmlCategoryToDbColumn($xmlTag); + $orderBySql[] = $columnName; + } + + // Build WHERE clause + $whereClause = " WHERE (state='ready' OR state='edited')"; + if (!is_null($filetype)) { + $whereClause .= " AND (ftype='$filetype')"; + } + if (count($whereArr) != 0) { + if ($operator == 'and') { + $whereClause .= " AND ((".join(") AND (", $whereArr)."))"; + } else { + $whereClause .= " AND ((".join(") OR (", $whereArr)."))"; + } + } + + // Final query + $sql = "SELECT * " + . " FROM ".$CC_CONFIG["filesTable"] + . $whereClause; + if ($orderby) { + $sql .= " ORDER BY ".join(",", $orderBySql); + } + + $_SESSION["debug"] = $sql; + + $countRowsSql = "SELECT COUNT(*) " + . " FROM ".$CC_CONFIG["filesTable"] + . $whereClause; + $cnt = $CC_DBC->GetOne($countRowsSql); + + // Get the number of results + if (PEAR::isError($cnt)) { + return $cnt; + } + + // Get actual results + $limitPart = ($limit != 0 ? " LIMIT $limit" : '' ). + ($offset != 0 ? " OFFSET $offset" : '' ); + $res = $CC_DBC->getAll($sql.$limitPart); + if (PEAR::isError($res)) { + return $res; + } + if (!is_array($res)) { + $res = array(); + } + $eres = array(); + foreach ($res as $it) { + $gunid = StoredFile::NormalizeGunid($it['gunid']); + $eres[] = array( + 'id' => $it['id'], + 'gunid' => $gunid, + 'type' => strtolower($it['ftype']), + 'title' => $it['track_title'], + 'creator' => $it['artist_name'], + 'duration' => $it['length'], + 'length' => $it['length'], + 'source' => $it['album_title'], + 'track_num' => $it['track_number'], + ); + } + return array('results'=>$eres, 'cnt'=>$cnt); } @@ -1029,13 +1216,33 @@ class BasicStor { * hash, fields: * results : array with found values * cnt : integer - number of matching values - * @see DataEngine */ public function bsBrowseCategory($category, $limit=0, $offset=0, $criteria=NULL) { - require_once("DataEngine.php"); - $de = new DataEngine($this); - return $de->browseCategory($category, $limit, $offset, $criteria); + global $CC_CONFIG, $CC_DBC; + $category = strtolower($category); + $columnName = BasicStor::xmlCategoryToDbColumn($category); + if (is_null($columnName)) { + return new PEAR_Error(__FILE__.":".__LINE__." -- could not map XML category to DB column."); + } + $sql = "SELECT DISTINCT $columnName FROM ".$CC_CONFIG["filesTable"]; + $limitPart = ($limit != 0 ? " LIMIT $limit" : '' ). + ($offset != 0 ? " OFFSET $offset" : '' ); + $countRowsSql = "SELECT COUNT(DISTINCT $columnName) FROM ".$CC_CONFIG["filesTable"]; + + //$_SESSION["debug"] = $sql; + $cnt = $CC_DBC->GetOne($countRowsSql); + if (PEAR::isError($cnt)) { + return $cnt; + } + $res = $CC_DBC->getCol($sql.$limitPart); + if (PEAR::isError($res)) { + return $res; + } + if (!is_array($res)) { + $res = array(); + } + return array('results'=>$res, 'cnt'=>$cnt); } @@ -1585,7 +1792,7 @@ class BasicStor { global $CC_CONFIG; return $CC_DBC->getOne("SELECT id FROM ".$CC_CONFIG['filesTable']." WHERE gunid=x'$p_gunid'::bigint"); } - + /** * Get local id from global id (big int). * diff --git a/src/modules/storageServer/var/DataEngine.php b/src/modules/storageServer/var/DataEngine.php deleted file mode 100644 index 899c8f57d..000000000 --- a/src/modules/storageServer/var/DataEngine.php +++ /dev/null @@ -1,311 +0,0 @@ - - * - *

- * Format of search/browse results: hash, with following structure:
- *

- * - * @package Campcaster - * @subpackage StorageServer - * @copyright 2010 Sourcefabric O.P.S. - * @license http://www.gnu.org/licenses/gpl.txt - */ -class DataEngine { - - /** - * Constructor - * - * @param BasicStor $gb - */ - public function __construct(&$gb) - { - $this->gb =& $gb; - $this->filetypes = array( - 'all'=>NULL, - 'audioclip'=>'audioclip', - 'webstream'=>'webstream', - 'playlist'=>'playlist', - ); - } - - - /** - * Method returning array with where-parts of sql queries - * - * @param array $conditions - * See 'conditions' field in search criteria format - * definition in DataEngine class documentation - * @return array - * array of strings - WHERE-parts of SQL queries - */ - private function _makeWhereArr($conditions) - { - $ops = array('full'=>"='%s'", 'partial'=>"ILIKE '%%%s%%'", - 'prefix'=>"ILIKE '%s%%'", '<'=>"< '%s'", '='=>"= '%s'", - '>'=>"> '%s'", '<='=>"<= '%s'", '>='=>">= '%s'" - ); - $whereArr = array(); - if (is_array($conditions)) { - foreach ($conditions as $cond) { - $columnName = BasicStor::xmlCategoryToDbColumn($cond['cat']); - $op = strtolower($cond['op']); - $value = strtolower($cond['val']); - if (!empty($value)) { - $splittedQn = XML_Util::splitQualifiedName($catQn); - $catNs = $splittedQn['namespace']; - $cat = $splittedQn['localPart']; - $opVal = sprintf($ops[$op], pg_escape_string($value)); - // retype for timestamp value - if ($cat == 'mtime') { - switch ($op) { - case 'partial': - case 'prefix': - break; - default: - $retype = "::timestamp with time zone"; - $opVal = "$retype $opVal$retype"; - } - } - $sqlCond = " {$columnName} {$opVal}\n"; - $whereArr[] = $sqlCond; - } - } - } - return $whereArr; - } - - - /** - * Search in local metadata database. - * - * @param array $cri - * Search criteria see DataEngine class documentation - * @param int $limit - * Limit for result arrays (0 means unlimited) - * @param int $offset - * Starting point (0 means without offset) - * @return array - * arrays of hashes, fields: - * cnt : integer - number of matching gunids - * of files have been found - * results : array of hashes: - * gunid: string - * type: string - audioclip | playlist | webstream - * title: string - dc:title from metadata - * creator: string - dc:creator from metadata - * source: string - dc:source from metadata - * length: string - dcterms:extent in extent format - * OR (in browse mode) - * results: array of strings - browsed values - */ - public function localSearch($criteria, $limit=0, $offset=0) - { - global $CC_CONFIG, $CC_DBC; - - // Input values - $filetype = (isset($criteria['filetype']) ? $criteria['filetype'] : 'all'); - $filetype = strtolower($filetype); - if (!array_key_exists($filetype, $this->filetypes)) { - return PEAR::raiseError( - 'DataEngine::_localGenSearch: unknown filetype in search criteria' - ); - } - $filetype = $this->filetypes[$filetype]; - $operator = (isset($criteria['operator']) ? $criteria['operator'] : 'and'); - $operator = strtolower($operator); - $conditions = (isset($criteria['conditions']) ? $criteria['conditions'] : array()); - - // Create the WHERE clause - this is the actual search part - $whereArr = $this->_makeWhereArr($conditions); - - // Metadata values to fetch - $metadataNames = array('dc:creator', 'dc:source', 'ls:track_num', 'dc:title', 'dcterms:extent'); - - // Order by clause - $orderby = TRUE; - $orderByAllowedValues = array('dc:creator', 'dc:source', 'dc:title', 'dcterms:extent', "ls:track_num"); - $orderByDefaults = array('dc:creator', 'dc:source', 'dc:title'); - if ((!isset($criteria['orderby'])) - || (is_array($criteria['orderby']) && (count($criteria['orderby'])==0))) { - // default ORDER BY - // PaulB: track number removed because it doesnt work yet because - // if track_num is not an integer (e.g. bad metadata like "1/20", - // or if the field is blank) the SQL statement gives an error. - //$orderbyQns = array('dc:creator', 'dc:source', 'ls:track_num', 'dc:title'); - $orderbyQns = $orderByDefaults; - } else { - // ORDER BY clause is given in the parameters. - - // Convert the parameter to an array if it isnt already. - $orderbyQns = $criteria['orderby']; - if (!is_array($orderbyQns)) { - $orderbyQns = array($orderbyQns); - } - - // Check that it has valid ORDER BY values, if not, revert - // to the default ORDER BY values. - foreach ($orderbyQns as $metadataTag) { - if (!in_array($metadataTag, $orderByAllowedValues)) { - $orderbyQns = $orderByDefaults; - break; - } - } - } - - $descA = (isset($criteria['desc']) ? $criteria['desc'] : NULL); - if (!is_array($descA)) { - $descA = array($descA); - } - - $orderBySql = array(); - // $dataName contains the names of the metadata columns we want to - // fetch. It is indexed numerically starting from 1, and the value - // in the array is the qualified name with ":" replaced with "_". - // e.g. "dc:creator" becomes "dc_creator". - foreach ($orderbyQns as $xmlTag) { - $columnName = BasicStor::xmlCategoryToDbColumn($xmlTag); - $orderBySql[] = $columnName; - } - - // Build WHERE clause - $whereClause = " WHERE (state='ready' OR state='edited')"; - if (!is_null($filetype)) { - $whereClause .= " AND (ftype='$filetype')"; - } - if (count($whereArr) != 0) { - if ($operator == 'and') { - $whereClause .= " AND ((".join(") AND (", $whereArr)."))"; - } else { - $whereClause .= " AND ((".join(") OR (", $whereArr)."))"; - } - } - - // Final query - $sql = "SELECT * " - . " FROM ".$CC_CONFIG["filesTable"] - . $whereClause; - if ($orderby) { - $sql .= " ORDER BY ".join(",", $orderBySql); - } - - $countRowsSql = "SELECT COUNT(*) " - . " FROM ".$CC_CONFIG["filesTable"] - . $whereClause; - $cnt = $CC_DBC->GetOne($countRowsSql); - - // Get the number of results - if (PEAR::isError($cnt)) { - return $cnt; - } - - // Get actual results - $limitPart = ($limit != 0 ? " LIMIT $limit" : '' ). - ($offset != 0 ? " OFFSET $offset" : '' ); - $res = $CC_DBC->getAll($sql.$limitPart); - if (PEAR::isError($res)) { - return $res; - } - if (!is_array($res)) { - $res = array(); - } - $eres = array(); - foreach ($res as $it) { - $gunid = StoredFile::NormalizeGunid($it['gunid']); - $eres[] = array( - 'id' => $it['id'], - 'gunid' => $gunid, - 'type' => strtolower($it['ftype']), - 'title' => $it['track_title'], - 'creator' => $it['artist_name'], - 'duration' => $it['length'], - 'length' => $it['length'], - 'source' => $it['album_title'], - 'track_num' => $it['track_number'], - ); - } - return array('results'=>$eres, 'cnt'=>$cnt); - } - - - /** - * Return values of specified metadata category - * - * @param string $category - * metadata category name, with or without namespace prefix - * (dc:title, author) - * @param int $limit - * limit for result arrays (0 means unlimited) - * @param int $offset - * starting point (0 means without offset) - * @param array $criteria - * @return array - * hash, fields: - * results : array with found values - * cnt : integer - number of matching values - */ - public function browseCategory($category, $limit=0, $offset=0, $criteria=NULL) - { - global $CC_CONFIG, $CC_DBC; - $category = strtolower($category); - $columnName = BasicStor::xmlCategoryToDbColumn($category); - if (is_null($columnName)) { - return new PEAR_Error("DataEngine::browseCategory() -- could not map XML category to DB column."); - } - $sql = "SELECT DISTINCT $columnName FROM ".$CC_CONFIG["filesTable"]; - $limitPart = ($limit != 0 ? " LIMIT $limit" : '' ). - ($offset != 0 ? " OFFSET $offset" : '' ); - $countRowsSql = "SELECT COUNT(DISTINCT $columnName) FROM ".$CC_CONFIG["filesTable"]; - - $cnt = $CC_DBC->GetOne($countRowsSql); - if (PEAR::isError($cnt)) { - return $cnt; - } - $res = $CC_DBC->getCol($sql.$limitPart); - if (PEAR::isError($res)) { - return $res; - } - if (!is_array($res)) { - $res = array(); - } - return array('results'=>$res, 'cnt'=>$cnt); - } - - -} // class DataEngine - -?> \ No newline at end of file diff --git a/src/modules/storageServer/var/MetaData.php b/src/modules/storageServer/var/MetaData.php index 628d9d8ef..d1338be39 100644 --- a/src/modules/storageServer/var/MetaData.php +++ b/src/modules/storageServer/var/MetaData.php @@ -15,7 +15,6 @@ require_once("XML/Util.php"); * @license http://www.gnu.org/licenses/gpl.txt * @see StoredFile * @see XmlParser - * @see DataEngine */ class MetaData {